5
#ifdef ENABLE_SYSTEMD_DBUS
6
#include <systemd/sd-bus.h>
7
8
-#define SYSTEMD_UNITS_MAX_PARAMS 10
9
-#define SYSTEMD_UNITS_DBUS_TYPES "(ssssssouso)"
8
+#define ND_SD_UNITS_MAX_PARAMS 10
9
+#define ND_SD_UNITS_DBUS_TYPES "(ssssssouso)"
10
11
// ----------------------------------------------------------------------------
12
// copied from systemd: string-table.h
13
14
typedef char sd_char;
15
-#define XCONCATENATE(x, y) x ## y
15
+#define XCONCATENATE(x, y) x##y
16
#define CONCATENATE(x, y) XCONCATENATE(x, y)
17
18
#ifndef __COVERITY__
19
-# define VOID_0 ((void)0)
19
+#define VOID_0 ((void)0)
20
#else
21
-# define VOID_0 ((void*)0)
21
+#define VOID_0 ((void *)0)
22
#endif
23
24
-#define ELEMENTSOF(x) \
25
- (__builtin_choose_expr( \
26
- !__builtin_types_compatible_p(typeof(x), typeof(&*(x))), \
27
- sizeof(x)/sizeof((x)[0]), \
28
- VOID_0))
24
+#define ELEMENTSOF(x) \
25
+ (__builtin_choose_expr(!__builtin_types_compatible_p(typeof(x), typeof(&*(x))), sizeof(x) / sizeof((x)[0]), VOID_0))
26
27
#define UNIQ_T(x, uniq) CONCATENATE(__unique_prefix_, CONCATENATE(x, uniq))
28
#define UNIQ __COUNTER__
32
-#define __CMP(aq, a, bq, b) \
33
- ({ \
34
- const typeof(a) UNIQ_T(A, aq) = (a); \
35
- const typeof(b) UNIQ_T(B, bq) = (b); \
36
- UNIQ_T(A, aq) < UNIQ_T(B, bq) ? -1 : \
37
- UNIQ_T(A, aq) > UNIQ_T(B, bq) ? 1 : 0; \
38
- })
29
+#define __CMP(aq, a, bq, b) \
30
+ ({ \
31
+ const typeof(a) UNIQ_T(A, aq) = (a); \
32
+ const typeof(b) UNIQ_T(B, bq) = (b); \
33
+ UNIQ_T(A, aq)<UNIQ_T(B, bq) ? -1 : UNIQ_T(A, aq)> UNIQ_T(B, bq) ? 1 : 0; \
34
+ })
35
#define CMP(a, b) __CMP(UNIQ, (a), UNIQ, (b))
36
41
-static inline int strcmp_ptr(const sd_char *a, const sd_char *b) {
37
+static inline int strcmp_ptr(const sd_char *a, const sd_char *b)
38
+{
39
if (a && b)
40
return strcmp(a, b);
41
42
return CMP(a, b);
43
}
44
48
-static inline bool streq_ptr(const sd_char *a, const sd_char *b) {
45
+static inline bool streq_ptr(const sd_char *a, const sd_char *b)
46
+{
47
return strcmp_ptr(a, b) == 0;
48
}
49
52
-static ssize_t string_table_lookup(const char * const *table, size_t len, const char *key) {
50
+static ssize_t string_table_lookup(const char *const *table, size_t len, const char *key)
51
+{
52
if (!key || !*key)
53
return -EINVAL;
54
55
for (size_t i = 0; i < len; ++i)
56
if (streq_ptr(table[i], key))
58
- return (ssize_t) i;
57
+ return (ssize_t)i;
58
59
return -EINVAL;
60
}
61
62
/* For basic lookup tables with strictly enumerated entries */
64
-#define _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope) \
65
- scope const char *name##_to_string(type i) { \
66
- if (i < 0 || i >= (type) ELEMENTSOF(name##_table)) \
67
- return NULL; \
68
- return name##_table[i]; \
69
- }
63
+#define _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name, type, scope) \
64
+ scope const char *name##_to_string(type i) \
65
+ { \
66
+ if (i < 0 || i >= (type)ELEMENTSOF(name##_table)) \
67
+ return NULL; \
68
+ return name##_table[i]; \
69
+ }
70
71
-#define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope) \
72
- scope type name##_from_string(const char *s) { \
73
- return (type) string_table_lookup(name##_table, ELEMENTSOF(name##_table), s); \
74
- }
71
+#define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type, scope) \
72
+ scope type name##_from_string(const char *s) \
73
+ { \
74
+ return (type)string_table_lookup(name##_table, ELEMENTSOF(name##_table), s); \
75
+ }
76
76
-#define _DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \
77
- _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope) \
78
- _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope)
77
+#define _DEFINE_STRING_TABLE_LOOKUP(name, type, scope) \
78
+ _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name, type, scope) \
79
+ _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type, scope)
80
80
-#define DEFINE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,)
81
+#define DEFINE_STRING_TABLE_LOOKUP(name, type) _DEFINE_STRING_TABLE_LOOKUP(name, type, )
82
83
// ----------------------------------------------------------------------------
84
// copied from systemd: unit-def.h
102
typedef enum UnitLoadState {
103
UNIT_STUB,
104
UNIT_LOADED,
104
- UNIT_NOT_FOUND, /* error condition #1: unit file not found */
105
- UNIT_BAD_SETTING, /* error condition #2: we couldn't parse some essential unit file setting */
106
- UNIT_ERROR, /* error condition #3: other "system" error, catchall for the rest */
105
+ UNIT_NOT_FOUND, /* error condition #1: unit file not found */
106
+ UNIT_BAD_SETTING, /* error condition #2: we couldn't parse some essential unit file setting */
107
+ UNIT_ERROR, /* error condition #3: other "system" error, catchall for the rest */
108
UNIT_MERGED,
109
UNIT_MASKED,
110
_UNIT_LOAD_STATE_MAX,
142
143
typedef enum MountState {
144
MOUNT_DEAD,
144
- MOUNT_MOUNTING, /* /usr/bin/mount is running, but the mount is not done yet. */
145
- MOUNT_MOUNTING_DONE, /* /usr/bin/mount is running, and the mount is done. */
145
+ MOUNT_MOUNTING, /* /usr/bin/mount is running, but the mount is not done yet. */
146
+ MOUNT_MOUNTING_DONE, /* /usr/bin/mount is running, and the mount is done. */
147
MOUNT_MOUNTED,
148
MOUNT_REMOUNTING,
149
MOUNT_UNMOUNTING,
185
SERVICE_START,
186
SERVICE_START_POST,
187
SERVICE_RUNNING,
187
- SERVICE_EXITED, /* Nothing is running anymore, but RemainAfterExit is true hence this is OK */
188
- SERVICE_RELOAD, /* Reloading via ExecReload= */
189
- SERVICE_RELOAD_SIGNAL, /* Reloading via SIGHUP requested */
190
- SERVICE_RELOAD_NOTIFY, /* Waiting for READY=1 after RELOADING=1 notify */
191
- SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
188
+ SERVICE_EXITED, /* Nothing is running anymore, but RemainAfterExit is true hence this is OK */
189
+ SERVICE_RELOAD, /* Reloading via ExecReload= */
190
+ SERVICE_RELOAD_SIGNAL, /* Reloading via SIGHUP requested */
191
+ SERVICE_RELOAD_NOTIFY, /* Waiting for READY=1 after RELOADING=1 notify */
192
+ SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
193
SERVICE_STOP_WATCHDOG,
194
SERVICE_STOP_SIGTERM,
195
SERVICE_STOP_SIGKILL,
196
SERVICE_STOP_POST,
196
- SERVICE_FINAL_WATCHDOG, /* In case the STOP_POST executable needs to be aborted. */
197
- SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
197
+ SERVICE_FINAL_WATCHDOG, /* In case the STOP_POST executable needs to be aborted. */
198
+ SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
199
SERVICE_FINAL_SIGKILL,
200
SERVICE_FAILED,
201
SERVICE_DEAD_BEFORE_AUTO_RESTART,
202
SERVICE_FAILED_BEFORE_AUTO_RESTART,
202
- SERVICE_DEAD_RESOURCES_PINNED, /* Like SERVICE_DEAD, but with pinned resources */
203
+ SERVICE_DEAD_RESOURCES_PINNED, /* Like SERVICE_DEAD, but with pinned resources */
204
SERVICE_AUTO_RESTART,
205
SERVICE_AUTO_RESTART_QUEUED,
206
SERVICE_CLEANING,
236
237
typedef enum SwapState {
238
SWAP_DEAD,
238
- SWAP_ACTIVATING, /* /sbin/swapon is running, but the swap not yet enabled. */
239
- SWAP_ACTIVATING_DONE, /* /sbin/swapon is running, and the swap is done. */
239
+ SWAP_ACTIVATING, /* /sbin/swapon is running, but the swap not yet enabled. */
240
+ SWAP_ACTIVATING_DONE, /* /sbin/swapon is running, and the swap is done. */
241
SWAP_ACTIVE,
242
SWAP_DEACTIVATING,
243
SWAP_DEACTIVATING_SIGTERM,
277
// ----------------------------------------------------------------------------
278
// copied from systemd: unit-def.c
279
279
-static const char* const unit_type_table[_UNIT_TYPE_MAX] = {
280
- [UNIT_SERVICE] = "service",
281
- [UNIT_SOCKET] = "socket",
282
- [UNIT_TARGET] = "target",
283
- [UNIT_DEVICE] = "device",
284
- [UNIT_MOUNT] = "mount",
285
- [UNIT_AUTOMOUNT] = "automount",
286
- [UNIT_SWAP] = "swap",
287
- [UNIT_TIMER] = "timer",
288
- [UNIT_PATH] = "path",
289
- [UNIT_SLICE] = "slice",
290
- [UNIT_SCOPE] = "scope",
280
+static const char *const unit_type_table[_UNIT_TYPE_MAX] = {
281
+ [UNIT_SERVICE] = "service",
282
+ [UNIT_SOCKET] = "socket",
283
+ [UNIT_TARGET] = "target",
284
+ [UNIT_DEVICE] = "device",
285
+ [UNIT_MOUNT] = "mount",
286
+ [UNIT_AUTOMOUNT] = "automount",
287
+ [UNIT_SWAP] = "swap",
288
+ [UNIT_TIMER] = "timer",
289
+ [UNIT_PATH] = "path",
290
+ [UNIT_SLICE] = "slice",
291
+ [UNIT_SCOPE] = "scope",
292
};
293
294
DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType);
295
295
-static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = {
296
- [UNIT_STUB] = "stub",
297
- [UNIT_LOADED] = "loaded",
298
- [UNIT_NOT_FOUND] = "not-found",
299
- [UNIT_BAD_SETTING] = "bad-setting",
300
- [UNIT_ERROR] = "error",
301
- [UNIT_MERGED] = "merged",
302
- [UNIT_MASKED] = "masked"
303
-};
296
+static const char *const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = {
297
+ [UNIT_STUB] = "stub",
298
+ [UNIT_LOADED] = "loaded",
299
+ [UNIT_NOT_FOUND] = "not-found",
300
+ [UNIT_BAD_SETTING] = "bad-setting",
301
+ [UNIT_ERROR] = "error",
302
+ [UNIT_MERGED] = "merged",
303
+ [UNIT_MASKED] = "masked"};
304
305
DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);
306
307
-static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
308
- [UNIT_ACTIVE] = "active",
309
- [UNIT_RELOADING] = "reloading",
310
- [UNIT_INACTIVE] = "inactive",
311
- [UNIT_FAILED] = "failed",
312
- [UNIT_ACTIVATING] = "activating",
313
- [UNIT_DEACTIVATING] = "deactivating",
314
- [UNIT_MAINTENANCE] = "maintenance",
307
+static const char *const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
308
+ [UNIT_ACTIVE] = "active",
309
+ [UNIT_RELOADING] = "reloading",
310
+ [UNIT_INACTIVE] = "inactive",
311
+ [UNIT_FAILED] = "failed",
312
+ [UNIT_ACTIVATING] = "activating",
313
+ [UNIT_DEACTIVATING] = "deactivating",
314
+ [UNIT_MAINTENANCE] = "maintenance",
315
};
316
317
DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
318
319
-static const char* const automount_state_table[_AUTOMOUNT_STATE_MAX] = {
320
- [AUTOMOUNT_DEAD] = "dead",
321
- [AUTOMOUNT_WAITING] = "waiting",
322
- [AUTOMOUNT_RUNNING] = "running",
323
- [AUTOMOUNT_FAILED] = "failed"
324
-};
319
+static const char *const automount_state_table[_AUTOMOUNT_STATE_MAX] = {
320
+ [AUTOMOUNT_DEAD] = "dead",
321
+ [AUTOMOUNT_WAITING] = "waiting",
322
+ [AUTOMOUNT_RUNNING] = "running",
323
+ [AUTOMOUNT_FAILED] = "failed"};
324
325
DEFINE_STRING_TABLE_LOOKUP(automount_state, AutomountState);
326
328
-static const char* const device_state_table[_DEVICE_STATE_MAX] = {
329
- [DEVICE_DEAD] = "dead",
330
- [DEVICE_TENTATIVE] = "tentative",
331
- [DEVICE_PLUGGED] = "plugged",
327
+static const char *const device_state_table[_DEVICE_STATE_MAX] = {
328
+ [DEVICE_DEAD] = "dead",
329
+ [DEVICE_TENTATIVE] = "tentative",
330
+ [DEVICE_PLUGGED] = "plugged",
331
};
332
333
DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
334
336
-static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
337
- [MOUNT_DEAD] = "dead",
338
- [MOUNT_MOUNTING] = "mounting",
339
- [MOUNT_MOUNTING_DONE] = "mounting-done",
340
- [MOUNT_MOUNTED] = "mounted",
341
- [MOUNT_REMOUNTING] = "remounting",
342
- [MOUNT_UNMOUNTING] = "unmounting",
343
- [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
344
- [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
345
- [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
346
- [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
347
- [MOUNT_FAILED] = "failed",
348
- [MOUNT_CLEANING] = "cleaning",
335
+static const char *const mount_state_table[_MOUNT_STATE_MAX] = {
336
+ [MOUNT_DEAD] = "dead",
337
+ [MOUNT_MOUNTING] = "mounting",
338
+ [MOUNT_MOUNTING_DONE] = "mounting-done",
339
+ [MOUNT_MOUNTED] = "mounted",
340
+ [MOUNT_REMOUNTING] = "remounting",
341
+ [MOUNT_UNMOUNTING] = "unmounting",
342
+ [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
343
+ [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
344
+ [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
345
+ [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
346
+ [MOUNT_FAILED] = "failed",
347
+ [MOUNT_CLEANING] = "cleaning",
348
};
349
350
DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
351
353
-static const char* const path_state_table[_PATH_STATE_MAX] = {
354
- [PATH_DEAD] = "dead",
355
- [PATH_WAITING] = "waiting",
356
- [PATH_RUNNING] = "running",
357
- [PATH_FAILED] = "failed"
358
-};
352
+static const char *const path_state_table[_PATH_STATE_MAX] =
353
+ {[PATH_DEAD] = "dead", [PATH_WAITING] = "waiting", [PATH_RUNNING] = "running", [PATH_FAILED] = "failed"};
354
355
DEFINE_STRING_TABLE_LOOKUP(path_state, PathState);
356
362
-static const char* const scope_state_table[_SCOPE_STATE_MAX] = {
363
- [SCOPE_DEAD] = "dead",
364
- [SCOPE_START_CHOWN] = "start-chown",
365
- [SCOPE_RUNNING] = "running",
366
- [SCOPE_ABANDONED] = "abandoned",
367
- [SCOPE_STOP_SIGTERM] = "stop-sigterm",
368
- [SCOPE_STOP_SIGKILL] = "stop-sigkill",
369
- [SCOPE_FAILED] = "failed",
357
+static const char *const scope_state_table[_SCOPE_STATE_MAX] = {
358
+ [SCOPE_DEAD] = "dead",
359
+ [SCOPE_START_CHOWN] = "start-chown",
360
+ [SCOPE_RUNNING] = "running",
361
+ [SCOPE_ABANDONED] = "abandoned",
362
+ [SCOPE_STOP_SIGTERM] = "stop-sigterm",
363
+ [SCOPE_STOP_SIGKILL] = "stop-sigkill",
364
+ [SCOPE_FAILED] = "failed",
365
};
366
367
DEFINE_STRING_TABLE_LOOKUP(scope_state, ScopeState);
368
374
-static const char* const service_state_table[_SERVICE_STATE_MAX] = {
375
- [SERVICE_DEAD] = "dead",
376
- [SERVICE_CONDITION] = "condition",
377
- [SERVICE_START_PRE] = "start-pre",
378
- [SERVICE_START] = "start",
379
- [SERVICE_START_POST] = "start-post",
380
- [SERVICE_RUNNING] = "running",
381
- [SERVICE_EXITED] = "exited",
382
- [SERVICE_RELOAD] = "reload",
383
- [SERVICE_RELOAD_SIGNAL] = "reload-signal",
384
- [SERVICE_RELOAD_NOTIFY] = "reload-notify",
385
- [SERVICE_STOP] = "stop",
386
- [SERVICE_STOP_WATCHDOG] = "stop-watchdog",
387
- [SERVICE_STOP_SIGTERM] = "stop-sigterm",
388
- [SERVICE_STOP_SIGKILL] = "stop-sigkill",
389
- [SERVICE_STOP_POST] = "stop-post",
390
- [SERVICE_FINAL_WATCHDOG] = "final-watchdog",
391
- [SERVICE_FINAL_SIGTERM] = "final-sigterm",
392
- [SERVICE_FINAL_SIGKILL] = "final-sigkill",
393
- [SERVICE_FAILED] = "failed",
394
- [SERVICE_DEAD_BEFORE_AUTO_RESTART] = "dead-before-auto-restart",
395
- [SERVICE_FAILED_BEFORE_AUTO_RESTART] = "failed-before-auto-restart",
396
- [SERVICE_DEAD_RESOURCES_PINNED] = "dead-resources-pinned",
397
- [SERVICE_AUTO_RESTART] = "auto-restart",
398
- [SERVICE_AUTO_RESTART_QUEUED] = "auto-restart-queued",
399
- [SERVICE_CLEANING] = "cleaning",
369
+static const char *const service_state_table[_SERVICE_STATE_MAX] = {
370
+ [SERVICE_DEAD] = "dead",
371
+ [SERVICE_CONDITION] = "condition",
372
+ [SERVICE_START_PRE] = "start-pre",
373
+ [SERVICE_START] = "start",
374
+ [SERVICE_START_POST] = "start-post",
375
+ [SERVICE_RUNNING] = "running",
376
+ [SERVICE_EXITED] = "exited",
377
+ [SERVICE_RELOAD] = "reload",
378
+ [SERVICE_RELOAD_SIGNAL] = "reload-signal",
379
+ [SERVICE_RELOAD_NOTIFY] = "reload-notify",
380
+ [SERVICE_STOP] = "stop",
381
+ [SERVICE_STOP_WATCHDOG] = "stop-watchdog",
382
+ [SERVICE_STOP_SIGTERM] = "stop-sigterm",
383
+ [SERVICE_STOP_SIGKILL] = "stop-sigkill",
384
+ [SERVICE_STOP_POST] = "stop-post",
385
+ [SERVICE_FINAL_WATCHDOG] = "final-watchdog",
386
+ [SERVICE_FINAL_SIGTERM] = "final-sigterm",
387
+ [SERVICE_FINAL_SIGKILL] = "final-sigkill",
388
+ [SERVICE_FAILED] = "failed",
389
+ [SERVICE_DEAD_BEFORE_AUTO_RESTART] = "dead-before-auto-restart",
390
+ [SERVICE_FAILED_BEFORE_AUTO_RESTART] = "failed-before-auto-restart",
391
+ [SERVICE_DEAD_RESOURCES_PINNED] = "dead-resources-pinned",
392
+ [SERVICE_AUTO_RESTART] = "auto-restart",
393
+ [SERVICE_AUTO_RESTART_QUEUED] = "auto-restart-queued",
394
+ [SERVICE_CLEANING] = "cleaning",
395
};
396
397
DEFINE_STRING_TABLE_LOOKUP(service_state, ServiceState);
398
404
-static const char* const slice_state_table[_SLICE_STATE_MAX] = {
405
- [SLICE_DEAD] = "dead",
406
- [SLICE_ACTIVE] = "active"
407
-};
399
+static const char *const slice_state_table[_SLICE_STATE_MAX] = {[SLICE_DEAD] = "dead", [SLICE_ACTIVE] = "active"};
400
401
DEFINE_STRING_TABLE_LOOKUP(slice_state, SliceState);
402
411
-static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
412
- [SOCKET_DEAD] = "dead",
413
- [SOCKET_START_PRE] = "start-pre",
414
- [SOCKET_START_CHOWN] = "start-chown",
415
- [SOCKET_START_POST] = "start-post",
416
- [SOCKET_LISTENING] = "listening",
417
- [SOCKET_RUNNING] = "running",
418
- [SOCKET_STOP_PRE] = "stop-pre",
419
- [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
420
- [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
421
- [SOCKET_STOP_POST] = "stop-post",
422
- [SOCKET_FINAL_SIGTERM] = "final-sigterm",
423
- [SOCKET_FINAL_SIGKILL] = "final-sigkill",
424
- [SOCKET_FAILED] = "failed",
425
- [SOCKET_CLEANING] = "cleaning",
403
+static const char *const socket_state_table[_SOCKET_STATE_MAX] = {
404
+ [SOCKET_DEAD] = "dead",
405
+ [SOCKET_START_PRE] = "start-pre",
406
+ [SOCKET_START_CHOWN] = "start-chown",
407
+ [SOCKET_START_POST] = "start-post",
408
+ [SOCKET_LISTENING] = "listening",
409
+ [SOCKET_RUNNING] = "running",
410
+ [SOCKET_STOP_PRE] = "stop-pre",
411
+ [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
412
+ [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
413
+ [SOCKET_STOP_POST] = "stop-post",
414
+ [SOCKET_FINAL_SIGTERM] = "final-sigterm",
415
+ [SOCKET_FINAL_SIGKILL] = "final-sigkill",
416
+ [SOCKET_FAILED] = "failed",
417
+ [SOCKET_CLEANING] = "cleaning",
418
};
419
420
DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
421
430
-static const char* const swap_state_table[_SWAP_STATE_MAX] = {
431
- [SWAP_DEAD] = "dead",
432
- [SWAP_ACTIVATING] = "activating",
433
- [SWAP_ACTIVATING_DONE] = "activating-done",
434
- [SWAP_ACTIVE] = "active",
435
- [SWAP_DEACTIVATING] = "deactivating",
436
- [SWAP_DEACTIVATING_SIGTERM] = "deactivating-sigterm",
437
- [SWAP_DEACTIVATING_SIGKILL] = "deactivating-sigkill",
438
- [SWAP_FAILED] = "failed",
439
- [SWAP_CLEANING] = "cleaning",
422
+static const char *const swap_state_table[_SWAP_STATE_MAX] = {
423
+ [SWAP_DEAD] = "dead",
424
+ [SWAP_ACTIVATING] = "activating",
425
+ [SWAP_ACTIVATING_DONE] = "activating-done",
426
+ [SWAP_ACTIVE] = "active",
427
+ [SWAP_DEACTIVATING] = "deactivating",
428
+ [SWAP_DEACTIVATING_SIGTERM] = "deactivating-sigterm",
429
+ [SWAP_DEACTIVATING_SIGKILL] = "deactivating-sigkill",
430
+ [SWAP_FAILED] = "failed",
431
+ [SWAP_CLEANING] = "cleaning",
432
};
433
434
DEFINE_STRING_TABLE_LOOKUP(swap_state, SwapState);
435
444
-static const char* const target_state_table[_TARGET_STATE_MAX] = {
445
- [TARGET_DEAD] = "dead",
446
- [TARGET_ACTIVE] = "active"
447
-};
436
+static const char *const target_state_table[_TARGET_STATE_MAX] = {[TARGET_DEAD] = "dead", [TARGET_ACTIVE] = "active"};
437
438
DEFINE_STRING_TABLE_LOOKUP(target_state, TargetState);
439
451
-static const char* const timer_state_table[_TIMER_STATE_MAX] = {
452
- [TIMER_DEAD] = "dead",
453
- [TIMER_WAITING] = "waiting",
454
- [TIMER_RUNNING] = "running",
455
- [TIMER_ELAPSED] = "elapsed",
456
- [TIMER_FAILED] = "failed"
457
-};
440
+static const char *const timer_state_table[_TIMER_STATE_MAX] = {
441
+ [TIMER_DEAD] = "dead",
442
+ [TIMER_WAITING] = "waiting",
443
+ [TIMER_RUNNING] = "running",
444
+ [TIMER_ELAPSED] = "elapsed",
445
+ [TIMER_FAILED] = "failed"};
446
447
DEFINE_STRING_TABLE_LOOKUP(timer_state, TimerState);
448
461
-static const char* const freezer_state_table[_FREEZER_STATE_MAX] = {
462
- [FREEZER_RUNNING] = "running",
463
- [FREEZER_FREEZING] = "freezing",
464
- [FREEZER_FROZEN] = "frozen",
465
- [FREEZER_THAWING] = "thawing",
449
+static const char *const freezer_state_table[_FREEZER_STATE_MAX] = {
450
+ [FREEZER_RUNNING] = "running",
451
+ [FREEZER_FREEZING] = "freezing",
452
+ [FREEZER_FROZEN] = "frozen",
453
+ [FREEZER_THAWING] = "thawing",
454
};
455
456
DEFINE_STRING_TABLE_LOOKUP(freezer_state, FreezerState);
493
.info = "Service Type",
494
.options = RRDF_FIELD_OPTS_VISIBLE,
495
.filter = RRDF_FIELD_FILTER_MULTISELECT,
508
- }, {
496
+ },
497
+ {
498
.member = "Result",
499
.value_type = SD_BUS_TYPE_STRING,
500
.show_as = "Result",
501
.info = "Result",
502
.options = RRDF_FIELD_OPTS_VISIBLE,
503
.filter = RRDF_FIELD_FILTER_MULTISELECT,
515
- }, {
504
+ },
505
+ {
506
.member = "UnitFileState",
507
.value_type = SD_BUS_TYPE_STRING,
508
.show_as = "Enabled",
509
.info = "Unit File State",
510
.options = RRDF_FIELD_OPTS_NONE,
511
.filter = RRDF_FIELD_FILTER_MULTISELECT,
522
- }, {
512
+ },
513
+ {
514
.member = "UnitFilePreset",
515
.value_type = SD_BUS_TYPE_STRING,
516
.show_as = "Preset",
517
.info = "Unit File Preset",
518
.options = RRDF_FIELD_OPTS_NONE,
519
.filter = RRDF_FIELD_FILTER_MULTISELECT,
529
- }, {
520
+ },
521
+ {
522
.member = "FreezerState",
523
.value_type = SD_BUS_TYPE_STRING,
524
.show_as = "FreezerState",
526
.options = RRDF_FIELD_OPTS_NONE,
527
.filter = RRDF_FIELD_FILTER_MULTISELECT,
528
.handler = update_freezer_state,
537
- },
538
-// { .member = "Id", .signature = "s", },
539
-// { .member = "LoadState", .signature = "s", },
540
-// { .member = "ActiveState", .signature = "s", },
541
-// { .member = "SubState", .signature = "s", },
542
-// { .member = "Description", .signature = "s", },
543
-// { .member = "Following", .signature = "s", },
544
-// { .member = "Documentation", .signature = "as", },
545
-// { .member = "FragmentPath", .signature = "s", },
546
-// { .member = "SourcePath", .signature = "s", },
547
-// { .member = "ControlGroup", .signature = "s", },
548
-// { .member = "DropInPaths", .signature = "as", },
549
-// { .member = "LoadError", .signature = "(ss)", },
550
-// { .member = "TriggeredBy", .signature = "as", },
551
-// { .member = "Triggers", .signature = "as", },
552
-// { .member = "InactiveExitTimestamp", .signature = "t", },
553
-// { .member = "InactiveExitTimestampMonotonic", .signature = "t", },
554
-// { .member = "ActiveEnterTimestamp", .signature = "t", },
555
-// { .member = "ActiveExitTimestamp", .signature = "t", },
556
-// { .member = "RuntimeMaxUSec", .signature = "t", },
557
-// { .member = "InactiveEnterTimestamp", .signature = "t", },
558
-// { .member = "NeedDaemonReload", .signature = "b", },
559
-// { .member = "Transient", .signature = "b", },
560
-// { .member = "ExecMainPID", .signature = "u", },
561
-// { .member = "MainPID", .signature = "u", },
562
-// { .member = "ControlPID", .signature = "u", },
563
-// { .member = "StatusText", .signature = "s", },
564
-// { .member = "PIDFile", .signature = "s", },
565
-// { .member = "StatusErrno", .signature = "i", },
566
-// { .member = "FileDescriptorStoreMax", .signature = "u", },
567
-// { .member = "NFileDescriptorStore", .signature = "u", },
568
-// { .member = "ExecMainStartTimestamp", .signature = "t", },
569
-// { .member = "ExecMainExitTimestamp", .signature = "t", },
570
-// { .member = "ExecMainCode", .signature = "i", },
571
-// { .member = "ExecMainStatus", .signature = "i", },
572
-// { .member = "LogNamespace", .signature = "s", },
573
-// { .member = "ConditionTimestamp", .signature = "t", },
574
-// { .member = "ConditionResult", .signature = "b", },
575
-// { .member = "Conditions", .signature = "a(sbbsi)", },
576
-// { .member = "AssertTimestamp", .signature = "t", },
577
-// { .member = "AssertResult", .signature = "b", },
578
-// { .member = "Asserts", .signature = "a(sbbsi)", },
579
-// { .member = "NextElapseUSecRealtime", .signature = "t", },
580
-// { .member = "NextElapseUSecMonotonic", .signature = "t", },
581
-// { .member = "NAccepted", .signature = "u", },
582
-// { .member = "NConnections", .signature = "u", },
583
-// { .member = "NRefused", .signature = "u", },
584
-// { .member = "Accept", .signature = "b", },
585
-// { .member = "Listen", .signature = "a(ss)", },
586
-// { .member = "SysFSPath", .signature = "s", },
587
-// { .member = "Where", .signature = "s", },
588
-// { .member = "What", .signature = "s", },
589
-// { .member = "MemoryCurrent", .signature = "t", },
590
-// { .member = "MemoryAvailable", .signature = "t", },
591
-// { .member = "DefaultMemoryMin", .signature = "t", },
592
-// { .member = "DefaultMemoryLow", .signature = "t", },
593
-// { .member = "DefaultStartupMemoryLow", .signature = "t", },
594
-// { .member = "MemoryMin", .signature = "t", },
595
-// { .member = "MemoryLow", .signature = "t", },
596
-// { .member = "StartupMemoryLow", .signature = "t", },
597
-// { .member = "MemoryHigh", .signature = "t", },
598
-// { .member = "StartupMemoryHigh", .signature = "t", },
599
-// { .member = "MemoryMax", .signature = "t", },
600
-// { .member = "StartupMemoryMax", .signature = "t", },
601
-// { .member = "MemorySwapMax", .signature = "t", },
602
-// { .member = "StartupMemorySwapMax", .signature = "t", },
603
-// { .member = "MemoryZSwapMax", .signature = "t", },
604
-// { .member = "StartupMemoryZSwapMax", .signature = "t", },
605
-// { .member = "MemoryLimit", .signature = "t", },
606
-// { .member = "CPUUsageNSec", .signature = "t", },
607
-// { .member = "TasksCurrent", .signature = "t", },
608
-// { .member = "TasksMax", .signature = "t", },
609
-// { .member = "IPIngressBytes", .signature = "t", },
610
-// { .member = "IPEgressBytes", .signature = "t", },
611
-// { .member = "IOReadBytes", .signature = "t", },
612
-// { .member = "IOWriteBytes", .signature = "t", },
613
-// { .member = "ExecCondition", .signature = "a(sasbttttuii)", },
614
-// { .member = "ExecConditionEx", .signature = "a(sasasttttuii)", },
615
-// { .member = "ExecStartPre", .signature = "a(sasbttttuii)", },
616
-// { .member = "ExecStartPreEx", .signature = "a(sasasttttuii)", },
617
-// { .member = "ExecStart", .signature = "a(sasbttttuii)", },
618
-// { .member = "ExecStartEx", .signature = "a(sasasttttuii)", },
619
-// { .member = "ExecStartPost", .signature = "a(sasbttttuii)", },
620
-// { .member = "ExecStartPostEx", .signature = "a(sasasttttuii)", },
621
-// { .member = "ExecReload", .signature = "a(sasbttttuii)", },
622
-// { .member = "ExecReloadEx", .signature = "a(sasasttttuii)", },
623
-// { .member = "ExecStopPre", .signature = "a(sasbttttuii)", },
624
-// { .member = "ExecStop", .signature = "a(sasbttttuii)", },
625
-// { .member = "ExecStopEx", .signature = "a(sasasttttuii)", },
626
-// { .member = "ExecStopPost", .signature = "a(sasbttttuii)", },
627
-// { .member = "ExecStopPostEx", .signature = "a(sasasttttuii)", },
529
+ },
530
+ // { .member = "Id", .signature = "s", },
531
+ // { .member = "LoadState", .signature = "s", },
532
+ // { .member = "ActiveState", .signature = "s", },
533
+ // { .member = "SubState", .signature = "s", },
534
+ // { .member = "Description", .signature = "s", },
535
+ // { .member = "Following", .signature = "s", },
536
+ // { .member = "Documentation", .signature = "as", },
537
+ // { .member = "FragmentPath", .signature = "s", },
538
+ // { .member = "SourcePath", .signature = "s", },
539
+ // { .member = "ControlGroup", .signature = "s", },
540
+ // { .member = "DropInPaths", .signature = "as", },
541
+ // { .member = "LoadError", .signature = "(ss)", },
542
+ // { .member = "TriggeredBy", .signature = "as", },
543
+ // { .member = "Triggers", .signature = "as", },
544
+ // { .member = "InactiveExitTimestamp", .signature = "t", },
545
+ // { .member = "InactiveExitTimestampMonotonic", .signature = "t", },
546
+ // { .member = "ActiveEnterTimestamp", .signature = "t", },
547
+ // { .member = "ActiveExitTimestamp", .signature = "t", },
548
+ // { .member = "RuntimeMaxUSec", .signature = "t", },
549
+ // { .member = "InactiveEnterTimestamp", .signature = "t", },
550
+ // { .member = "NeedDaemonReload", .signature = "b", },
551
+ // { .member = "Transient", .signature = "b", },
552
+ // { .member = "ExecMainPID", .signature = "u", },
553
+ // { .member = "MainPID", .signature = "u", },
554
+ // { .member = "ControlPID", .signature = "u", },
555
+ // { .member = "StatusText", .signature = "s", },
556
+ // { .member = "PIDFile", .signature = "s", },
557
+ // { .member = "StatusErrno", .signature = "i", },
558
+ // { .member = "FileDescriptorStoreMax", .signature = "u", },
559
+ // { .member = "NFileDescriptorStore", .signature = "u", },
560
+ // { .member = "ExecMainStartTimestamp", .signature = "t", },
561
+ // { .member = "ExecMainExitTimestamp", .signature = "t", },
562
+ // { .member = "ExecMainCode", .signature = "i", },
563
+ // { .member = "ExecMainStatus", .signature = "i", },
564
+ // { .member = "LogNamespace", .signature = "s", },
565
+ // { .member = "ConditionTimestamp", .signature = "t", },
566
+ // { .member = "ConditionResult", .signature = "b", },
567
+ // { .member = "Conditions", .signature = "a(sbbsi)", },
568
+ // { .member = "AssertTimestamp", .signature = "t", },
569
+ // { .member = "AssertResult", .signature = "b", },
570
+ // { .member = "Asserts", .signature = "a(sbbsi)", },
571
+ // { .member = "NextElapseUSecRealtime", .signature = "t", },
572
+ // { .member = "NextElapseUSecMonotonic", .signature = "t", },
573
+ // { .member = "NAccepted", .signature = "u", },
574
+ // { .member = "NConnections", .signature = "u", },
575
+ // { .member = "NRefused", .signature = "u", },
576
+ // { .member = "Accept", .signature = "b", },
577
+ // { .member = "Listen", .signature = "a(ss)", },
578
+ // { .member = "SysFSPath", .signature = "s", },
579
+ // { .member = "Where", .signature = "s", },
580
+ // { .member = "What", .signature = "s", },
581
+ // { .member = "MemoryCurrent", .signature = "t", },
582
+ // { .member = "MemoryAvailable", .signature = "t", },
583
+ // { .member = "DefaultMemoryMin", .signature = "t", },
584
+ // { .member = "DefaultMemoryLow", .signature = "t", },
585
+ // { .member = "DefaultStartupMemoryLow", .signature = "t", },
586
+ // { .member = "MemoryMin", .signature = "t", },
587
+ // { .member = "MemoryLow", .signature = "t", },
588
+ // { .member = "StartupMemoryLow", .signature = "t", },
589
+ // { .member = "MemoryHigh", .signature = "t", },
590
+ // { .member = "StartupMemoryHigh", .signature = "t", },
591
+ // { .member = "MemoryMax", .signature = "t", },
592
+ // { .member = "StartupMemoryMax", .signature = "t", },
593
+ // { .member = "MemorySwapMax", .signature = "t", },
594
+ // { .member = "StartupMemorySwapMax", .signature = "t", },
595
+ // { .member = "MemoryZSwapMax", .signature = "t", },
596
+ // { .member = "StartupMemoryZSwapMax", .signature = "t", },
597
+ // { .member = "MemoryLimit", .signature = "t", },
598
+ // { .member = "CPUUsageNSec", .signature = "t", },
599
+ // { .member = "TasksCurrent", .signature = "t", },
600
+ // { .member = "TasksMax", .signature = "t", },
601
+ // { .member = "IPIngressBytes", .signature = "t", },
602
+ // { .member = "IPEgressBytes", .signature = "t", },
603
+ // { .member = "IOReadBytes", .signature = "t", },
604
+ // { .member = "IOWriteBytes", .signature = "t", },
605
+ // { .member = "ExecCondition", .signature = "a(sasbttttuii)", },
606
+ // { .member = "ExecConditionEx", .signature = "a(sasasttttuii)", },
607
+ // { .member = "ExecStartPre", .signature = "a(sasbttttuii)", },
608
+ // { .member = "ExecStartPreEx", .signature = "a(sasasttttuii)", },
609
+ // { .member = "ExecStart", .signature = "a(sasbttttuii)", },
610
+ // { .member = "ExecStartEx", .signature = "a(sasasttttuii)", },
611
+ // { .member = "ExecStartPost", .signature = "a(sasbttttuii)", },
612
+ // { .member = "ExecStartPostEx", .signature = "a(sasasttttuii)", },
613
+ // { .member = "ExecReload", .signature = "a(sasbttttuii)", },
614
+ // { .member = "ExecReloadEx", .signature = "a(sasasttttuii)", },
615
+ // { .member = "ExecStopPre", .signature = "a(sasbttttuii)", },
616
+ // { .member = "ExecStop", .signature = "a(sasbttttuii)", },
617
+ // { .member = "ExecStopEx", .signature = "a(sasasttttuii)", },
618
+ // { .member = "ExecStopPost", .signature = "a(sasbttttuii)", },
619
+ // { .member = "ExecStopPostEx", .signature = "a(sasasttttuii)", },
620
};
621
622
#define _UNIT_ATTRIBUTE_MAX (sizeof(unit_attributes) / sizeof(unit_attributes[0]))
661
struct UnitInfo *prev, *next;
662
} UnitInfo;
663
672
-static void update_freezer_state(UnitInfo *u, UnitAttribute *ua) {
664
+static void update_freezer_state(UnitInfo *u, UnitAttribute *ua)
665
+{
666
u->FreezerState = freezer_state_from_string(ua->str);
667
}
668
669
// ----------------------------------------------------------------------------
670
// common helpers
671
679
-static void log_dbus_error(int r, const char *msg) {
680
- netdata_log_error("SYSTEMD_UNITS: %s failed with error %d (%s)", msg, r, strerror(-r));
672
+static void log_dbus_error(int r, const char *msg)
673
+{
674
+ netdata_log_error("ND_SD_UNITS: %s failed with error %d (%s)", msg, r, strerror(-r));
675
}
676
677
// ----------------------------------------------------------------------------
678
// attributes management
679
686
-static inline ssize_t unit_property_slot_from_string(const char *s) {
687
- if(!s || !*s)
680
+static inline ssize_t unit_property_slot_from_string(const char *s)
681
+{
682
+ if (!s || !*s)
683
return -EINVAL;
684
690
- for(size_t i = 0; i < _UNIT_ATTRIBUTE_MAX ;i++)
691
- if(streq_ptr(unit_attributes[i].member, s))
685
+ for (size_t i = 0; i < _UNIT_ATTRIBUTE_MAX; i++)
686
+ if (streq_ptr(unit_attributes[i].member, s))
687
return (ssize_t)i;
688
689
return -EINVAL;
690
}
691
697
-static inline const char *unit_property_name_to_string_from_slot(ssize_t i) {
698
- if(i >= 0 && i < (ssize_t)_UNIT_ATTRIBUTE_MAX)
692
+static inline const char *unit_property_name_to_string_from_slot(ssize_t i)
693
+{
694
+ if (i >= 0 && i < (ssize_t)_UNIT_ATTRIBUTE_MAX)
695
return unit_attributes[i].member;
696
697
return NULL;
698
}
699
704
-static inline void systemd_unit_free_property(char type, struct UnitAttribute *at) {
705
- switch(type) {
700
+static inline void systemd_unit_free_property(char type, struct UnitAttribute *at)
701
+{
702
+ switch (type) {
703
case SD_BUS_TYPE_STRING:
704
case SD_BUS_TYPE_OBJECT_PATH:
705
freez(at->str);
711
}
712
}
713
717
-static int systemd_unit_get_property(sd_bus_message *m, UnitInfo *u, const char *name) {
714
+static int systemd_unit_get_property(sd_bus_message *m, UnitInfo *u, const char *name)
715
+{
716
int r;
717
char type;
718
719
r = sd_bus_message_peek_type(m, &type, NULL);
722
- if(r < 0) {
720
+ if (r < 0) {
721
log_dbus_error(r, "sd_bus_message_peek_type()");
722
return r;
723
}
724
725
ssize_t slot = unit_property_slot_from_string(name);
728
- if(slot < 0) {
726
+ if (slot < 0) {
727
// internal_error(true, "unused attribute '%s' for unit '%s'", name, u->id);
728
sd_bus_message_skip(m, NULL);
729
return 0;
731
732
systemd_unit_free_property(unit_attributes[slot].value_type, &u->attributes[slot]);
733
736
- if(unit_attributes[slot].value_type != type) {
737
- netdata_log_error("Type of field '%s' expected to be '%c' but found '%c'. Ignoring field.",
738
- unit_attributes[slot].member, unit_attributes[slot].value_type, type);
734
+ if (unit_attributes[slot].value_type != type) {
735
+ netdata_log_error(
736
+ "Type of field '%s' expected to be '%c' but found '%c'. Ignoring field.",
737
+ unit_attributes[slot].member,
738
+ unit_attributes[slot].value_type,
739
+ type);
740
sd_bus_message_skip(m, NULL);
741
return 0;
742
}
747
char *s;
748
749
r = sd_bus_message_read_basic(m, type, &s);
749
- if(r < 0) {
750
+ if (r < 0) {
751
log_dbus_error(r, "sd_bus_message_read_basic()");
752
return r;
753
}
754
754
- if(s && *s)
755
+ if (s && *s)
756
u->attributes[slot].str = strdupz(s);
756
- }
757
- break;
757
+ } break;
758
759
case SD_BUS_TYPE_BOOLEAN: {
760
r = sd_bus_message_read_basic(m, type, &u->attributes[slot].boolean);
761
- if(r < 0) {
761
+ if (r < 0) {
762
log_dbus_error(r, "sd_bus_message_read_basic()");
763
return r;
764
}
765
- }
766
- break;
765
+ } break;
766
767
case SD_BUS_TYPE_UINT64: {
768
r = sd_bus_message_read_basic(m, type, &u->attributes[slot].uint64);
770
- if(r < 0) {
769
+ if (r < 0) {
770
log_dbus_error(r, "sd_bus_message_read_basic()");
771
return r;
772
}
774
- }
775
- break;
773
+ } break;
774
775
case SD_BUS_TYPE_INT64: {
776
r = sd_bus_message_read_basic(m, type, &u->attributes[slot].int64);
779
- if(r < 0) {
777
+ if (r < 0) {
778
log_dbus_error(r, "sd_bus_message_read_basic()");
779
return r;
780
}
783
- }
784
- break;
781
+ } break;
782
783
case SD_BUS_TYPE_UINT32: {
784
r = sd_bus_message_read_basic(m, type, &u->attributes[slot].uint32);
788
- if(r < 0) {
785
+ if (r < 0) {
786
log_dbus_error(r, "sd_bus_message_read_basic()");
787
return r;
788
}
792
- }
793
- break;
789
+ } break;
790
791
case SD_BUS_TYPE_INT32: {
792
r = sd_bus_message_read_basic(m, type, &u->attributes[slot].int32);
797
- if(r < 0) {
793
+ if (r < 0) {
794
log_dbus_error(r, "sd_bus_message_read_basic()");
795
return r;
796
}
801
- }
802
- break;
797
+ } break;
798
799
case SD_BUS_TYPE_DOUBLE: {
800
r = sd_bus_message_read_basic(m, type, &u->attributes[slot].dbl);
806
- if(r < 0) {
801
+ if (r < 0) {
802
log_dbus_error(r, "sd_bus_message_read_basic()");
803
return r;
804
}
810
- }
811
- break;
805
+ } break;
806
807
case SD_BUS_TYPE_ARRAY: {
808
internal_error(true, "member '%s' is an array", name);
809
sd_bus_message_skip(m, NULL);
810
return 0;
817
- }
818
- break;
811
+ } break;
812
813
default: {
814
internal_error(true, "unknown field type '%c' for key '%s'", type, name);
815
sd_bus_message_skip(m, NULL);
816
return 0;
824
- }
825
- break;
817
+ } break;
818
}
819
828
- if(unit_attributes[slot].handler)
820
+ if (unit_attributes[slot].handler)
821
unit_attributes[slot].handler(u, &u->attributes[slot]);
822
823
return 0;
824
}
825
834
-static int systemd_unit_get_all_properties(sd_bus *bus, UnitInfo *u) {
826
+static int systemd_unit_get_all_properties(sd_bus *bus, UnitInfo *u)
827
+{
828
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
829
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
830
int r;
831
839
- r = sd_bus_call_method(bus,
840
- "org.freedesktop.systemd1",
841
- u->unit_path,
842
- "org.freedesktop.DBus.Properties",
843
- "GetAll",
844
- &error,
845
- &m,
846
- "s", "");
832
+ r = sd_bus_call_method(
833
+ bus, "org.freedesktop.systemd1", u->unit_path, "org.freedesktop.DBus.Properties", "GetAll", &error, &m, "s", "");
834
if (r < 0) {
835
log_dbus_error(r, "sd_bus_call_method(p1)");
836
return r;
866
systemd_unit_get_property(m, u, member);
867
868
r = sd_bus_message_exit_container(m);
882
- if(r < 0) {
869
+ if (r < 0) {
870
log_dbus_error(r, "sd_bus_message_exit_container(p6)");
871
return r;
872
}
873
874
r = sd_bus_message_exit_container(m);
888
- if(r < 0) {
875
+ if (r < 0) {
876
log_dbus_error(r, "sd_bus_message_exit_container(p7)");
877
return r;
878
}
879
}
893
- if(r < 0) {
880
+ if (r < 0) {
881
log_dbus_error(r, "sd_bus_message_enter_container(p8)");
882
return r;
883
}
884
885
r = sd_bus_message_exit_container(m);
899
- if(r < 0) {
886
+ if (r < 0) {
887
log_dbus_error(r, "sd_bus_message_exit_container(p9)");
888
return r;
889
}
891
return 0;
892
}
893
907
-static void systemd_units_get_all_properties(sd_bus *bus, UnitInfo *base) {
908
- for(UnitInfo *u = base ; u ;u = u->next)
894
+static void systemd_units_get_all_properties(sd_bus *bus, UnitInfo *base)
895
+{
896
+ for (UnitInfo *u = base; u; u = u->next)
897
systemd_unit_get_all_properties(bus, u);
898
}
899
912
-
913
-
900
// ----------------------------------------------------------------------------
901
// main unit info
902
917
-static int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u) {
903
+static int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u)
904
+{
905
assert(message);
906
assert(u);
907
908
u->type = NULL;
909
910
int r = sd_bus_message_read(
924
- message,
925
- SYSTEMD_UNITS_DBUS_TYPES,
926
- &u->id,
927
- &u->description,
928
- &u->load_state,
929
- &u->active_state,
930
- &u->sub_state,
931
- &u->following,
932
- &u->unit_path,
933
- &u->job_id,
934
- &u->job_type,
935
- &u->job_path);
936
-
937
- if(r <= 0)
911
+ message,
912
+ ND_SD_UNITS_DBUS_TYPES,
913
+ &u->id,
914
+ &u->description,
915
+ &u->load_state,
916
+ &u->active_state,
917
+ &u->sub_state,
918
+ &u->following,
919
+ &u->unit_path,
920
+ &u->job_id,
921
+ &u->job_type,
922
+ &u->job_path);
923
+
924
+ if (r <= 0)
925
return r;
926
927
char *dot;
941
- if(u->id && (dot = strrchr(u->id, '.')) != NULL)
928
+ if (u->id && (dot = strrchr(u->id, '.')) != NULL)
929
u->type = &dot[1];
930
else
931
u->type = "unknown";
934
u->UnitLoadState = unit_load_state_from_string(u->load_state);
935
u->UnitActiveState = unit_active_state_from_string(u->active_state);
936
950
- switch(u->UnitType) {
937
+ switch (u->UnitType) {
938
case UNIT_SERVICE:
939
u->ServiceState = service_state_from_string(u->sub_state);
940
break;
986
return r;
987
}
988
1002
-static int hex_to_int(char c) {
1003
- if (c >= '0' && c <= '9') return c - '0';
1004
- if (c >= 'a' && c <= 'f') return c - 'a' + 10;
1005
- if (c >= 'A' && c <= 'F') return c - 'A' + 10;
989
+static int hex_to_int(char c)
990
+{
991
+ if (c >= '0' && c <= '9')
992
+ return c - '0';
993
+ if (c >= 'a' && c <= 'f')
994
+ return c - 'a' + 10;
995
+ if (c >= 'A' && c <= 'F')
996
+ return c - 'A' + 10;
997
return 0;
998
}
999
1000
// un-escape hex sequences (\xNN) in id
1010
-static void txt_decode(char *txt) {
1011
- if(!txt || !*txt)
1001
+static void txt_decode(char *txt)
1002
+{
1003
+ if (!txt || !*txt)
1004
return;
1005
1006
char *src = txt, *dst = txt;
1007
1008
size_t id_len = strlen(src);
1009
size_t s = 0, d = 0;
1018
- for(; s < id_len ; s++) {
1019
- if(src[s] == '\\' && src[s + 1] == 'x' && isxdigit(src[s + 2]) && isxdigit(src[s + 3])) {
1010
+ for (; s < id_len; s++) {
1011
+ if (src[s] == '\\' && src[s + 1] == 'x' && isxdigit(src[s + 2]) && isxdigit(src[s + 3])) {
1012
int value = (hex_to_int(src[s + 2]) << 4) + hex_to_int(src[s + 3]);
1013
dst[d++] = (char)value;
1014
s += 3;
1023
- }
1024
- else
1015
+ } else
1016
dst[d++] = src[s];
1017
}
1018
dst[d] = '\0';
1019
}
1020
1030
-static UnitInfo *systemd_units_get_all(void) {
1021
+static UnitInfo *systemd_units_get_all(void)
1022
+{
1023
_cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
1024
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
1025
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1035
1036
// This calls the ListUnits method of the org.freedesktop.systemd1.Manager interface
1037
// Replace "ListUnits" with "ListUnitsFiltered" to get specific units based on filters
1046
- r = sd_bus_call_method(bus,
1047
- "org.freedesktop.systemd1", /* service to contact */
1048
- "/org/freedesktop/systemd1", /* object path */
1049
- "org.freedesktop.systemd1.Manager", /* interface name */
1050
- "ListUnits", /* method name */
1051
- &error, /* object to return error in */
1052
- &reply, /* return message on success */
1053
- NULL); /* input signature */
1038
+ r = sd_bus_call_method(
1039
+ bus,
1040
+ "org.freedesktop.systemd1", /* service to contact */
1041
+ "/org/freedesktop/systemd1", /* object path */
1042
+ "org.freedesktop.systemd1.Manager", /* interface name */
1043
+ "ListUnits", /* method name */
1044
+ &error, /* object to return error in */
1045
+ &reply, /* return message on success */
1046
+ NULL); /* input signature */
1047
if (r < 0) {
1048
log_dbus_error(r, "sd_bus_call_method()");
1049
return base;
1050
}
1051
1059
- r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, SYSTEMD_UNITS_DBUS_TYPES);
1052
+ r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, ND_SD_UNITS_DBUS_TYPES);
1053
if (r < 0) {
1054
log_dbus_error(r, "sd_bus_message_enter_container()");
1055
return base;
1096
return base;
1097
}
1098
1106
-static void systemd_units_free_all(UnitInfo *base) {
1107
- while(base) {
1099
+static void systemd_units_free_all(UnitInfo *base)
1100
+{
1101
+ while (base) {
1102
UnitInfo *u = base;
1103
DOUBLE_LINKED_LIST_REMOVE_ITEM_UNSAFE(base, u, prev, next);
1104
freez((void *)u->id);
1112
freez((void *)u->job_type);
1113
freez((void *)u->job_path);
1114
1121
- for(int i = 0; i < (ssize_t)_UNIT_ATTRIBUTE_MAX ;i++)
1115
+ for (int i = 0; i < (ssize_t)_UNIT_ATTRIBUTE_MAX; i++)
1116
systemd_unit_free_property(unit_attributes[i].value_type, &u->attributes[i]);
1117
1118
freez(u);
1121
1122
// ----------------------------------------------------------------------------
1123
1130
-static void netdata_systemd_units_function_help(const char *transaction) {
1124
+static void netdata_systemd_units_function_help(const char *transaction)
1125
+{
1126
BUFFER *wb = buffer_create(0, NULL);
1132
- buffer_sprintf(wb,
1133
- "%s / %s\n"
1134
- "\n"
1135
- "%s\n"
1136
- "\n"
1137
- "The following parameters are supported:\n"
1138
- "\n"
1139
- " help\n"
1140
- " Shows this help message.\n"
1141
- "\n"
1142
- " info\n"
1143
- " Request initial configuration information about the plugin.\n"
1144
- " The key entity returned is the required_params array, which includes\n"
1145
- " all the available systemd journal sources.\n"
1146
- " When `info` is requested, all other parameters are ignored.\n"
1147
- "\n"
1148
- , program_name
1149
- , SYSTEMD_UNITS_FUNCTION_NAME
1150
- , SYSTEMD_UNITS_FUNCTION_DESCRIPTION
1151
- );
1127
+ buffer_sprintf(
1128
+ wb,
1129
+ "%s / %s\n"
1130
+ "\n"
1131
+ "%s\n"
1132
+ "\n"
1133
+ "The following parameters are supported:\n"
1134
+ "\n"
1135
+ " help\n"
1136
+ " Shows this help message.\n"
1137
+ "\n"
1138
+ " info\n"
1139
+ " Request initial configuration information about the plugin.\n"
1140
+ " The key entity returned is the required_params array, which includes\n"
1141
+ " all the available systemd journal sources.\n"
1142
+ " When `info` is requested, all other parameters are ignored.\n"
1143
+ "\n",
1144
+ program_name,
1145
+ ND_SD_UNITS_FUNCTION_NAME,
1146
+ ND_SD_UNITS_FUNCTION_DESCRIPTION);
1147
1148
netdata_mutex_lock(&stdout_mutex);
1149
wb->response_code = HTTP_RESP_OK;
1155
buffer_free(wb);
1156
}
1157
1163
-static void netdata_systemd_units_function_info(const char *transaction) {
1158
+static void netdata_systemd_units_function_info(const char *transaction)
1159
+{
1160
BUFFER *wb = buffer_create(0, NULL);
1161
buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_MINIFY);
1162
1163
buffer_json_member_add_uint64(wb, "status", HTTP_RESP_OK);
1164
buffer_json_member_add_string(wb, "type", "table");
1169
- buffer_json_member_add_string(wb, "help", SYSTEMD_UNITS_FUNCTION_DESCRIPTION);
1165
+ buffer_json_member_add_string(wb, "help", ND_SD_UNITS_FUNCTION_DESCRIPTION);
1166
1167
buffer_json_finalize(wb);
1168
netdata_mutex_lock(&stdout_mutex);
1177
1178
// ----------------------------------------------------------------------------
1179
1184
-static void systemd_unit_priority(UnitInfo *u, size_t units) {
1180
+static void systemd_unit_priority(UnitInfo *u, size_t units)
1181
+{
1182
uint32_t prio;
1183
1187
- switch(u->severity) {
1184
+ switch (u->severity) {
1185
case FACET_ROW_SEVERITY_CRITICAL:
1186
prio = 0;
1187
break;
1208
u->prio = (prio * units) + u->prio;
1209
}
1210
1214
-static inline FACET_ROW_SEVERITY if_less(FACET_ROW_SEVERITY current, FACET_ROW_SEVERITY max, FACET_ROW_SEVERITY target) {
1211
+static inline FACET_ROW_SEVERITY if_less(FACET_ROW_SEVERITY current, FACET_ROW_SEVERITY max, FACET_ROW_SEVERITY target)
1212
+{
1213
FACET_ROW_SEVERITY wanted = current;
1216
- if(current < target)
1214
+ if (current < target)
1215
wanted = target > max ? max : target;
1216
return wanted;
1217
}
1218
1221
-static inline FACET_ROW_SEVERITY if_normal(FACET_ROW_SEVERITY current, FACET_ROW_SEVERITY max, FACET_ROW_SEVERITY target) {
1219
+static inline FACET_ROW_SEVERITY
1220
+if_normal(FACET_ROW_SEVERITY current, FACET_ROW_SEVERITY max, FACET_ROW_SEVERITY target)
1221
+{
1222
FACET_ROW_SEVERITY wanted = current;
1223
- if(current == FACET_ROW_SEVERITY_NORMAL)
1223
+ if (current == FACET_ROW_SEVERITY_NORMAL)
1224
wanted = target > max ? max : target;
1225
return wanted;
1226
}
1227
1228
-static FACET_ROW_SEVERITY system_unit_severity(UnitInfo *u) {
1228
+static FACET_ROW_SEVERITY system_unit_severity(UnitInfo *u)
1229
+{
1230
FACET_ROW_SEVERITY severity, max_severity;
1231
1231
- switch(u->UnitLoadState) {
1232
+ switch (u->UnitLoadState) {
1233
case UNIT_ERROR:
1234
case UNIT_BAD_SETTING:
1235
severity = FACET_ROW_SEVERITY_CRITICAL;
1259
break;
1260
}
1261
1261
- switch(u->UnitActiveState) {
1262
+ switch (u->UnitActiveState) {
1263
case UNIT_FAILED:
1264
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1265
break;
1283
break;
1284
}
1285
1285
- switch(u->FreezerState) {
1286
+ switch (u->FreezerState) {
1287
default:
1288
case FREEZER_FROZEN:
1289
case FREEZER_FREEZING:
1295
break;
1296
}
1297
1297
- switch(u->UnitType) {
1298
+ switch (u->UnitType) {
1299
case UNIT_SERVICE:
1299
- switch(u->ServiceState) {
1300
+ switch (u->ServiceState) {
1301
case SERVICE_FAILED:
1302
case SERVICE_FAILED_BEFORE_AUTO_RESTART:
1303
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1341
break;
1342
1343
case UNIT_MOUNT:
1343
- switch(u->MountState) {
1344
+ switch (u->MountState) {
1345
case MOUNT_FAILED:
1346
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1347
break;
1372
break;
1373
1374
case UNIT_SWAP:
1374
- switch(u->SwapState) {
1375
+ switch (u->SwapState) {
1376
case SWAP_FAILED:
1377
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1378
break;
1400
break;
1401
1402
case UNIT_SOCKET:
1402
- switch(u->SocketState) {
1403
+ switch (u->SocketState) {
1404
case SOCKET_FAILED:
1405
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1406
break;
1432
break;
1433
1434
case UNIT_TARGET:
1434
- switch(u->TargetState) {
1435
+ switch (u->TargetState) {
1436
default:
1437
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_WARNING);
1438
break;
1447
break;
1448
1449
case UNIT_DEVICE:
1449
- switch(u->DeviceState) {
1450
+ switch (u->DeviceState) {
1451
default:
1452
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_WARNING);
1453
break;
1466
break;
1467
1468
case UNIT_AUTOMOUNT:
1468
- switch(u->AutomountState) {
1469
+ switch (u->AutomountState) {
1470
case AUTOMOUNT_FAILED:
1471
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1472
break;
1486
break;
1487
1488
case UNIT_TIMER:
1488
- switch(u->TimerState) {
1489
+ switch (u->TimerState) {
1490
case TIMER_FAILED:
1491
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1492
break;
1507
break;
1508
1509
case UNIT_PATH:
1509
- switch(u->PathState) {
1510
+ switch (u->PathState) {
1511
case PATH_FAILED:
1512
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1513
break;
1527
break;
1528
1529
case UNIT_SLICE:
1529
- switch(u->SliceState) {
1530
+ switch (u->SliceState) {
1531
default:
1532
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_WARNING);
1533
break;
1542
break;
1543
1544
case UNIT_SCOPE:
1544
- switch(u->ScopeState) {
1545
+ switch (u->ScopeState) {
1546
case SCOPE_FAILED:
1547
severity = if_less(severity, max_severity, FACET_ROW_SEVERITY_CRITICAL);
1548
break;
1576
return severity;
1577
}
1578
1578
-static int unit_info_compar(const void *a, const void *b) {
1579
+static int unit_info_compar(const void *a, const void *b)
1580
+{
1581
UnitInfo *u1 = *((UnitInfo **)a);
1582
UnitInfo *u2 = *((UnitInfo **)b);
1583
1584
return strcasecmp(u1->id, u2->id);
1585
}
1586
1585
-static void systemd_units_assign_priority(UnitInfo *base) {
1587
+static void systemd_units_assign_priority(UnitInfo *base)
1588
+{
1589
size_t units = 0, c = 0, prio = 0;
1587
- for(UnitInfo *u = base; u ; u = u->next)
1590
+ for (UnitInfo *u = base; u; u = u->next)
1591
units++;
1592
1593
UnitInfo *array[units];
1591
- for(UnitInfo *u = base; u ; u = u->next)
1594
+ for (UnitInfo *u = base; u; u = u->next)
1595
array[c++] = u;
1596
1597
qsort(array, units, sizeof(UnitInfo *), unit_info_compar);
1598
1596
- for(c = 0; c < units ; c++) {
1599
+ for (c = 0; c < units; c++) {
1600
array[c]->prio = prio++;
1601
system_unit_severity(array[c]);
1602
systemd_unit_priority(array[c], units);
1603
}
1604
}
1605
1603
-void function_systemd_units(const char *transaction, char *function,
1604
- usec_t *stop_monotonic_ut __maybe_unused, bool *cancelled __maybe_unused,
1605
- BUFFER *payload __maybe_unused, HTTP_ACCESS access __maybe_unused,
1606
- const char *source __maybe_unused, void *data __maybe_unused) {
1607
- char *words[SYSTEMD_UNITS_MAX_PARAMS] = { NULL };
1608
- size_t num_words = quoted_strings_splitter_whitespace(function, words, SYSTEMD_UNITS_MAX_PARAMS);
1609
- for(int i = 1; i < SYSTEMD_UNITS_MAX_PARAMS ;i++) {
1606
+void function_systemd_units(
1607
+ const char *transaction,
1608
+ char *function,
1609
+ usec_t *stop_monotonic_ut __maybe_unused,
1610
+ bool *cancelled __maybe_unused,
1611
+ BUFFER *payload __maybe_unused,
1612
+ HTTP_ACCESS access __maybe_unused,
1613
+ const char *source __maybe_unused,
1614
+ void *data __maybe_unused)
1615
+{
1616
+ char *words[ND_SD_UNITS_MAX_PARAMS] = {NULL};
1617
+ size_t num_words = quoted_strings_splitter_whitespace(function, words, ND_SD_UNITS_MAX_PARAMS);
1618
+ for (int i = 1; i < ND_SD_UNITS_MAX_PARAMS; i++) {
1619
char *keyword = get_word(words, num_words, i);
1611
- if(!keyword) break;
1620
+ if (!keyword)
1621
+ break;
1622
1613
- if(strcmp(keyword, "info") == 0) {
1623
+ if (strcmp(keyword, "info") == 0) {
1624
netdata_systemd_units_function_info(transaction);
1625
return;
1616
- }
1617
- else if(strcmp(keyword, "help") == 0) {
1626
+ } else if (strcmp(keyword, "help") == 0) {
1627
netdata_systemd_units_function_help(transaction);
1628
return;
1629
}
1638
buffer_json_member_add_uint64(wb, "status", HTTP_RESP_OK);
1639
buffer_json_member_add_string(wb, "type", "table");
1640
buffer_json_member_add_time_t(wb, "update_every", 10);
1632
- buffer_json_member_add_string(wb, "help", SYSTEMD_UNITS_FUNCTION_DESCRIPTION);
1641
+ buffer_json_member_add_string(wb, "help", ND_SD_UNITS_FUNCTION_DESCRIPTION);
1642
buffer_json_member_add_array(wb, "data");
1643
1635
- size_t count[_UNIT_ATTRIBUTE_MAX] = { 0 };
1644
+ size_t count[_UNIT_ATTRIBUTE_MAX] = {0};
1645
struct UnitAttribute max[_UNIT_ATTRIBUTE_MAX];
1646
1638
- for(UnitInfo *u = base; u ;u = u->next) {
1647
+ for (UnitInfo *u = base; u; u = u->next) {
1648
buffer_json_add_array_item_array(wb);
1649
{
1650
buffer_json_add_array_item_string(wb, u->id);
1666
buffer_json_add_array_item_string(wb, u->job_type);
1667
buffer_json_add_array_item_string(wb, u->job_path);
1668
1660
- for(ssize_t i = 0; i < (ssize_t)_UNIT_ATTRIBUTE_MAX ;i++) {
1661
- switch(unit_attributes[i].value_type) {
1669
+ for (ssize_t i = 0; i < (ssize_t)_UNIT_ATTRIBUTE_MAX; i++) {
1670
+ switch (unit_attributes[i].value_type) {
1671
case SD_BUS_TYPE_OBJECT_PATH:
1672
case SD_BUS_TYPE_STRING:
1664
- buffer_json_add_array_item_string(wb, u->attributes[i].str && *u->attributes[i].str ? u->attributes[i].str : "-");
1673
+ buffer_json_add_array_item_string(
1674
+ wb, u->attributes[i].str && *u->attributes[i].str ? u->attributes[i].str : "-");
1675
break;
1676
1677
case SD_BUS_TYPE_UINT64:
1678
buffer_json_add_array_item_uint64(wb, u->attributes[i].uint64);
1669
- if(!count[i]++) max[i].uint64 = 0;
1679
+ if (!count[i]++)
1680
+ max[i].uint64 = 0;
1681
max[i].uint64 = MAX(max[i].uint64, u->attributes[i].uint64);
1682
break;
1683
1684
case SD_BUS_TYPE_UINT32:
1685
buffer_json_add_array_item_uint64(wb, u->attributes[i].uint32);
1675
- if(!count[i]++) max[i].uint32 = 0;
1686
+ if (!count[i]++)
1687
+ max[i].uint32 = 0;
1688
max[i].uint32 = MAX(max[i].uint32, u->attributes[i].uint32);
1689
break;
1690
1691
case SD_BUS_TYPE_INT64:
1692
buffer_json_add_array_item_uint64(wb, u->attributes[i].int64);
1681
- if(!count[i]++) max[i].uint64 = 0;
1693
+ if (!count[i]++)
1694
+ max[i].uint64 = 0;
1695
max[i].int64 = MAX(max[i].int64, u->attributes[i].int64);
1696
break;
1697
1698
case SD_BUS_TYPE_INT32:
1699
buffer_json_add_array_item_uint64(wb, u->attributes[i].int32);
1687
- if(!count[i]++) max[i].int32 = 0;
1700
+ if (!count[i]++)
1701
+ max[i].int32 = 0;
1702
max[i].int32 = MAX(max[i].int32, u->attributes[i].int32);
1703
break;
1704
1705
case SD_BUS_TYPE_DOUBLE:
1706
buffer_json_add_array_item_double(wb, u->attributes[i].dbl);
1693
- if(!count[i]++) max[i].dbl = 0.0;
1707
+ if (!count[i]++)
1708
+ max[i].dbl = 0.0;
1709
max[i].dbl = MAX(max[i].dbl, u->attributes[i].dbl);
1710
break;
1711
1730
{
1731
size_t field_id = 0;
1732
1718
- buffer_rrdf_table_add_field(wb, field_id++, "id", "Unit ID",
1719
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1720
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1721
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1722
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1723
- NULL);
1733
+ buffer_rrdf_table_add_field(
1734
+ wb,
1735
+ field_id++,
1736
+ "id",
1737
+ "Unit ID",
1738
+ RRDF_FIELD_TYPE_STRING,
1739
+ RRDF_FIELD_VISUAL_VALUE,
1740
+ RRDF_FIELD_TRANSFORM_NONE,
1741
+ 0,
1742
+ NULL,
1743
+ NAN,
1744
+ RRDF_FIELD_SORT_ASCENDING,
1745
+ NULL,
1746
+ RRDF_FIELD_SUMMARY_COUNT,
1747
+ RRDF_FIELD_FILTER_NONE,
1748
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1749
+ NULL);
1750
+
1751
+ buffer_rrdf_table_add_field(
1752
+ wb,
1753
+ field_id++,
1754
+ "rowOptions",
1755
+ "rowOptions",
1756
+ RRDF_FIELD_TYPE_NONE,
1757
+ RRDR_FIELD_VISUAL_ROW_OPTIONS,
1758
+ RRDF_FIELD_TRANSFORM_NONE,
1759
+ 0,
1760
+ NULL,
1761
+ NAN,
1762
+ RRDF_FIELD_SORT_FIXED,
1763
+ NULL,
1764
+ RRDF_FIELD_SUMMARY_COUNT,
1765
+ RRDF_FIELD_FILTER_NONE,
1766
+ RRDF_FIELD_OPTS_DUMMY,
1767
+ NULL);
1768
1769
buffer_rrdf_table_add_field(
1726
- wb, field_id++,
1727
- "rowOptions", "rowOptions",
1728
- RRDF_FIELD_TYPE_NONE,
1729
- RRDR_FIELD_VISUAL_ROW_OPTIONS,
1730
- RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
1731
- RRDF_FIELD_SORT_FIXED,
1732
- NULL,
1733
- RRDF_FIELD_SUMMARY_COUNT,
1734
- RRDF_FIELD_FILTER_NONE,
1735
- RRDF_FIELD_OPTS_DUMMY,
1736
- NULL);
1737
-
1738
- buffer_rrdf_table_add_field(wb, field_id++, "type", "Unit Type",
1739
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1740
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1741
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_MULTISELECT,
1742
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1743
- NULL);
1744
-
1745
- buffer_rrdf_table_add_field(wb, field_id++, "description", "Unit Description",
1746
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1747
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1748
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1749
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1750
- NULL);
1751
-
1752
- buffer_rrdf_table_add_field(wb, field_id++, "loadState", "Unit Load State",
1753
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1754
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1755
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_MULTISELECT,
1756
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1757
- NULL);
1758
-
1759
- buffer_rrdf_table_add_field(wb, field_id++, "activeState", "Unit Active State",
1760
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1761
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1762
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_MULTISELECT,
1763
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1764
- NULL);
1765
-
1766
- buffer_rrdf_table_add_field(wb, field_id++, "subState", "Unit Sub State",
1767
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1768
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1769
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_MULTISELECT,
1770
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1771
- NULL);
1772
-
1773
- buffer_rrdf_table_add_field(wb, field_id++, "following", "Unit Following",
1774
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1775
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1776
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1777
- RRDF_FIELD_OPTS_WRAP,
1778
- NULL);
1779
-
1780
- buffer_rrdf_table_add_field(wb, field_id++, "path", "Unit Path",
1781
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1782
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1783
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1784
- RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1785
- NULL);
1786
-
1787
- buffer_rrdf_table_add_field(wb, field_id++, "jobId", "Unit Job ID",
1788
- RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1789
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1790
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1791
- RRDF_FIELD_OPTS_NONE,
1792
- NULL);
1793
-
1794
- buffer_rrdf_table_add_field(wb, field_id++, "jobType", "Unit Job Type",
1795
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1796
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1797
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_MULTISELECT,
1798
- RRDF_FIELD_OPTS_NONE,
1799
- NULL);
1800
-
1801
- buffer_rrdf_table_add_field(wb, field_id++, "jobPath", "Unit Job Path",
1802
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1803
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1804
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1805
- RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1806
- NULL);
1807
-
1808
- for(ssize_t i = 0; i < (ssize_t)_UNIT_ATTRIBUTE_MAX ;i++) {
1770
+ wb,
1771
+ field_id++,
1772
+ "type",
1773
+ "Unit Type",
1774
+ RRDF_FIELD_TYPE_STRING,
1775
+ RRDF_FIELD_VISUAL_VALUE,
1776
+ RRDF_FIELD_TRANSFORM_NONE,
1777
+ 0,
1778
+ NULL,
1779
+ NAN,
1780
+ RRDF_FIELD_SORT_ASCENDING,
1781
+ NULL,
1782
+ RRDF_FIELD_SUMMARY_COUNT,
1783
+ RRDF_FIELD_FILTER_MULTISELECT,
1784
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1785
+ NULL);
1786
+
1787
+ buffer_rrdf_table_add_field(
1788
+ wb,
1789
+ field_id++,
1790
+ "description",
1791
+ "Unit Description",
1792
+ RRDF_FIELD_TYPE_STRING,
1793
+ RRDF_FIELD_VISUAL_VALUE,
1794
+ RRDF_FIELD_TRANSFORM_NONE,
1795
+ 0,
1796
+ NULL,
1797
+ NAN,
1798
+ RRDF_FIELD_SORT_ASCENDING,
1799
+ NULL,
1800
+ RRDF_FIELD_SUMMARY_COUNT,
1801
+ RRDF_FIELD_FILTER_NONE,
1802
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1803
+ NULL);
1804
+
1805
+ buffer_rrdf_table_add_field(
1806
+ wb,
1807
+ field_id++,
1808
+ "loadState",
1809
+ "Unit Load State",
1810
+ RRDF_FIELD_TYPE_STRING,
1811
+ RRDF_FIELD_VISUAL_VALUE,
1812
+ RRDF_FIELD_TRANSFORM_NONE,
1813
+ 0,
1814
+ NULL,
1815
+ NAN,
1816
+ RRDF_FIELD_SORT_ASCENDING,
1817
+ NULL,
1818
+ RRDF_FIELD_SUMMARY_COUNT,
1819
+ RRDF_FIELD_FILTER_MULTISELECT,
1820
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1821
+ NULL);
1822
+
1823
+ buffer_rrdf_table_add_field(
1824
+ wb,
1825
+ field_id++,
1826
+ "activeState",
1827
+ "Unit Active State",
1828
+ RRDF_FIELD_TYPE_STRING,
1829
+ RRDF_FIELD_VISUAL_VALUE,
1830
+ RRDF_FIELD_TRANSFORM_NONE,
1831
+ 0,
1832
+ NULL,
1833
+ NAN,
1834
+ RRDF_FIELD_SORT_ASCENDING,
1835
+ NULL,
1836
+ RRDF_FIELD_SUMMARY_COUNT,
1837
+ RRDF_FIELD_FILTER_MULTISELECT,
1838
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1839
+ NULL);
1840
+
1841
+ buffer_rrdf_table_add_field(
1842
+ wb,
1843
+ field_id++,
1844
+ "subState",
1845
+ "Unit Sub State",
1846
+ RRDF_FIELD_TYPE_STRING,
1847
+ RRDF_FIELD_VISUAL_VALUE,
1848
+ RRDF_FIELD_TRANSFORM_NONE,
1849
+ 0,
1850
+ NULL,
1851
+ NAN,
1852
+ RRDF_FIELD_SORT_ASCENDING,
1853
+ NULL,
1854
+ RRDF_FIELD_SUMMARY_COUNT,
1855
+ RRDF_FIELD_FILTER_MULTISELECT,
1856
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_EXPANDED_FILTER,
1857
+ NULL);
1858
+
1859
+ buffer_rrdf_table_add_field(
1860
+ wb,
1861
+ field_id++,
1862
+ "following",
1863
+ "Unit Following",
1864
+ RRDF_FIELD_TYPE_STRING,
1865
+ RRDF_FIELD_VISUAL_VALUE,
1866
+ RRDF_FIELD_TRANSFORM_NONE,
1867
+ 0,
1868
+ NULL,
1869
+ NAN,
1870
+ RRDF_FIELD_SORT_ASCENDING,
1871
+ NULL,
1872
+ RRDF_FIELD_SUMMARY_COUNT,
1873
+ RRDF_FIELD_FILTER_NONE,
1874
+ RRDF_FIELD_OPTS_WRAP,
1875
+ NULL);
1876
+
1877
+ buffer_rrdf_table_add_field(
1878
+ wb,
1879
+ field_id++,
1880
+ "path",
1881
+ "Unit Path",
1882
+ RRDF_FIELD_TYPE_STRING,
1883
+ RRDF_FIELD_VISUAL_VALUE,
1884
+ RRDF_FIELD_TRANSFORM_NONE,
1885
+ 0,
1886
+ NULL,
1887
+ NAN,
1888
+ RRDF_FIELD_SORT_ASCENDING,
1889
+ NULL,
1890
+ RRDF_FIELD_SUMMARY_COUNT,
1891
+ RRDF_FIELD_FILTER_NONE,
1892
+ RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1893
+ NULL);
1894
+
1895
+ buffer_rrdf_table_add_field(
1896
+ wb,
1897
+ field_id++,
1898
+ "jobId",
1899
+ "Unit Job ID",
1900
+ RRDF_FIELD_TYPE_INTEGER,
1901
+ RRDF_FIELD_VISUAL_VALUE,
1902
+ RRDF_FIELD_TRANSFORM_NONE,
1903
+ 0,
1904
+ NULL,
1905
+ NAN,
1906
+ RRDF_FIELD_SORT_ASCENDING,
1907
+ NULL,
1908
+ RRDF_FIELD_SUMMARY_COUNT,
1909
+ RRDF_FIELD_FILTER_NONE,
1910
+ RRDF_FIELD_OPTS_NONE,
1911
+ NULL);
1912
+
1913
+ buffer_rrdf_table_add_field(
1914
+ wb,
1915
+ field_id++,
1916
+ "jobType",
1917
+ "Unit Job Type",
1918
+ RRDF_FIELD_TYPE_STRING,
1919
+ RRDF_FIELD_VISUAL_VALUE,
1920
+ RRDF_FIELD_TRANSFORM_NONE,
1921
+ 0,
1922
+ NULL,
1923
+ NAN,
1924
+ RRDF_FIELD_SORT_ASCENDING,
1925
+ NULL,
1926
+ RRDF_FIELD_SUMMARY_COUNT,
1927
+ RRDF_FIELD_FILTER_MULTISELECT,
1928
+ RRDF_FIELD_OPTS_NONE,
1929
+ NULL);
1930
+
1931
+ buffer_rrdf_table_add_field(
1932
+ wb,
1933
+ field_id++,
1934
+ "jobPath",
1935
+ "Unit Job Path",
1936
+ RRDF_FIELD_TYPE_STRING,
1937
+ RRDF_FIELD_VISUAL_VALUE,
1938
+ RRDF_FIELD_TRANSFORM_NONE,
1939
+ 0,
1940
+ NULL,
1941
+ NAN,
1942
+ RRDF_FIELD_SORT_ASCENDING,
1943
+ NULL,
1944
+ RRDF_FIELD_SUMMARY_COUNT,
1945
+ RRDF_FIELD_FILTER_NONE,
1946
+ RRDF_FIELD_OPTS_WRAP | RRDF_FIELD_OPTS_FULL_WIDTH,
1947
+ NULL);
1948
+
1949
+ for (ssize_t i = 0; i < (ssize_t)_UNIT_ATTRIBUTE_MAX; i++) {
1950
char key[256], name[256];
1951
1811
- if(unit_attributes[i].show_as)
1952
+ if (unit_attributes[i].show_as)
1953
snprintfz(key, sizeof(key), "%s", unit_attributes[i].show_as);
1954
else
1955
snprintfz(key, sizeof(key), "attribute%s", unit_property_name_to_string_from_slot(i));
1956
1816
- if(unit_attributes[i].info)
1957
+ if (unit_attributes[i].info)
1958
snprintfz(name, sizeof(name), "%s", unit_attributes[i].info);
1959
else
1960
snprintfz(name, sizeof(name), "Attribute %s", unit_property_name_to_string_from_slot(i));
1962
RRDF_FIELD_OPTIONS options = unit_attributes[i].options;
1963
RRDF_FIELD_FILTER filter = unit_attributes[i].filter;
1964
1824
- switch(unit_attributes[i].value_type) {
1965
+ switch (unit_attributes[i].value_type) {
1966
case SD_BUS_TYPE_OBJECT_PATH:
1967
case SD_BUS_TYPE_STRING:
1827
- buffer_rrdf_table_add_field(wb, field_id++, key, name,
1828
- RRDF_FIELD_TYPE_STRING, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1829
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1830
- RRDF_FIELD_SUMMARY_COUNT, filter,
1831
- RRDF_FIELD_OPTS_WRAP | options,
1832
- NULL);
1968
+ buffer_rrdf_table_add_field(
1969
+ wb,
1970
+ field_id++,
1971
+ key,
1972
+ name,
1973
+ RRDF_FIELD_TYPE_STRING,
1974
+ RRDF_FIELD_VISUAL_VALUE,
1975
+ RRDF_FIELD_TRANSFORM_NONE,
1976
+ 0,
1977
+ NULL,
1978
+ NAN,
1979
+ RRDF_FIELD_SORT_ASCENDING,
1980
+ NULL,
1981
+ RRDF_FIELD_SUMMARY_COUNT,
1982
+ filter,
1983
+ RRDF_FIELD_OPTS_WRAP | options,
1984
+ NULL);
1985
break;
1986
1987
case SD_BUS_TYPE_INT32:
1989
case SD_BUS_TYPE_INT64:
1990
case SD_BUS_TYPE_UINT64: {
1991
double m = 0.0;
1840
- if(unit_attributes[i].value_type == SD_BUS_TYPE_UINT64)
1992
+ if (unit_attributes[i].value_type == SD_BUS_TYPE_UINT64)
1993
m = (double)max[i].uint64;
1842
- else if(unit_attributes[i].value_type == SD_BUS_TYPE_INT64)
1994
+ else if (unit_attributes[i].value_type == SD_BUS_TYPE_INT64)
1995
m = (double)max[i].int64;
1844
- else if(unit_attributes[i].value_type == SD_BUS_TYPE_UINT32)
1996
+ else if (unit_attributes[i].value_type == SD_BUS_TYPE_UINT32)
1997
m = (double)max[i].uint32;
1846
- else if(unit_attributes[i].value_type == SD_BUS_TYPE_INT32)
1998
+ else if (unit_attributes[i].value_type == SD_BUS_TYPE_INT32)
1999
m = (double)max[i].int32;
2000
1849
- buffer_rrdf_table_add_field(wb, field_id++, key, name,
1850
- RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1851
- 0, NULL, m, RRDF_FIELD_SORT_ASCENDING, NULL,
1852
- RRDF_FIELD_SUMMARY_SUM, filter,
1853
- RRDF_FIELD_OPTS_WRAP | options,
1854
- NULL);
1855
- }
1856
- break;
2001
+ buffer_rrdf_table_add_field(
2002
+ wb,
2003
+ field_id++,
2004
+ key,
2005
+ name,
2006
+ RRDF_FIELD_TYPE_INTEGER,
2007
+ RRDF_FIELD_VISUAL_VALUE,
2008
+ RRDF_FIELD_TRANSFORM_NONE,
2009
+ 0,
2010
+ NULL,
2011
+ m,
2012
+ RRDF_FIELD_SORT_ASCENDING,
2013
+ NULL,
2014
+ RRDF_FIELD_SUMMARY_SUM,
2015
+ filter,
2016
+ RRDF_FIELD_OPTS_WRAP | options,
2017
+ NULL);
2018
+ } break;
2019
2020
case SD_BUS_TYPE_DOUBLE:
1859
- buffer_rrdf_table_add_field(wb, field_id++, key, name,
1860
- RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1861
- 2, NULL, max[i].dbl, RRDF_FIELD_SORT_ASCENDING, NULL,
1862
- RRDF_FIELD_SUMMARY_SUM, filter,
1863
- RRDF_FIELD_OPTS_WRAP | options,
1864
- NULL);
2021
+ buffer_rrdf_table_add_field(
2022
+ wb,
2023
+ field_id++,
2024
+ key,
2025
+ name,
2026
+ RRDF_FIELD_TYPE_INTEGER,
2027
+ RRDF_FIELD_VISUAL_VALUE,
2028
+ RRDF_FIELD_TRANSFORM_NONE,
2029
+ 2,
2030
+ NULL,
2031
+ max[i].dbl,
2032
+ RRDF_FIELD_SORT_ASCENDING,
2033
+ NULL,
2034
+ RRDF_FIELD_SUMMARY_SUM,
2035
+ filter,
2036
+ RRDF_FIELD_OPTS_WRAP | options,
2037
+ NULL);
2038
break;
2039
2040
case SD_BUS_TYPE_BOOLEAN:
1868
- buffer_rrdf_table_add_field(wb, field_id++, key, name,
1869
- RRDF_FIELD_TYPE_BOOLEAN, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1870
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1871
- RRDF_FIELD_SUMMARY_COUNT, filter,
1872
- RRDF_FIELD_OPTS_WRAP | options,
1873
- NULL);
2041
+ buffer_rrdf_table_add_field(
2042
+ wb,
2043
+ field_id++,
2044
+ key,
2045
+ name,
2046
+ RRDF_FIELD_TYPE_BOOLEAN,
2047
+ RRDF_FIELD_VISUAL_VALUE,
2048
+ RRDF_FIELD_TRANSFORM_NONE,
2049
+ 0,
2050
+ NULL,
2051
+ NAN,
2052
+ RRDF_FIELD_SORT_ASCENDING,
2053
+ NULL,
2054
+ RRDF_FIELD_SUMMARY_COUNT,
2055
+ filter,
2056
+ RRDF_FIELD_OPTS_WRAP | options,
2057
+ NULL);
2058
break;
2059
2060
default:
2061
break;
2062
}
1879
-
2063
}
2064
1882
- buffer_rrdf_table_add_field(wb, field_id++, "priority", "Priority",
1883
- RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1884
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1885
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1886
- RRDF_FIELD_OPTS_NONE,
1887
- NULL);
1888
-
1889
- buffer_rrdf_table_add_field(wb, field_id++, "count", "Count",
1890
- RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE,
1891
- 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL,
1892
- RRDF_FIELD_SUMMARY_COUNT, RRDF_FIELD_FILTER_NONE,
1893
- RRDF_FIELD_OPTS_NONE,
1894
- NULL);
2065
+ buffer_rrdf_table_add_field(
2066
+ wb,
2067
+ field_id++,
2068
+ "priority",
2069
+ "Priority",
2070
+ RRDF_FIELD_TYPE_INTEGER,
2071
+ RRDF_FIELD_VISUAL_VALUE,
2072
+ RRDF_FIELD_TRANSFORM_NONE,
2073
+ 0,
2074
+ NULL,
2075
+ NAN,
2076
+ RRDF_FIELD_SORT_ASCENDING,
2077
+ NULL,
2078
+ RRDF_FIELD_SUMMARY_COUNT,
2079
+ RRDF_FIELD_FILTER_NONE,
2080
+ RRDF_FIELD_OPTS_NONE,
2081
+ NULL);
2082
+
2083
+ buffer_rrdf_table_add_field(
2084
+ wb,
2085
+ field_id++,
2086
+ "count",
2087
+ "Count",
2088
+ RRDF_FIELD_TYPE_INTEGER,
2089
+ RRDF_FIELD_VISUAL_VALUE,
2090
+ RRDF_FIELD_TRANSFORM_NONE,
2091
+ 0,
2092
+ NULL,
2093
+ NAN,
2094
+ RRDF_FIELD_SORT_ASCENDING,
2095
+ NULL,
2096
+ RRDF_FIELD_SUMMARY_COUNT,
2097
+ RRDF_FIELD_FILTER_NONE,
2098
+ RRDF_FIELD_OPTS_NONE,
2099
+ NULL);
2100
}
2101
2102
buffer_json_object_close(wb); // columns