chiark / gitweb /
exec: Ignore the setting SELinuxContext if selinux is not enabled
[elogind.git] / src / core / unit.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2010 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include <stdbool.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27
28 typedef struct Unit Unit;
29 typedef struct UnitVTable UnitVTable;
30 typedef enum UnitActiveState UnitActiveState;
31 typedef enum UnitDependency UnitDependency;
32 typedef struct UnitRef UnitRef;
33 typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
34
35 #include "sd-event.h"
36 #include "set.h"
37 #include "util.h"
38 #include "list.h"
39 #include "socket-util.h"
40 #include "execute.h"
41 #include "cgroup.h"
42 #include "condition.h"
43 #include "install.h"
44 #include "unit-name.h"
45
46 enum UnitActiveState {
47         UNIT_ACTIVE,
48         UNIT_RELOADING,
49         UNIT_INACTIVE,
50         UNIT_FAILED,
51         UNIT_ACTIVATING,
52         UNIT_DEACTIVATING,
53         _UNIT_ACTIVE_STATE_MAX,
54         _UNIT_ACTIVE_STATE_INVALID = -1
55 };
56
57 static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
58         return t == UNIT_ACTIVE || t == UNIT_RELOADING;
59 }
60
61 static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
62         return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
63 }
64
65 static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
66         return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
67 }
68
69 static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
70         return t == UNIT_INACTIVE || t == UNIT_FAILED;
71 }
72
73 enum UnitDependency {
74         /* Positive dependencies */
75         UNIT_REQUIRES,
76         UNIT_REQUIRES_OVERRIDABLE,
77         UNIT_REQUISITE,
78         UNIT_REQUISITE_OVERRIDABLE,
79         UNIT_WANTS,
80         UNIT_BINDS_TO,
81         UNIT_PART_OF,
82
83         /* Inverse of the above */
84         UNIT_REQUIRED_BY,             /* inverse of 'requires' and 'requisite' is 'required_by' */
85         UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' and 'requisite_overridable' is 'soft_required_by' */
86         UNIT_WANTED_BY,               /* inverse of 'wants' */
87         UNIT_BOUND_BY,                /* inverse of 'binds_to' */
88         UNIT_CONSISTS_OF,             /* inverse of 'part_of' */
89
90         /* Negative dependencies */
91         UNIT_CONFLICTS,               /* inverse of 'conflicts' is 'conflicted_by' */
92         UNIT_CONFLICTED_BY,
93
94         /* Order */
95         UNIT_BEFORE,                  /* inverse of 'before' is 'after' and vice versa */
96         UNIT_AFTER,
97
98         /* On Failure */
99         UNIT_ON_FAILURE,
100
101         /* Triggers (i.e. a socket triggers a service) */
102         UNIT_TRIGGERS,
103         UNIT_TRIGGERED_BY,
104
105         /* Propagate reloads */
106         UNIT_PROPAGATES_RELOAD_TO,
107         UNIT_RELOAD_PROPAGATED_FROM,
108
109         /* Joins namespace of */
110         UNIT_JOINS_NAMESPACE_OF,
111
112         /* Reference information for GC logic */
113         UNIT_REFERENCES,              /* Inverse of 'references' is 'referenced_by' */
114         UNIT_REFERENCED_BY,
115
116         _UNIT_DEPENDENCY_MAX,
117         _UNIT_DEPENDENCY_INVALID = -1
118 };
119
120 #include "manager.h"
121 #include "job.h"
122
123 struct UnitRef {
124         /* Keeps tracks of references to a unit. This is useful so
125          * that we can merge two units if necessary and correct all
126          * references to them */
127
128         Unit* unit;
129         LIST_FIELDS(UnitRef, refs);
130 };
131
132 struct Unit {
133         Manager *manager;
134
135         UnitType type;
136         UnitLoadState load_state;
137         Unit *merged_into;
138
139         char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
140         char *instance;
141
142         Set *names;
143         Set *dependencies[_UNIT_DEPENDENCY_MAX];
144
145         char **requires_mounts_for;
146
147         char *description;
148         char **documentation;
149
150         char *fragment_path; /* if loaded from a config file this is the primary path to it */
151         char *source_path; /* if converted, the source file */
152         char **dropin_paths;
153         usec_t fragment_mtime;
154         usec_t source_mtime;
155         usec_t dropin_mtime;
156
157         /* If there is something to do with this unit, then this is the installed job for it */
158         Job *job;
159
160         /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
161         Job *nop_job;
162
163         usec_t job_timeout;
164
165         /* References to this */
166         LIST_HEAD(UnitRef, refs);
167
168         /* Conditions to check */
169         LIST_HEAD(Condition, conditions);
170
171         dual_timestamp condition_timestamp;
172
173         dual_timestamp inactive_exit_timestamp;
174         dual_timestamp active_enter_timestamp;
175         dual_timestamp active_exit_timestamp;
176         dual_timestamp inactive_enter_timestamp;
177
178         /* Counterparts in the cgroup filesystem */
179         char *cgroup_path;
180         CGroupControllerMask cgroup_mask;
181         CGroupControllerMask cgroup_members_mask;
182
183         UnitRef slice;
184
185         /* Per type list */
186         LIST_FIELDS(Unit, units_by_type);
187
188         /* All units which have requires_mounts_for set */
189         LIST_FIELDS(Unit, has_requires_mounts_for);
190
191         /* Load queue */
192         LIST_FIELDS(Unit, load_queue);
193
194         /* D-Bus queue */
195         LIST_FIELDS(Unit, dbus_queue);
196
197         /* Cleanup queue */
198         LIST_FIELDS(Unit, cleanup_queue);
199
200         /* GC queue */
201         LIST_FIELDS(Unit, gc_queue);
202
203         /* CGroup realize members queue */
204         LIST_FIELDS(Unit, cgroup_queue);
205
206         /* PIDs we keep an eye on. Note that a unit might have many
207          * more, but these are the ones we care enough about to
208          * process SIGCHLD for */
209         Set *pids;
210
211         /* Used during GC sweeps */
212         unsigned gc_marker;
213
214         /* When deserializing, temporarily store the job type for this
215          * unit here, if there was a job scheduled.
216          * Only for deserializing from a legacy version. New style uses full
217          * serialized jobs. */
218         int deserialized_job; /* This is actually of type JobType */
219
220         /* Error code when we didn't manage to load the unit (negative) */
221         int load_error;
222
223         /* Cached unit file state */
224         UnitFileState unit_file_state;
225
226         /* Garbage collect us we nobody wants or requires us anymore */
227         bool stop_when_unneeded;
228
229         /* Create default dependencies */
230         bool default_dependencies;
231
232         /* Refuse manual starting, allow starting only indirectly via dependency. */
233         bool refuse_manual_start;
234
235         /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
236         bool refuse_manual_stop;
237
238         /* Allow isolation requests */
239         bool allow_isolate;
240
241         /* How to start OnFailure units */
242         JobMode on_failure_job_mode;
243
244         /* Ignore this unit when isolating */
245         bool ignore_on_isolate;
246
247         /* Ignore this unit when snapshotting */
248         bool ignore_on_snapshot;
249
250         /* Did the last condition check succeed? */
251         bool condition_result;
252
253         /* Is this a transient unit? */
254         bool transient;
255
256         bool in_load_queue:1;
257         bool in_dbus_queue:1;
258         bool in_cleanup_queue:1;
259         bool in_gc_queue:1;
260         bool in_cgroup_queue:1;
261
262         bool sent_dbus_new_signal:1;
263
264         bool no_gc:1;
265
266         bool in_audit:1;
267
268         bool cgroup_realized:1;
269 };
270
271 struct UnitStatusMessageFormats {
272         const char *starting_stopping[2];
273         const char *finished_start_job[_JOB_RESULT_MAX];
274         const char *finished_stop_job[_JOB_RESULT_MAX];
275 };
276
277 typedef enum UnitSetPropertiesMode {
278         UNIT_CHECK = 0,
279         UNIT_RUNTIME = 1,
280         UNIT_PERSISTENT = 2,
281 } UnitSetPropertiesMode;
282
283 #include "service.h"
284 #include "socket.h"
285 #include "busname.h"
286 #include "target.h"
287 #include "snapshot.h"
288 #include "device.h"
289 #include "mount.h"
290 #include "automount.h"
291 #include "swap.h"
292 #include "timer.h"
293 #include "path.h"
294 #include "slice.h"
295 #include "scope.h"
296
297 struct UnitVTable {
298         /* How much memory does an object of this unit type need */
299         size_t object_size;
300
301         /* If greater than 0, the offset into the object where
302          * ExecContext is found, if the unit type has that */
303         size_t exec_context_offset;
304
305         /* If greater than 0, the offset into the object where
306          * CGroupContext is found, if the unit type has that */
307         size_t cgroup_context_offset;
308
309         /* If greater than 0, the offset into the object where
310          * KillContext is found, if the unit type has that */
311         size_t kill_context_offset;
312
313         /* If greater than 0, the offset into the object where the
314          * pointer to ExecRuntime is found, if the unit type has
315          * that */
316         size_t exec_runtime_offset;
317
318         /* The name of the configuration file section with the private settings of this unit*/
319         const char *private_section;
320
321         /* Config file sections this unit type understands, separated
322          * by NUL chars */
323         const char *sections;
324
325         /* This should reset all type-specific variables. This should
326          * not allocate memory, and is called with zero-initialized
327          * data. It should hence only initialize variables that need
328          * to be set != 0. */
329         void (*init)(Unit *u);
330
331         /* This should free all type-specific variables. It should be
332          * idempotent. */
333         void (*done)(Unit *u);
334
335         /* Actually load data from disk. This may fail, and should set
336          * load_state to UNIT_LOADED, UNIT_MERGED or leave it at
337          * UNIT_STUB if no configuration could be found. */
338         int (*load)(Unit *u);
339
340         /* If a lot of units got created via enumerate(), this is
341          * where to actually set the state and call unit_notify(). */
342         int (*coldplug)(Unit *u);
343
344         void (*dump)(Unit *u, FILE *f, const char *prefix);
345
346         int (*start)(Unit *u);
347         int (*stop)(Unit *u);
348         int (*reload)(Unit *u);
349
350         int (*kill)(Unit *u, KillWho w, int signo, sd_bus_error *error);
351
352         bool (*can_reload)(Unit *u);
353
354         /* Write all data that cannot be restored from other sources
355          * away using unit_serialize_item() */
356         int (*serialize)(Unit *u, FILE *f, FDSet *fds);
357
358         /* Restore one item from the serialization */
359         int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds);
360
361         /* Try to match up fds with what we need for this unit */
362         int (*distribute_fds)(Unit *u, FDSet *fds);
363
364         /* Boils down the more complex internal state of this unit to
365          * a simpler one that the engine can understand */
366         UnitActiveState (*active_state)(Unit *u);
367
368         /* Returns the substate specific to this unit type as
369          * string. This is purely information so that we can give the
370          * user a more fine grained explanation in which actual state a
371          * unit is in. */
372         const char* (*sub_state_to_string)(Unit *u);
373
374         /* Return true when there is reason to keep this entry around
375          * even nothing references it and it isn't active in any
376          * way */
377         bool (*check_gc)(Unit *u);
378
379         /* Return true when this unit is suitable for snapshotting */
380         bool (*check_snapshot)(Unit *u);
381
382         /* Invoked on every child that died */
383         void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
384
385         /* Reset failed state if we are in failed state */
386         void (*reset_failed)(Unit *u);
387
388         /* Called whenever any of the cgroups this unit watches for
389          * ran empty */
390         void (*notify_cgroup_empty)(Unit *u);
391
392         /* Called whenever a process of this unit sends us a message */
393         void (*notify_message)(Unit *u, pid_t pid, char **tags);
394
395         /* Called whenever a name this Unit registered for comes or
396          * goes away. */
397         void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
398
399         /* Called for each property that is being set */
400         int (*bus_set_property)(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
401
402         /* Called after at least one property got changed to apply the necessary change */
403         int (*bus_commit_properties)(Unit *u);
404
405         /* Return the unit this unit is following */
406         Unit *(*following)(Unit *u);
407
408         /* Return the set of units that are following each other */
409         int (*following_set)(Unit *u, Set **s);
410
411         /* Invoked each time a unit this unit is triggering changes
412          * state or gains/loses a job */
413         void (*trigger_notify)(Unit *u, Unit *trigger);
414
415         /* Called whenever CLOCK_REALTIME made a jump */
416         void (*time_change)(Unit *u);
417
418         int (*get_timeout)(Unit *u, uint64_t *timeout);
419
420         /* This is called for each unit type and should be used to
421          * enumerate existing devices and load them. However,
422          * everything that is loaded here should still stay in
423          * inactive state. It is the job of the coldplug() call above
424          * to put the units into the initial state.  */
425         int (*enumerate)(Manager *m);
426
427         /* Type specific cleanups. */
428         void (*shutdown)(Manager *m);
429
430         /* The interface name */
431         const char *bus_interface;
432
433         /* The bus vtable */
434         const sd_bus_vtable *bus_vtable;
435
436         /* The strings to print in status messages */
437         UnitStatusMessageFormats status_message_formats;
438
439         /* Can units of this type have multiple names? */
440         bool no_alias:1;
441
442         /* Instances make no sense for this type */
443         bool no_instances:1;
444
445         /* Exclude from automatic gc */
446         bool no_gc:1;
447
448         /* True if transient units of this type are OK */
449         bool can_transient:1;
450 };
451
452 extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
453
454 #define UNIT_VTABLE(u) unit_vtable[(u)->type]
455
456 /* For casting a unit into the various unit types */
457 #define DEFINE_CAST(UPPERCASE, MixedCase)                               \
458         static inline MixedCase* UPPERCASE(Unit *u) {                   \
459                 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE))      \
460                         return NULL;                                    \
461                                                                         \
462                 return (MixedCase*) u;                                  \
463         }
464
465 /* For casting the various unit types into a unit */
466 #define UNIT(u) (&(u)->meta)
467
468 #define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS]))
469
470 DEFINE_CAST(SERVICE, Service);
471 DEFINE_CAST(SOCKET, Socket);
472 DEFINE_CAST(BUSNAME, BusName);
473 DEFINE_CAST(TARGET, Target);
474 DEFINE_CAST(SNAPSHOT, Snapshot);
475 DEFINE_CAST(DEVICE, Device);
476 DEFINE_CAST(MOUNT, Mount);
477 DEFINE_CAST(AUTOMOUNT, Automount);
478 DEFINE_CAST(SWAP, Swap);
479 DEFINE_CAST(TIMER, Timer);
480 DEFINE_CAST(PATH, Path);
481 DEFINE_CAST(SLICE, Slice);
482 DEFINE_CAST(SCOPE, Scope);
483
484 Unit *unit_new(Manager *m, size_t size);
485 void unit_free(Unit *u);
486
487 int unit_add_name(Unit *u, const char *name);
488
489 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
490 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
491
492 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
493 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
494
495 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
496 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
497
498 int unit_add_exec_dependencies(Unit *u, ExecContext *c);
499
500 int unit_choose_id(Unit *u, const char *name);
501 int unit_set_description(Unit *u, const char *description);
502
503 bool unit_check_gc(Unit *u);
504
505 void unit_add_to_load_queue(Unit *u);
506 void unit_add_to_dbus_queue(Unit *u);
507 void unit_add_to_cleanup_queue(Unit *u);
508 void unit_add_to_gc_queue(Unit *u);
509
510 int unit_merge(Unit *u, Unit *other);
511 int unit_merge_by_name(Unit *u, const char *other);
512
513 Unit *unit_follow_merge(Unit *u) _pure_;
514
515 int unit_load_fragment_and_dropin(Unit *u);
516 int unit_load_fragment_and_dropin_optional(Unit *u);
517 int unit_load(Unit *unit);
518
519 int unit_add_default_slice(Unit *u);
520
521 const char *unit_description(Unit *u) _pure_;
522
523 bool unit_has_name(Unit *u, const char *name);
524
525 UnitActiveState unit_active_state(Unit *u);
526
527 const char* unit_sub_state_to_string(Unit *u);
528
529 void unit_dump(Unit *u, FILE *f, const char *prefix);
530
531 bool unit_can_reload(Unit *u) _pure_;
532 bool unit_can_start(Unit *u) _pure_;
533 bool unit_can_isolate(Unit *u) _pure_;
534
535 int unit_start(Unit *u);
536 int unit_stop(Unit *u);
537 int unit_reload(Unit *u);
538
539 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error);
540 int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t control_pid, sd_bus_error *error);
541
542 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
543
544 int unit_watch_pid(Unit *u, pid_t pid);
545 void unit_unwatch_pid(Unit *u, pid_t pid);
546 int unit_watch_all_pids(Unit *u);
547 void unit_unwatch_all_pids(Unit *u);
548
549 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
550
551 int unit_watch_bus_name(Unit *u, const char *name);
552 void unit_unwatch_bus_name(Unit *u, const char *name);
553
554 bool unit_job_is_applicable(Unit *u, JobType j);
555
556 int set_unit_path(const char *p);
557
558 char *unit_dbus_path(Unit *u);
559
560 int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
561
562 bool unit_can_serialize(Unit *u) _pure_;
563 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
564 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_(4,5);
565 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
566 int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
567
568 int unit_add_node_link(Unit *u, const char *what, bool wants);
569
570 int unit_coldplug(Unit *u);
571
572 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);
573
574 bool unit_need_daemon_reload(Unit *u);
575
576 void unit_reset_failed(Unit *u);
577
578 Unit *unit_following(Unit *u);
579 int unit_following_set(Unit *u, Set **s);
580
581 const char *unit_slice_name(Unit *u);
582
583 bool unit_stop_pending(Unit *u) _pure_;
584 bool unit_inactive_or_pending(Unit *u) _pure_;
585 bool unit_active_or_pending(Unit *u);
586
587 int unit_add_default_target_dependency(Unit *u, Unit *target);
588
589 char *unit_default_cgroup_path(Unit *u);
590
591 void unit_start_on_failure(Unit *u);
592 void unit_trigger_notify(Unit *u);
593
594 UnitFileState unit_get_unit_file_state(Unit *u);
595
596 Unit* unit_ref_set(UnitRef *ref, Unit *u);
597 void unit_ref_unset(UnitRef *ref);
598
599 #define UNIT_DEREF(ref) ((ref).unit)
600 #define UNIT_ISSET(ref) (!!(ref).unit)
601
602 int unit_exec_context_defaults(Unit *u, ExecContext *c);
603
604 ExecContext *unit_get_exec_context(Unit *u) _pure_;
605 KillContext *unit_get_kill_context(Unit *u) _pure_;
606 CGroupContext *unit_get_cgroup_context(Unit *u) _pure_;
607 ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_;
608
609 int unit_setup_exec_runtime(Unit *u);
610
611 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
612 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
613
614 int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
615 int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
616
617 int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name);
618
619 int unit_kill_context(Unit *u, KillContext *c, bool sigkill, pid_t main_pid, pid_t control_pid, bool main_pid_alien);
620
621 int unit_make_transient(Unit *u);
622
623 int unit_require_mounts_for(Unit *u, const char *path);
624
625 const char *unit_active_state_to_string(UnitActiveState i) _const_;
626 UnitActiveState unit_active_state_from_string(const char *s) _pure_;
627
628 const char *unit_dependency_to_string(UnitDependency i) _const_;
629 UnitDependency unit_dependency_from_string(const char *s) _pure_;
630
631 /* Macros which append UNIT= or USER_UNIT= to the message */
632
633 #define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__)
634 #define log_debug_unit(unit, ...)       log_full_unit(LOG_DEBUG, unit, __VA_ARGS__)
635 #define log_info_unit(unit, ...)        log_full_unit(LOG_INFO, unit, __VA_ARGS__)
636 #define log_notice_unit(unit, ...)      log_full_unit(LOG_NOTICE, unit, __VA_ARGS__)
637 #define log_warning_unit(unit, ...)     log_full_unit(LOG_WARNING, unit, __VA_ARGS__)
638 #define log_error_unit(unit, ...)       log_full_unit(LOG_ERR, unit, __VA_ARGS__)
639
640 #define log_struct_unit(level, unit, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__)