diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2011-03-25 05:07:20 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-03-28 23:00:00 +0200 |
commit | 2b583ce6576d4a074ce6f1570b3e60b65c64ae7d (patch) | |
tree | c5cfa0138219cc79a6412bb69abe13ece385009c /src | |
parent | 37f85e66e8f396b6f758e063531b95531aef628e (diff) |
use /run instead of /dev/.run
Instead of the /dev/.run trick we have currently implemented, we decided
to move the early-boot runtime dir to /run.
An existing /var/run directory is bind-mounted to /run. If /var/run is
already a symlink, no action is taken.
An existing /var/lock directory is bind-mounted to /run/lock.
If /var/lock is already a symlink, no action is taken.
To implement the directory vs. symlink logic, we have a:
ConditionPathIsDirectory=
now, which is used in the mount units.
Skipped mount unit in case of symlink:
$ systemctl status var-run.mount
var-run.mount - Runtime Directory
Loaded: loaded (/lib/systemd/system/var-run.mount)
Active: inactive (dead)
start condition failed at Fri, 25 Mar 2011 04:51:41 +0100; 6min ago
Where: /var/run
What: /run
CGroup: name=systemd:/system/var-run.mount
The systemd rpm needs to make sure to add something like:
%pre
mkdir -p -m0755 /run >/dev/null 2>&1 || :
or it needs to be added to filesystem.rpm.
Udev -git already uses /run if that exists, and is writable at bootup.
Otherwise it falls back to the current /dev/.udev.
Dracut and plymouth need to be adopted to switch from /dev/.run to run
too.
Cheers,
Kay
Diffstat (limited to 'src')
-rw-r--r-- | src/ask-password-api.c | 6 | ||||
-rw-r--r-- | src/cgroups-agent.c | 2 | ||||
-rw-r--r-- | src/condition.c | 8 | ||||
-rw-r--r-- | src/condition.h | 1 | ||||
-rw-r--r-- | src/conf-parser.c | 11 | ||||
-rw-r--r-- | src/conf-parser.h | 22 | ||||
-rw-r--r-- | src/dbus-common.c | 2 | ||||
-rw-r--r-- | src/dbus.c | 4 | ||||
-rw-r--r-- | src/execute.h | 2 | ||||
-rw-r--r-- | src/fsck.c | 2 | ||||
-rw-r--r-- | src/load-fragment.c | 354 | ||||
-rw-r--r-- | src/machine-id-setup.c | 14 | ||||
-rw-r--r-- | src/main.c | 34 | ||||
-rw-r--r-- | src/manager.c | 6 | ||||
-rw-r--r-- | src/mount-setup.c | 6 | ||||
-rw-r--r-- | src/mount.c | 4 | ||||
-rw-r--r-- | src/nspawn.c | 2 | ||||
-rw-r--r-- | src/path-lookup.c | 2 | ||||
-rw-r--r-- | src/quotacheck.c | 2 | ||||
-rw-r--r-- | src/readahead-collect.c | 4 | ||||
-rw-r--r-- | src/readahead-common.c | 14 | ||||
-rw-r--r-- | src/readahead-replay.c | 2 | ||||
-rw-r--r-- | src/sd-readahead.c | 10 | ||||
-rw-r--r-- | src/systemctl.c | 12 | ||||
-rw-r--r-- | src/tty-ask-password-agent.c | 24 |
25 files changed, 308 insertions, 242 deletions
diff --git a/src/ask-password-api.c b/src/ask-password-api.c index 9c3dad965e..5d17d4cd52 100644 --- a/src/ask-password-api.c +++ b/src/ask-password-api.c @@ -223,7 +223,7 @@ static int create_socket(char **name) { zero(sa); sa.un.sun_family = AF_UNIX; - snprintf(sa.un.sun_path, sizeof(sa.un.sun_path)-1, "/dev/.run/systemd/ask-password/sck.%llu", random_ull()); + snprintf(sa.un.sun_path, sizeof(sa.un.sun_path)-1, "/run/systemd/ask-password/sck.%llu", random_ull()); if (bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)) < 0) { r = -errno; @@ -265,7 +265,7 @@ int ask_password_agent( _FD_MAX }; - char temp[] = "/dev/.run/systemd/ask-password/tmp.XXXXXX"; + char temp[] = "/run/systemd/ask-password/tmp.XXXXXX"; char final[sizeof(temp)] = ""; int fd = -1, r; FILE *f = NULL; @@ -280,7 +280,7 @@ int ask_password_agent( sigset_add_many(&mask, SIGINT, SIGTERM, -1); assert_se(sigprocmask(SIG_BLOCK, &mask, &oldmask) == 0); - mkdir_p("/dev/.run/systemd/ask-password", 0755); + mkdir_p("/run/systemd/ask-password", 0755); if ((fd = mkostemp(temp, O_CLOEXEC|O_CREAT|O_WRONLY)) < 0) { log_error("Failed to create password file: %m"); diff --git a/src/cgroups-agent.c b/src/cgroups-agent.c index 18612eca3c..e0868b6137 100644 --- a/src/cgroups-agent.c +++ b/src/cgroups-agent.c @@ -49,7 +49,7 @@ int main(int argc, char *argv[]) { * this to avoid an activation loop when we start dbus when we * are called when the dbus service is shut down. */ - if (!(bus = dbus_connection_open_private("unix:path=/dev/.run/systemd/private", &error))) { + if (!(bus = dbus_connection_open_private("unix:path=/run/systemd/private", &error))) { #ifndef LEGACY dbus_error_free(&error); diff --git a/src/condition.c b/src/condition.c index 1dce276c00..61812c2570 100644 --- a/src/condition.c +++ b/src/condition.c @@ -134,6 +134,14 @@ bool condition_test(Condition *c) { case CONDITION_PATH_EXISTS: return (access(c->parameter, F_OK) >= 0) == !c->negate; + case CONDITION_PATH_IS_DIRECTORY: { + struct stat st; + + if (lstat(c->parameter, &st) < 0) + return !c->negate; + return S_ISDIR(st.st_mode) == !c->negate; + } + case CONDITION_DIRECTORY_NOT_EMPTY: { int k; diff --git a/src/condition.h b/src/condition.h index 0ce713bc16..9913c8c840 100644 --- a/src/condition.h +++ b/src/condition.h @@ -28,6 +28,7 @@ typedef enum ConditionType { CONDITION_PATH_EXISTS, + CONDITION_PATH_IS_DIRECTORY, CONDITION_DIRECTORY_NOT_EMPTY, CONDITION_KERNEL_COMMAND_LINE, CONDITION_VIRTUALIZATION, diff --git a/src/conf-parser.c b/src/conf-parser.c index aac64b29a3..a086cf7a02 100644 --- a/src/conf-parser.c +++ b/src/conf-parser.c @@ -61,7 +61,7 @@ static int next_assignment( if (!t->parse) return 0; - return t->parse(filename, line, section, lvalue, rvalue, t->data, userdata); + return t->parse(filename, line, section, lvalue, t->ltype, rvalue, t->data, userdata); } /* Warn about unknown non-extension fields. */ @@ -226,6 +226,7 @@ int config_parse_int( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -251,6 +252,7 @@ int config_parse_uint64( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -276,6 +278,7 @@ int config_parse_unsigned( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -301,6 +304,7 @@ int config_parse_size( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -328,6 +332,7 @@ int config_parse_bool( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -354,6 +359,7 @@ int config_parse_string( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -383,6 +389,7 @@ int config_parse_path( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -416,6 +423,7 @@ int config_parse_strv( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -468,6 +476,7 @@ int config_parse_path_strv( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { diff --git a/src/conf-parser.h b/src/conf-parser.h index 019b7afd13..3432695db7 100644 --- a/src/conf-parser.h +++ b/src/conf-parser.h @@ -28,12 +28,13 @@ /* An abstract parser for simple, line based, shallow configuration * files consisting of variable assignments only. */ -typedef int (*ConfigParserCallback)(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); +typedef int (*ConfigParserCallback)(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); /* Wraps info for parsing a specific configuration variable */ typedef struct ConfigItem { const char *lvalue; /* name of the variable */ ConfigParserCallback parse; /* Function that is called to parse the variable's value */ + int ltype; /* Distinguish differnt variables passed to the same callback */ void *data; /* Where to store the variable's data */ const char *section; } ConfigItem; @@ -44,15 +45,15 @@ typedef struct ConfigItem { int config_parse(const char *filename, FILE *f, const char* const *sections, const ConfigItem *t, bool relaxed, void *userdata); /* Generic parsers */ -int config_parse_int(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_unsigned(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_uint64(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_size(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_bool(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_string(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_path(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); -int config_parse_path_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); +int config_parse_int(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_unsigned(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_uint64(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_size(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_bool(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_string(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_path(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_strv(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_path_strv(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); #define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg) \ int function( \ @@ -60,6 +61,7 @@ int config_parse_path_strv(const char *filename, unsigned line, const char *sect unsigned line, \ const char *section, \ const char *lvalue, \ + int ltype, \ const char *rvalue, \ void *data, \ void *userdata) { \ diff --git a/src/dbus-common.c b/src/dbus-common.c index e352b8cf99..dcce10e552 100644 --- a/src/dbus-common.c +++ b/src/dbus-common.c @@ -104,7 +104,7 @@ int bus_connect(DBusBusType t, DBusConnection **_bus, bool *private, DBusError * /* If we are root, then let's not go via the bus */ if (geteuid() == 0 && t == DBUS_BUS_SYSTEM) { - if (!(bus = dbus_connection_open_private("unix:path=/dev/.run/systemd/private", error))) { + if (!(bus = dbus_connection_open_private("unix:path=/run/systemd/private", error))) { #ifndef LEGACY dbus_error_free(error); diff --git a/src/dbus.c b/src/dbus.c index 7afb0fb5e1..31b1ce6ee0 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -955,8 +955,8 @@ static int bus_init_private(Manager *m) { if (getpid() != 1) return 0; - unlink("/dev/.run/systemd/private"); - if (!(m->private_bus = dbus_server_listen("unix:path=/dev/.run/systemd/private", &error))) { + unlink("/run/systemd/private"); + if (!(m->private_bus = dbus_server_listen("unix:path=/run/systemd/private", &error))) { log_error("Failed to create private D-Bus server: %s", error.message); r = -EIO; goto fail; diff --git a/src/execute.h b/src/execute.h index 755dea35af..3b2b4e8edb 100644 --- a/src/execute.h +++ b/src/execute.h @@ -40,7 +40,7 @@ struct CGroupBonding; #include "util.h" /* Abstract namespace! */ -#define LOGGER_SOCKET "/dev/.run/systemd/logger" +#define LOGGER_SOCKET "/run/systemd/logger" typedef enum KillMode { KILL_CONTROL_GROUP = 0, diff --git a/src/fsck.c b/src/fsck.c index a3c83c3c24..7b809b32b9 100644 --- a/src/fsck.c +++ b/src/fsck.c @@ -265,7 +265,7 @@ int main(int argc, char *argv[]) { r = EXIT_SUCCESS; if (status.si_code == CLD_EXITED && (status.si_status & 1)) - touch("/dev/.run/systemd/quotacheck"); + touch("/run/systemd/quotacheck"); finish: if (udev_device) diff --git a/src/load-fragment.c b/src/load-fragment.c index ac22b94509..343525665a 100644 --- a/src/load-fragment.c +++ b/src/load-fragment.c @@ -48,6 +48,7 @@ static int config_parse_warn_compat( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -62,6 +63,7 @@ static int config_parse_deps( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -108,6 +110,7 @@ static int config_parse_names( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -154,6 +157,7 @@ static int config_parse_string_printf( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -187,6 +191,7 @@ static int config_parse_listen( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -249,6 +254,7 @@ static int config_parse_socket_bind( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -283,6 +289,7 @@ static int config_parse_nice( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -316,6 +323,7 @@ static int config_parse_oom_score_adjust( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -349,6 +357,7 @@ static int config_parse_mode( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -383,6 +392,7 @@ static int config_parse_exec( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -500,6 +510,7 @@ static int config_parse_usec( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -527,6 +538,7 @@ static int config_parse_bindtodevice( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -559,6 +571,7 @@ static int config_parse_facility( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -586,6 +599,7 @@ static int config_parse_level( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -612,6 +626,7 @@ static int config_parse_io_class( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -640,6 +655,7 @@ static int config_parse_io_priority( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -668,6 +684,7 @@ static int config_parse_cpu_sched_policy( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -697,6 +714,7 @@ static int config_parse_cpu_sched_prio( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -726,6 +744,7 @@ static int config_parse_cpu_affinity( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -771,6 +790,7 @@ static int config_parse_capabilities( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -803,6 +823,7 @@ static int config_parse_secure_bits( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -844,6 +865,7 @@ static int config_parse_bounding_set( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -902,6 +924,7 @@ static int config_parse_timer_slack_nsec( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -929,6 +952,7 @@ static int config_parse_limit( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -959,6 +983,7 @@ static int config_parse_cgroup( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -993,6 +1018,7 @@ static int config_parse_sysv_priority( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1020,6 +1046,7 @@ static int config_parse_fsck_passno( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1048,6 +1075,7 @@ static int config_parse_kill_signal( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1074,6 +1102,7 @@ static int config_parse_mount_flags( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1111,6 +1140,7 @@ static int config_parse_timer( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1151,6 +1181,7 @@ static int config_parse_timer_unit( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1185,6 +1216,7 @@ static int config_parse_path_spec( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1231,6 +1263,7 @@ static int config_parse_path_unit( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1265,6 +1298,7 @@ static int config_parse_socket_service( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1299,6 +1333,7 @@ static int config_parse_service_sockets( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1353,6 +1388,7 @@ static int config_parse_env_file( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1383,6 +1419,7 @@ static int config_parse_ip_tos( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1409,10 +1446,12 @@ static int config_parse_condition_path( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { + ConditionType cond = ltype; Unit *u = data; bool trigger, negate; Condition *c; @@ -1433,8 +1472,7 @@ static int config_parse_condition_path( return 0; } - if (!(c = condition_new(streq(lvalue, "ConditionPathExists") ? CONDITION_PATH_EXISTS : CONDITION_DIRECTORY_NOT_EMPTY, - rvalue, trigger, negate))) + if (!(c = condition_new(cond, rvalue, trigger, negate))) return -ENOMEM; LIST_PREPEND(Condition, conditions, u->meta.conditions, c); @@ -1446,6 +1484,7 @@ static int config_parse_condition_kernel( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1477,6 +1516,7 @@ static int config_parse_condition_virt( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1508,6 +1548,7 @@ static int config_parse_condition_null( unsigned line, const char *section, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata) { @@ -1763,178 +1804,179 @@ static int load_from_path(Unit *u, const char *path) { }; #define EXEC_CONTEXT_CONFIG_ITEMS(context, section) \ - { "WorkingDirectory", config_parse_path, &(context).working_directory, section }, \ - { "RootDirectory", config_parse_path, &(context).root_directory, section }, \ - { "User", config_parse_string_printf, &(context).user, section }, \ - { "Group", config_parse_string_printf, &(context).group, section }, \ - { "SupplementaryGroups", config_parse_strv, &(context).supplementary_groups, section }, \ - { "Nice", config_parse_nice, &(context), section }, \ - { "OOMScoreAdjust", config_parse_oom_score_adjust,&(context), section }, \ - { "IOSchedulingClass", config_parse_io_class, &(context), section }, \ - { "IOSchedulingPriority", config_parse_io_priority, &(context), section }, \ - { "CPUSchedulingPolicy", config_parse_cpu_sched_policy,&(context), section }, \ - { "CPUSchedulingPriority", config_parse_cpu_sched_prio, &(context), section }, \ - { "CPUSchedulingResetOnFork", config_parse_bool, &(context).cpu_sched_reset_on_fork, section }, \ - { "CPUAffinity", config_parse_cpu_affinity, &(context), section }, \ - { "UMask", config_parse_mode, &(context).umask, section }, \ - { "Environment", config_parse_strv, &(context).environment, section }, \ - { "EnvironmentFile", config_parse_env_file, &(context).environment_files, section }, \ - { "StandardInput", config_parse_input, &(context).std_input, section }, \ - { "StandardOutput", config_parse_output, &(context).std_output, section }, \ - { "StandardError", config_parse_output, &(context).std_error, section }, \ - { "TTYPath", config_parse_path, &(context).tty_path, section }, \ - { "SyslogIdentifier", config_parse_string_printf, &(context).syslog_identifier, section }, \ - { "SyslogFacility", config_parse_facility, &(context).syslog_priority, section }, \ - { "SyslogLevel", config_parse_level, &(context).syslog_priority, section }, \ - { "SyslogLevelPrefix", config_parse_bool, &(context).syslog_level_prefix, section }, \ - { "Capabilities", config_parse_capabilities, &(context), section }, \ - { "SecureBits", config_parse_secure_bits, &(context), section }, \ - { "CapabilityBoundingSet", config_parse_bounding_set, &(context), section }, \ - { "TimerSlackNSec", config_parse_timer_slack_nsec,&(context), section }, \ - { "LimitCPU", config_parse_limit, &(context).rlimit[RLIMIT_CPU], section }, \ - { "LimitFSIZE", config_parse_limit, &(context).rlimit[RLIMIT_FSIZE], section }, \ - { "LimitDATA", config_parse_limit, &(context).rlimit[RLIMIT_DATA], section }, \ - { "LimitSTACK", config_parse_limit, &(context).rlimit[RLIMIT_STACK], section }, \ - { "LimitCORE", config_parse_limit, &(context).rlimit[RLIMIT_CORE], section }, \ - { "LimitRSS", config_parse_limit, &(context).rlimit[RLIMIT_RSS], section }, \ - { "LimitNOFILE", config_parse_limit, &(context).rlimit[RLIMIT_NOFILE], section }, \ - { "LimitAS", config_parse_limit, &(context).rlimit[RLIMIT_AS], section }, \ - { "LimitNPROC", config_parse_limit, &(context).rlimit[RLIMIT_NPROC], section }, \ - { "LimitMEMLOCK", config_parse_limit, &(context).rlimit[RLIMIT_MEMLOCK], section }, \ - { "LimitLOCKS", config_parse_limit, &(context).rlimit[RLIMIT_LOCKS], section }, \ - { "LimitSIGPENDING", config_parse_limit, &(context).rlimit[RLIMIT_SIGPENDING], section }, \ - { "LimitMSGQUEUE", config_parse_limit, &(context).rlimit[RLIMIT_MSGQUEUE], section }, \ - { "LimitNICE", config_parse_limit, &(context).rlimit[RLIMIT_NICE], section }, \ - { "LimitRTPRIO", config_parse_limit, &(context).rlimit[RLIMIT_RTPRIO], section }, \ - { "LimitRTTIME", config_parse_limit, &(context).rlimit[RLIMIT_RTTIME], section }, \ - { "ControlGroup", config_parse_cgroup, u, section }, \ - { "ReadWriteDirectories", config_parse_path_strv, &(context).read_write_dirs, section }, \ - { "ReadOnlyDirectories", config_parse_path_strv, &(context).read_only_dirs, section }, \ - { "InaccessibleDirectories",config_parse_path_strv, &(context).inaccessible_dirs, section }, \ - { "PrivateTmp", config_parse_bool, &(context).private_tmp, section }, \ - { "MountFlags", config_parse_mount_flags, &(context), section }, \ - { "TCPWrapName", config_parse_string_printf, &(context).tcpwrap_name, section }, \ - { "PAMName", config_parse_string_printf, &(context).pam_name, section }, \ - { "KillMode", config_parse_kill_mode, &(context).kill_mode, section }, \ - { "KillSignal", config_parse_kill_signal, &(context).kill_signal, section }, \ - { "SendSIGKILL", config_parse_bool, &(context).send_sigkill, section }, \ - { "UtmpIdentifier", config_parse_string_printf, &(context).utmp_id, section } + { "WorkingDirectory", config_parse_path, 0, &(context).working_directory, section }, \ + { "RootDirectory", config_parse_path, 0, &(context).root_directory, section }, \ + { "User", config_parse_string_printf, 0, &(context).user, section }, \ + { "Group", config_parse_string_printf, 0, &(context).group, section }, \ + { "SupplementaryGroups", config_parse_strv, 0, &(context).supplementary_groups, section }, \ + { "Nice", config_parse_nice, 0, &(context), section }, \ + { "OOMScoreAdjust", config_parse_oom_score_adjust,0, &(context), section }, \ + { "IOSchedulingClass", config_parse_io_class, 0, &(context), section }, \ + { "IOSchedulingPriority", config_parse_io_priority, 0, &(context), section }, \ + { "CPUSchedulingPolicy", config_parse_cpu_sched_policy,0, &(context), section }, \ + { "CPUSchedulingPriority", config_parse_cpu_sched_prio, 0, &(context), section }, \ + { "CPUSchedulingResetOnFork", config_parse_bool, 0, &(context).cpu_sched_reset_on_fork, section }, \ + { "CPUAffinity", config_parse_cpu_affinity, 0, &(context), section }, \ + { "UMask", config_parse_mode, 0, &(context).umask, section }, \ + { "Environment", config_parse_strv, 0, &(context).environment, section }, \ + { "EnvironmentFile", config_parse_env_file, 0, &(context).environment_files, section }, \ + { "StandardInput", config_parse_input, 0, &(context).std_input, section }, \ + { "StandardOutput", config_parse_output, 0, &(context).std_output, section }, \ + { "StandardError", config_parse_output, 0, &(context).std_error, section }, \ + { "TTYPath", config_parse_path, 0, &(context).tty_path, section }, \ + { "SyslogIdentifier", config_parse_string_printf, 0, &(context).syslog_identifier, section }, \ + { "SyslogFacility", config_parse_facility, 0, &(context).syslog_priority, section }, \ + { "SyslogLevel", config_parse_level, 0, &(context).syslog_priority, section }, \ + { "SyslogLevelPrefix", config_parse_bool, 0, &(context).syslog_level_prefix, section }, \ + { "Capabilities", config_parse_capabilities, 0, &(context), section }, \ + { "SecureBits", config_parse_secure_bits, 0, &(context), section }, \ + { "CapabilityBoundingSet", config_parse_bounding_set, 0, &(context), section }, \ + { "TimerSlackNSec", config_parse_timer_slack_nsec,0, &(context), section }, \ + { "LimitCPU", config_parse_limit, 0, &(context).rlimit[RLIMIT_CPU], section }, \ + { "LimitFSIZE", config_parse_limit, 0, &(context).rlimit[RLIMIT_FSIZE], section }, \ + { "LimitDATA", config_parse_limit, 0, &(context).rlimit[RLIMIT_DATA], section }, \ + { "LimitSTACK", config_parse_limit, 0, &(context).rlimit[RLIMIT_STACK], section }, \ + { "LimitCORE", config_parse_limit, 0, &(context).rlimit[RLIMIT_CORE], section }, \ + { "LimitRSS", config_parse_limit, 0, &(context).rlimit[RLIMIT_RSS], section }, \ + { "LimitNOFILE", config_parse_limit, 0, &(context).rlimit[RLIMIT_NOFILE], section }, \ + { "LimitAS", config_parse_limit, 0, &(context).rlimit[RLIMIT_AS], section }, \ + { "LimitNPROC", config_parse_limit, 0, &(context).rlimit[RLIMIT_NPROC], section }, \ + { "LimitMEMLOCK", config_parse_limit, 0, &(context).rlimit[RLIMIT_MEMLOCK], section }, \ + { "LimitLOCKS", config_parse_limit, 0, &(context).rlimit[RLIMIT_LOCKS], section }, \ + { "LimitSIGPENDING", config_parse_limit, 0, &(context).rlimit[RLIMIT_SIGPENDING], section }, \ + { "LimitMSGQUEUE", config_parse_limit, 0, &(context).rlimit[RLIMIT_MSGQUEUE], section }, \ + { "LimitNICE", config_parse_limit, 0, &(context).rlimit[RLIMIT_NICE], section }, \ + { "LimitRTPRIO", config_parse_limit, 0, &(context).rlimit[RLIMIT_RTPRIO], section }, \ + { "LimitRTTIME", config_parse_limit, 0, &(context).rlimit[RLIMIT_RTTIME], section }, \ + { "ControlGroup", config_parse_cgroup, 0, u, section }, \ + { "ReadWriteDirectories", config_parse_path_strv, 0, &(context).read_write_dirs, section }, \ + { "ReadOnlyDirectories", config_parse_path_strv, 0, &(context).read_only_dirs, section }, \ + { "InaccessibleDirectories",config_parse_path_strv, 0, &(context).inaccessible_dirs, section }, \ + { "PrivateTmp", config_parse_bool, 0, &(context).private_tmp, section }, \ + { "MountFlags", config_parse_mount_flags, 0, &(context), section }, \ + { "TCPWrapName", config_parse_string_printf, 0, &(context).tcpwrap_name, section }, \ + { "PAMName", config_parse_string_printf, 0, &(context).pam_name, section }, \ + { "KillMode", config_parse_kill_mode, 0, &(context).kill_mode, section }, \ + { "KillSignal", config_parse_kill_signal, 0, &(context).kill_signal, section }, \ + { "SendSIGKILL", config_parse_bool, 0, &(context).send_sigkill, section }, \ + { "UtmpIdentifier", config_parse_string_printf, 0, &(context).utmp_id, section } const ConfigItem items[] = { - { "Names", config_parse_names, u, "Unit" }, - { "Description", config_parse_string_printf, &u->meta.description, "Unit" }, - { "Requires", config_parse_deps, UINT_TO_PTR(UNIT_REQUIRES), "Unit" }, - { "RequiresOverridable", config_parse_deps, UINT_TO_PTR(UNIT_REQUIRES_OVERRIDABLE), "Unit" }, - { "Requisite", config_parse_deps, UINT_TO_PTR(UNIT_REQUISITE), "Unit" }, - { "RequisiteOverridable", config_parse_deps, UINT_TO_PTR(UNIT_REQUISITE_OVERRIDABLE), "Unit" }, - { "Wants", config_parse_deps, UINT_TO_PTR(UNIT_WANTS), "Unit" }, - { "BindTo", config_parse_deps, UINT_TO_PTR(UNIT_BIND_TO), "Unit" }, - { "Conflicts", config_parse_deps, UINT_TO_PTR(UNIT_CONFLICTS), "Unit" }, - { "Before", config_parse_deps, UINT_TO_PTR(UNIT_BEFORE), "Unit" }, - { "After", config_parse_deps, UINT_TO_PTR(UNIT_AFTER), "Unit" }, - { "OnFailure", config_parse_deps, UINT_TO_PTR(UNIT_ON_FAILURE), "Unit" }, - { "StopWhenUnneeded", config_parse_bool, &u->meta.stop_when_unneeded, "Unit" }, - { "RefuseManualStart", config_parse_bool, &u->meta.refuse_manual_start, "Unit" }, - { "RefuseManualStop", config_parse_bool, &u->meta.refuse_manual_stop, "Unit" }, - { "AllowIsolate", config_parse_bool, &u->meta.allow_isolate, "Unit" }, - { "DefaultDependencies", config_parse_bool, &u->meta.default_dependencies, "Unit" }, - { "JobTimeoutSec", config_parse_usec, &u->meta.job_timeout, "Unit" }, - { "ConditionPathExists", config_parse_condition_path, u, "Unit" }, - { "ConditionDirectoryNotEmpty", config_parse_condition_path, u, "Unit" }, - { "ConditionKernelCommandLine", config_parse_condition_kernel, u, "Unit" }, - { "ConditionVirtualization",config_parse_condition_virt, u, "Unit" }, - { "ConditionNull", config_parse_condition_null, u, "Unit" }, - - { "PIDFile", config_parse_path, &u->service.pid_file, "Service" }, - { "ExecStartPre", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" }, - { "ExecStart", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START, "Service" }, - { "ExecStartPost", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_POST, "Service" }, - { "ExecReload", config_parse_exec, u->service.exec_command+SERVICE_EXEC_RELOAD, "Service" }, - { "ExecStop", config_parse_exec, u->service.exec_command+SERVICE_EXEC_STOP, "Service" }, - { "ExecStopPost", config_parse_exec, u->service.exec_command+SERVICE_EXEC_STOP_POST, "Service" }, - { "RestartSec", config_parse_usec, &u->service.restart_usec, "Service" }, - { "TimeoutSec", config_parse_usec, &u->service.timeout_usec, "Service" }, - { "Type", config_parse_service_type, &u->service.type, "Service" }, - { "Restart", config_parse_service_restart, &u->service.restart, "Service" }, - { "PermissionsStartOnly", config_parse_bool, &u->service.permissions_start_only, "Service" }, - { "RootDirectoryStartOnly", config_parse_bool, &u->service.root_directory_start_only, "Service" }, - { "RemainAfterExit", config_parse_bool, &u->service.remain_after_exit, "Service" }, - { "GuessMainPID", config_parse_bool, &u->service.guess_main_pid, "Service" }, + { "Names", config_parse_names, 0, u, "Unit" }, + { "Description", config_parse_string_printf, 0, &u->meta.description, "Unit" }, + { "Requires", config_parse_deps, 0, UINT_TO_PTR(UNIT_REQUIRES), "Unit" }, + { "RequiresOverridable", config_parse_deps, 0, UINT_TO_PTR(UNIT_REQUIRES_OVERRIDABLE), "Unit" }, + { "Requisite", config_parse_deps, 0, UINT_TO_PTR(UNIT_REQUISITE), "Unit" }, + { "RequisiteOverridable", config_parse_deps, 0, UINT_TO_PTR(UNIT_REQUISITE_OVERRIDABLE), "Unit" }, + { "Wants", config_parse_deps, 0, UINT_TO_PTR(UNIT_WANTS), "Unit" }, + { "BindTo", config_parse_deps, 0, UINT_TO_PTR(UNIT_BIND_TO), "Unit" }, + { "Conflicts", config_parse_deps, 0, UINT_TO_PTR(UNIT_CONFLICTS), "Unit" }, + { "Before", config_parse_deps, 0, UINT_TO_PTR(UNIT_BEFORE), "Unit" }, + { "After", config_parse_deps, 0, UINT_TO_PTR(UNIT_AFTER), "Unit" }, + { "OnFailure", config_parse_deps, 0, UINT_TO_PTR(UNIT_ON_FAILURE), "Unit" }, + { "StopWhenUnneeded", config_parse_bool, 0, &u->meta.stop_when_unneeded, "Unit" }, + { "RefuseManualStart", config_parse_bool, 0, &u->meta.refuse_manual_start, "Unit" }, + { "RefuseManualStop", config_parse_bool, 0, &u->meta.refuse_manual_stop, "Unit" }, + { "AllowIsolate", config_parse_bool, 0, &u->meta.allow_isolate, "Unit" }, + { "DefaultDependencies", config_parse_bool, 0, &u->meta.default_dependencies, "Unit" }, + { "JobTimeoutSec", config_parse_usec, 0, &u->meta.job_timeout, "Unit" }, + { "ConditionPathExists", config_parse_condition_path, CONDITION_PATH_EXISTS, u, "Unit" }, + { "ConditionPathIsDirectory", config_parse_condition_path, CONDITION_PATH_IS_DIRECTORY, u, "Unit" }, + { "ConditionDirectoryNotEmpty", config_parse_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, u, "Unit" }, + { "ConditionKernelCommandLine", config_parse_condition_kernel, 0, u, "Unit" }, + { "ConditionVirtualization",config_parse_condition_virt, 0, u, "Unit" }, + { "ConditionNull", config_parse_condition_null, 0, u, "Unit" }, + + { "PIDFile", config_parse_path, 0, &u->service.pid_file, "Service" }, + { "ExecStartPre", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" }, + { "ExecStart", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_START, "Service" }, + { "ExecStartPost", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_START_POST, "Service" }, + { "ExecReload", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_RELOAD, "Service" }, + { "ExecStop", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_STOP, "Service" }, + { "ExecStopPost", config_parse_exec, 0, u->service.exec_command+SERVICE_EXEC_STOP_POST, "Service" }, + { "RestartSec", config_parse_usec, 0, &u->service.restart_usec, "Service" }, + { "TimeoutSec", config_parse_usec, 0, &u->service.timeout_usec, "Service" }, + { "Type", config_parse_service_type, 0, &u->service.type, "Service" }, + { "Restart", config_parse_service_restart, 0, &u->service.restart, "Service" }, + { "PermissionsStartOnly", config_parse_bool, 0, &u->service.permissions_start_only, "Service" }, + { "RootDirectoryStartOnly", config_parse_bool, 0, &u->service.root_directory_start_only, "Service" }, + { "RemainAfterExit", config_parse_bool, 0, &u->service.remain_after_exit, "Service" }, + { "GuessMainPID", config_parse_bool, 0, &u->service.guess_main_pid, "Service" }, #ifdef HAVE_SYSV_COMPAT - { "SysVStartPriority", config_parse_sysv_priority, &u->service.sysv_start_priority, "Service" }, + { "SysVStartPriority", config_parse_sysv_priority, 0, &u->service.sysv_start_priority, "Service" }, #else - { "SysVStartPriority", config_parse_warn_compat, NULL, "Service" }, + { "SysVStartPriority", config_parse_warn_compat, 0, NULL, "Service" }, #endif - { "NonBlocking", config_parse_bool, &u->service.exec_context.non_blocking, "Service" }, - { "BusName", config_parse_string_printf, &u->service.bus_name, "Service" }, - { "NotifyAccess", config_parse_notify_access, &u->service.notify_access, "Service" }, - { "Sockets", config_parse_service_sockets, &u->service, "Service" }, - { "FsckPassNo", config_parse_fsck_passno, &u->service.fsck_passno, "Service" }, + { "NonBlocking", config_parse_bool, 0, &u->service.exec_context.non_blocking, "Service" }, + { "BusName", config_parse_string_printf, 0, &u->service.bus_name, "Service" }, + { "NotifyAccess", config_parse_notify_access, 0, &u->service.notify_access, "Service" }, + { "Sockets", config_parse_service_sockets, 0, &u->service, "Service" }, + { "FsckPassNo", config_parse_fsck_passno, 0, &u->service.fsck_passno, "Service" }, EXEC_CONTEXT_CONFIG_ITEMS(u->service.exec_context, "Service"), - { "ListenStream", config_parse_listen, &u->socket, "Socket" }, - { "ListenDatagram", config_parse_listen, &u->socket, "Socket" }, - { "ListenSequentialPacket", config_parse_listen, &u->socket, "Socket" }, - { "ListenFIFO", config_parse_listen, &u->socket, "Socket" }, - { "BindIPv6Only", config_parse_socket_bind, &u->socket, "Socket" }, - { "Backlog", config_parse_unsigned, &u->socket.backlog, "Socket" }, - { "BindToDevice", config_parse_bindtodevice, &u->socket, "Socket" }, - { "ExecStartPre", config_parse_exec, u->socket.exec_command+SOCKET_EXEC_START_PRE, "Socket" }, - { "ExecStartPost", config_parse_exec, u->socket.exec_command+SOCKET_EXEC_START_POST, "Socket" }, - { "ExecStopPre", config_parse_exec, u->socket.exec_command+SOCKET_EXEC_STOP_PRE, "Socket" }, - { "ExecStopPost", config_parse_exec, u->socket.exec_command+SOCKET_EXEC_STOP_POST, "Socket" }, - { "TimeoutSec", config_parse_usec, &u->socket.timeout_usec, "Socket" }, - { "DirectoryMode", config_parse_mode, &u->socket.directory_mode, "Socket" }, - { "SocketMode", config_parse_mode, &u->socket.socket_mode, "Socket" }, - { "Accept", config_parse_bool, &u->socket.accept, "Socket" }, - { "MaxConnections", config_parse_unsigned, &u->socket.max_connections, "Socket" }, - { "KeepAlive", config_parse_bool, &u->socket.keep_alive, "Socket" }, - { "Priority", config_parse_int, &u->socket.priority, "Socket" }, - { "ReceiveBuffer", config_parse_size, &u->socket.receive_buffer, "Socket" }, - { "SendBuffer", config_parse_size, &u->socket.send_buffer, "Socket" }, - { "IPTOS", config_parse_ip_tos, &u->socket.ip_tos, "Socket" }, - { "IPTTL", config_parse_int, &u->socket.ip_ttl, "Socket" }, - { "Mark", config_parse_int, &u->socket.mark, "Socket" }, - { "PipeSize", config_parse_size, &u->socket.pipe_size, "Socket" }, - { "FreeBind", config_parse_bool, &u->socket.free_bind, "Socket" }, - { "TCPCongestion", config_parse_string, &u->socket.tcp_congestion, "Socket" }, - { "Service", config_parse_socket_service, &u->socket, "Socket" }, + { "ListenStream", config_parse_listen, 0, &u->socket, "Socket" }, + { "ListenDatagram", config_parse_listen, 0, &u->socket, "Socket" }, + { "ListenSequentialPacket", config_parse_listen, 0, &u->socket, "Socket" }, + { "ListenFIFO", config_parse_listen, 0, &u->socket, "Socket" }, + { "BindIPv6Only", config_parse_socket_bind, 0, &u->socket, "Socket" }, + { "Backlog", config_parse_unsigned, 0, &u->socket.backlog, "Socket" }, + { "BindToDevice", config_parse_bindtodevice, 0, &u->socket, "Socket" }, + { "ExecStartPre", config_parse_exec, 0, u->socket.exec_command+SOCKET_EXEC_START_PRE, "Socket" }, + { "ExecStartPost", config_parse_exec, 0, u->socket.exec_command+SOCKET_EXEC_START_POST, "Socket" }, + { "ExecStopPre", config_parse_exec, 0, u->socket.exec_command+SOCKET_EXEC_STOP_PRE, "Socket" }, + { "ExecStopPost", config_parse_exec, 0, u->socket.exec_command+SOCKET_EXEC_STOP_POST, "Socket" }, + { "TimeoutSec", config_parse_usec, 0, &u->socket.timeout_usec, "Socket" }, + { "DirectoryMode", config_parse_mode, 0, &u->socket.directory_mode, "Socket" }, + { "SocketMode", config_parse_mode, 0, &u->socket.socket_mode, "Socket" }, + { "Accept", config_parse_bool, 0, &u->socket.accept, "Socket" }, + { "MaxConnections", config_parse_unsigned, 0, &u->socket.max_connections, "Socket" }, + { "KeepAlive", config_parse_bool, 0, &u->socket.keep_alive, "Socket" }, + { "Priority", config_parse_int, 0, &u->socket.priority, "Socket" }, + { "ReceiveBuffer", config_parse_size, 0, &u->socket.receive_buffer, "Socket" }, + { "SendBuffer", config_parse_size, 0, &u->socket.send_buffer, "Socket" }, + { "IPTOS", config_parse_ip_tos, 0, &u->socket.ip_tos, "Socket" }, + { "IPTTL", config_parse_int, 0, &u->socket.ip_ttl, "Socket" }, + { "Mark", config_parse_int, 0, &u->socket.mark, "Socket" }, + { "PipeSize", config_parse_size, 0, &u->socket.pipe_size, "Socket" }, + { "FreeBind", config_parse_bool, 0, &u->socket.free_bind, "Socket" }, + { "TCPCongestion", config_parse_string, 0, &u->socket.tcp_congestion, "Socket" }, + { "Service", config_parse_socket_service, 0, &u->socket, "Socket" }, EXEC_CONTEXT_CONFIG_ITEMS(u->socket.exec_context, "Socket"), - { "What", config_parse_string, &u->mount.parameters_fragment.what, "Mount" }, - { "Where", config_parse_path, &u->mount.where, "Mount" }, - { "Options", config_parse_string, &u->mount.parameters_fragment.options, "Mount" }, - { "Type", config_parse_string, &u->mount.parameters_fragment.fstype, "Mount" }, - { "TimeoutSec", config_parse_usec, &u->mount.timeout_usec, "Mount" }, - { "DirectoryMode", config_parse_mode, &u->mount.directory_mode, "Mount" }, + { "What", config_parse_string, 0, &u->mount.parameters_fragment.what, "Mount" }, + { "Where", config_parse_path, 0, &u->mount.where, "Mount" }, + { "Options", config_parse_string, 0, &u->mount.parameters_fragment.options, "Mount" }, + { "Type", config_parse_string, 0, &u->mount.parameters_fragment.fstype, "Mount" }, + { "TimeoutSec", config_parse_usec, 0, &u->mount.timeout_usec, "Mount" }, + { "DirectoryMode", config_parse_mode, 0, &u->mount.directory_mode, "Mount" }, EXEC_CONTEXT_CONFIG_ITEMS(u->mount.exec_context, "Mount"), - { "Where", config_parse_path, &u->automount.where, "Automount" }, - { "DirectoryMode", config_parse_mode, &u->automount.directory_mode, "Automount" }, + { "Where", config_parse_path, 0, &u->automount.where, "Automount" }, + { "DirectoryMode", config_parse_mode, 0, &u->automount.directory_mode, "Automount" }, - { "What", config_parse_path, &u->swap.parameters_fragment.what, "Swap" }, - { "Priority", config_parse_int, &u->swap.parameters_fragment.priority, "Swap" }, - { "TimeoutSec", config_parse_usec, &u->swap.timeout_usec, "Swap" }, + { "What", config_parse_path, 0, &u->swap.parameters_fragment.what, "Swap" }, + { "Priority", config_parse_int, 0, &u->swap.parameters_fragment.priority, "Swap" }, + { "TimeoutSec", config_parse_usec, 0, &u->swap.timeout_usec, "Swap" }, EXEC_CONTEXT_CONFIG_ITEMS(u->swap.exec_context, "Swap"), - { "OnActiveSec", config_parse_timer, &u->timer, "Timer" }, - { "OnBootSec", config_parse_timer, &u->timer, "Timer" }, - { "OnStartupSec", config_parse_timer, &u->timer, "Timer" }, - { "OnUnitActiveSec", config_parse_timer, &u->timer, "Timer" }, - { "OnUnitInactiveSec", config_parse_timer, &u->timer, "Timer" }, - { "Unit", config_parse_timer_unit, &u->timer, "Timer" }, + { "OnActiveSec", config_parse_timer, 0, &u->timer, "Timer" }, + { "OnBootSec", config_parse_timer, 0, &u->timer, "Timer" }, + { "OnStartupSec", config_parse_timer, 0, &u->timer, "Timer" }, + { "OnUnitActiveSec", config_parse_timer, 0, &u->timer, "Timer" }, + { "OnUnitInactiveSec", config_parse_timer, 0, &u->timer, "Timer" }, + { "Unit", config_parse_timer_unit, 0, &u->timer, "Timer" }, - { "PathExists", config_parse_path_spec, &u->path, "Path" }, - { "PathChanged", config_parse_path_spec, &u->path, "Path" }, - { "DirectoryNotEmpty", config_parse_path_spec, &u->path, "Path" }, - { "Unit", config_parse_path_unit, &u->path, "Path" }, + { "PathExists", config_parse_path_spec, 0, &u->path, "Path" }, + { "PathChanged", config_parse_path_spec, 0, &u->path, "Path" }, + { "DirectoryNotEmpty", config_parse_path_spec, 0, &u->path, "Path" }, + { "Unit", config_parse_path_unit, 0, &u->path, "Path" }, /* The [Install] section is ignored here. */ - { "Alias", NULL, NULL, "Install" }, - { "WantedBy", NULL, NULL, "Install" }, - { "Also", NULL, NULL, "Install" }, + { "Alias", NULL, 0, NULL, "Install" }, + { "WantedBy", NULL, 0, NULL, "Install" }, + { "Also", NULL, 0, NULL, "Install" }, - { NULL, NULL, NULL, NULL } + { NULL, NULL, 0, NULL, NULL } }; #undef EXEC_CONTEXT_CONFIG_ITEMS diff --git a/src/machine-id-setup.c b/src/machine-id-setup.c index 59a14249e4..98e288e1b5 100644 --- a/src/machine-id-setup.c +++ b/src/machine-id-setup.c @@ -142,20 +142,20 @@ int machine_id_setup(void) { fd = -1; /* Hmm, we couldn't write it? So let's write it to - * /dev/.run/systemd/machine-id as a replacement */ + * /run/systemd/machine-id as a replacement */ - mkdir_p("/dev/.run/systemd", 0755); + mkdir_p("/run/systemd", 0755); - if ((r = write_one_line_file("/dev/.run/systemd/machine-id", id)) < 0) { - log_error("Cannot write /dev/.run/systemd/machine-id: %s", strerror(-r)); + if ((r = write_one_line_file("/run/systemd/machine-id", id)) < 0) { + log_error("Cannot write /run/systemd/machine-id: %s", strerror(-r)); - unlink("/dev/.run/systemd/machine-id"); + unlink("/run/systemd/machine-id"); goto finish; } /* And now, let's mount it over */ - r = mount("/dev/.run/systemd/machine-id", "/etc/machine-id", "bind", MS_BIND|MS_RDONLY, NULL) < 0 ? -errno : 0; - unlink("/dev/.run/systemd/machine-id"); + r = mount("/run/systemd/machine-id", "/etc/machine-id", "bind", MS_BIND|MS_RDONLY, NULL) < 0 ? -errno : 0; + unlink("/run/systemd/machine-id"); if (r < 0) log_error("Failed to mount /etc/machine-id: %s", strerror(-r)); diff --git a/src/main.c b/src/main.c index 7edd6b5811..b7c2400403 100644 --- a/src/main.c +++ b/src/main.c @@ -494,24 +494,24 @@ static DEFINE_CONFIG_PARSE_ENUM(config_parse_output, exec_output, ExecOutput, "F static int parse_config_file(void) { const ConfigItem items[] = { - { "LogLevel", config_parse_level, NULL, "Manager" }, - { "LogTarget", config_parse_target, NULL, "Manager" }, - { "LogColor", config_parse_color, NULL, "Manager" }, - { "LogLocation", config_parse_location, NULL, "Manager" }, - { "DumpCore", config_parse_bool, &arg_dump_core, "Manager" }, - { "CrashShell", config_parse_bool, &arg_crash_shell, "Manager" }, - { "ShowStatus", config_parse_bool, &arg_show_status, "Manager" }, + { "LogLevel", config_parse_level, 0, NULL, "Manager" }, + { "LogTarget", config_parse_target, 0, NULL, "Manager" }, + { "LogColor", config_parse_color, 0, NULL, "Manager" }, + { "LogLocation", config_parse_location, 0, NULL, "Manager" }, + { "DumpCore", config_parse_bool, 0, &arg_dump_core, "Manager" }, + { "CrashShell", config_parse_bool, 0, &arg_crash_shell, "Manager" }, + { "ShowStatus", config_parse_bool, 0, &arg_show_status, "Manager" }, #ifdef HAVE_SYSV_COMPAT - { "SysVConsole", config_parse_bool, &arg_sysv_console, "Manager" }, + { "SysVConsole", config_parse_bool, 0, &arg_sysv_console, "Manager" }, #endif - { "CrashChVT", config_parse_int, &arg_crash_chvt, "Manager" }, - { "CPUAffinity", config_parse_cpu_affinity, NULL, "Manager" }, - { "MountAuto", config_parse_bool, &arg_mount_auto, "Manager" }, - { "SwapAuto", config_parse_bool, &arg_swap_auto, "Manager" }, - { "DefaultControllers", config_parse_strv, &arg_default_controllers, "Manager" }, - { "DefaultStandardOutput", config_parse_output, &arg_default_std_output, "Manager" }, - { "DefaultStandardError", config_parse_output, &arg_default_std_error, "Manager" }, - { NULL, NULL, NULL, NULL } + { "CrashChVT", config_parse_int, 0, &arg_crash_chvt, "Manager" }, + { "CPUAffinity", config_parse_cpu_affinity, 0, NULL, "Manager" }, + { "MountAuto", config_parse_bool, 0, &arg_mount_auto, "Manager" }, + { "SwapAuto", config_parse_bool, 0, &arg_swap_auto, "Manager" }, + { "DefaultControllers", config_parse_strv, 0, &arg_default_controllers, "Manager" }, + { "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output, "Manager" }, + { "DefaultStandardError", config_parse_output, 0, &arg_default_std_error, "Manager" }, + { NULL, NULL, 0, NULL, NULL } }; static const char * const sections[] = { @@ -1074,7 +1074,7 @@ int main(int argc, char *argv[]) { /* If Plymouth is being run make sure we show the status, so * that there's something nice to see when people press Esc */ - if (access("/dev/.run/initramfs/plymouth", F_OK) >= 0) + if (access("/run/initramfs/plymouth", F_OK) >= 0) arg_show_status = true; if (arg_action == ACTION_HELP) { diff --git a/src/manager.c b/src/manager.c index a9aaee3d81..69d231a85f 100644 --- a/src/manager.c +++ b/src/manager.c @@ -66,7 +66,7 @@ #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC) /* Where clients shall send notification messages to */ -#define NOTIFY_SOCKET_SYSTEM "/dev/.run/systemd/notify" +#define NOTIFY_SOCKET_SYSTEM "/run/systemd/notify" #define NOTIFY_SOCKET_USER "@/org/freedesktop/systemd1/notify" static int manager_setup_notify(Manager *m) { @@ -2592,7 +2592,7 @@ int manager_open_serialization(Manager *m, FILE **_f) { assert(_f); if (m->running_as == MANAGER_SYSTEM) - asprintf(&path, "/dev/.run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid()); + asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid()); else asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid()); @@ -2895,7 +2895,7 @@ void manager_run_generators(Manager *m) { if (!m->generator_unit_path) { char *p; - char system_path[] = "/dev/.run/systemd/generator-XXXXXX", + char system_path[] = "/run/systemd/generator-XXXXXX", user_path[] = "/tmp/systemd-generator-XXXXXX"; if (!(p = mkdtemp(m->running_as == MANAGER_SYSTEM ? system_path : user_path))) { diff --git a/src/mount-setup.c b/src/mount-setup.c index d740d4f357..056e4a1c6c 100644 --- a/src/mount-setup.c +++ b/src/mount-setup.c @@ -54,7 +54,7 @@ static const MountPoint mount_table[] = { { "devtmpfs", "/dev", "devtmpfs", "mode=755", MS_NOSUID, true }, { "tmpfs", "/dev/shm", "tmpfs", "mode=1777", MS_NOSUID|MS_NODEV, true }, { "devpts", "/dev/pts", "devpts", "mode=620,gid=" STRINGIFY(TTY_GID), MS_NOSUID|MS_NOEXEC, false }, - { "tmpfs", "/dev/.run", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV, true }, + { "tmpfs", "/run", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV, true }, { "tmpfs", "/sys/fs/cgroup", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV, true }, { "cgroup", "/sys/fs/cgroup/systemd", "cgroup", "none,name=systemd", MS_NOSUID|MS_NOEXEC|MS_NODEV, true }, }; @@ -253,8 +253,8 @@ int mount_setup(void) { symlink_and_label(j, k); /* Create a few directories we always want around */ - mkdir("/dev/.run/systemd", 0755); - mkdir("/dev/.run/systemd/ask-password", 0755); + mkdir("/run/systemd", 0755); + mkdir("/run/systemd/ask-password", 0755); return mount_cgroup_controllers(); } diff --git a/src/mount.c b/src/mount.c index 99867172c9..cc49b1993f 100644 --- a/src/mount.c +++ b/src/mount.c @@ -844,6 +844,10 @@ static void mount_enter_mounting(Mount *m) { mkdir_p(m->where, m->directory_mode); + /* create the source directory for bind-mounts if needed */ + if (m->parameters_fragment.fstype && strcmp(m->parameters_fragment.fstype, "bind") == 0) + mkdir_p(m->parameters_fragment.what, m->directory_mode); + if (m->from_fragment) r = exec_command_set( m->control_command, diff --git a/src/nspawn.c b/src/nspawn.c index aaa5d1f9d0..6b0ba4e57f 100644 --- a/src/nspawn.c +++ b/src/nspawn.c @@ -117,7 +117,7 @@ static int mount_all(const char *dest) { { "sysfs", "/sys", "sysfs", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_RDONLY, true }, { "tmpfs", "/dev", "tmpfs", "mode=755", MS_NOSUID, true }, { "/dev/pts", "/dev/pts", "bind", NULL, MS_BIND, true }, - { "tmpfs", "/dev/.run", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV, true }, + { "tmpfs", "/run", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV, true }, #ifdef HAVE_SELINUX { "selinux", "/selinux", "selinuxfs", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_RDONLY, false }, #endif diff --git a/src/path-lookup.c b/src/path-lookup.c index 922e722e17..fff930469c 100644 --- a/src/path-lookup.c +++ b/src/path-lookup.c @@ -183,7 +183,7 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { if (!(p->unit_path = strv_new( /* If you modify this you also want to modify * systemdsystemunitpath= in systemd.pc.in! */ - "/dev/.run/systemd/system", + "/run/systemd/system", SYSTEM_CONFIG_UNIT_PATH, "/etc/systemd/system", "/usr/local/share/systemd/system", diff --git a/src/quotacheck.c b/src/quotacheck.c index 057d8617c2..c7b20a60e6 100644 --- a/src/quotacheck.c +++ b/src/quotacheck.c @@ -97,7 +97,7 @@ int main(int argc, char *argv[]) { if (arg_skip) return 0; - if (access("/dev/.run/systemd/quotacheck", F_OK) < 0) + if (access("/run/systemd/quotacheck", F_OK) < 0) return 0; } diff --git a/src/readahead-collect.c b/src/readahead-collect.c index 693729598e..3c48a02fc9 100644 --- a/src/readahead-collect.c +++ b/src/readahead-collect.c @@ -290,13 +290,13 @@ static int collect(const char *root) { log_debug("Collecting..."); - if (access("/dev/.run/systemd/readahead/cancel", F_OK) >= 0) { + if (access("/run/systemd/readahead/cancel", F_OK) >= 0) { log_debug("Collection canceled"); r = -ECANCELED; goto finish; } - if (access("/dev/.run/systemd/readahead/done", F_OK) >= 0) { + if (access("/run/systemd/readahead/done", F_OK) >= 0) { log_debug("Got termination request"); goto done; } diff --git a/src/readahead-common.c b/src/readahead-common.c index 990ffd4d08..fc49a33109 100644 --- a/src/readahead-common.c +++ b/src/readahead-common.c @@ -167,11 +167,11 @@ int open_inotify(void) { return -errno; } - mkdir("/dev/.run/systemd", 0755); - mkdir("/dev/.run/systemd/readahead", 0755); + mkdir("/run/systemd", 0755); + mkdir("/run/systemd/readahead", 0755); - if (inotify_add_watch(fd, "/dev/.run/systemd/readahead", IN_CREATE) < 0) { - log_error("Failed to watch /dev/.run/systemd/readahead: %m"); + if (inotify_add_watch(fd, "/run/systemd/readahead", IN_CREATE) < 0) { + log_error("Failed to watch /run/systemd/readahead: %m"); close_nointr_nofail(fd); return -errno; } @@ -183,10 +183,10 @@ ReadaheadShared *shared_get(void) { int fd; ReadaheadShared *m = NULL; - mkdir("/dev/.run/systemd", 0755); - mkdir("/dev/.run/systemd/readahead", 0755); + mkdir("/run/systemd", 0755); + mkdir("/run/systemd/readahead", 0755); - if ((fd = open("/dev/.run/systemd/readahead/shared", O_CREAT|O_RDWR|O_CLOEXEC, 0644)) < 0) { + if ((fd = open("/run/systemd/readahead/shared", O_CREAT|O_RDWR|O_CLOEXEC, 0644)) < 0) { log_error("Failed to create shared memory segment: %m"); goto finish; } diff --git a/src/readahead-replay.c b/src/readahead-replay.c index 3984c36c3e..fee2171dd2 100644 --- a/src/readahead-replay.c +++ b/src/readahead-replay.c @@ -192,7 +192,7 @@ static int replay(const char *root) { log_debug("Replaying..."); - if (access("/dev/.run/systemd/readahead/noreplay", F_OK) >= 0) { + if (access("/run/systemd/readahead/noreplay", F_OK) >= 0) { log_debug("Got termination request"); goto done; } diff --git a/src/sd-readahead.c b/src/sd-readahead.c index 0dfe4abab5..c5cfe67107 100644 --- a/src/sd-readahead.c +++ b/src/sd-readahead.c @@ -42,8 +42,8 @@ static int touch(const char *path) { #if !defined(DISABLE_SYSTEMD) && defined(__linux__) int fd; - mkdir("/dev/.run/systemd", 0755); - mkdir("/dev/.run/systemd/readahead", 0755); + mkdir("/run/systemd", 0755); + mkdir("/run/systemd/readahead", 0755); if ((fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0666)) < 0) return -errno; @@ -66,11 +66,11 @@ int sd_readahead(const char *action) { return -EINVAL; if (strcmp(action, "cancel") == 0) - return touch("/dev/.run/systemd/readahead/cancel"); + return touch("/run/systemd/readahead/cancel"); else if (strcmp(action, "done") == 0) - return touch("/dev/.run/systemd/readahead/done"); + return touch("/run/systemd/readahead/done"); else if (strcmp(action, "noreplay") == 0) - return touch("/dev/.run/systemd/readahead/noreplay"); + return touch("/run/systemd/readahead/noreplay"); return -EINVAL; } diff --git a/src/systemctl.c b/src/systemctl.c index 5e34d03945..4879b29d16 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -4023,11 +4023,11 @@ finish: static int install_info_apply(const char *verb, LookupPaths *paths, InstallInfo *i, const char *config_path) { const ConfigItem items[] = { - { "Alias", config_parse_strv, &i->aliases, "Install" }, - { "WantedBy", config_parse_strv, &i->wanted_by, "Install" }, - { "Also", config_parse_also, NULL, "Install" }, + { "Alias", config_parse_strv, 0, &i->aliases, "Install" }, + { "WantedBy", config_parse_strv, 0, &i->wanted_by, "Install" }, + { "Also", config_parse_also, 0, NULL, "Install" }, - { NULL, NULL, NULL, NULL } + { NULL, NULL, 0, NULL, NULL } }; char **p; @@ -5366,7 +5366,7 @@ static int send_shutdownd(usec_t t, char mode, bool warn, const char *message) { zero(sockaddr); sockaddr.sa.sa_family = AF_UNIX; sockaddr.un.sun_path[0] = 0; - strncpy(sockaddr.un.sun_path, "/dev/.run/systemd/shutdownd", sizeof(sockaddr.un.sun_path)); + strncpy(sockaddr.un.sun_path, "/run/systemd/shutdownd", sizeof(sockaddr.un.sun_path)); zero(iovec); iovec.iov_base = (char*) &c; @@ -5374,7 +5374,7 @@ static int send_shutdownd(usec_t t, char mode, bool warn, const char *message) { zero(msghdr); msghdr.msg_name = &sockaddr; - msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + sizeof("/dev/.run/systemd/shutdownd") - 1; + msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + sizeof("/run/systemd/shutdownd") - 1; msghdr.msg_iov = &iovec; msghdr.msg_iovlen = 1; diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c index 2c854fa8d9..dcf4b332b3 100644 --- a/src/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent.c @@ -251,12 +251,12 @@ static int parse_password(const char *filename, char **wall) { bool accept_cached = false; const ConfigItem items[] = { - { "Socket", config_parse_string, &socket_name, "Ask" }, - { "NotAfter", config_parse_uint64, ¬_after, "Ask" }, - { "Message", config_parse_string, &message, "Ask" }, - { "PID", config_parse_unsigned, &pid, "Ask" }, - { "AcceptCached", config_parse_bool, &accept_cached, "Ask" }, - { NULL, NULL, NULL, NULL } + { "Socket", config_parse_string, 0, &socket_name, "Ask" }, + { "NotAfter", config_parse_uint64, 0, ¬_after, "Ask" }, + { "Message", config_parse_string, 0, &message, "Ask" }, + { "PID", config_parse_unsigned, 0, &pid, "Ask" }, + { "AcceptCached", config_parse_bool, 0, &accept_cached, "Ask" }, + { NULL, NULL, 0, NULL, NULL } }; FILE *f; @@ -431,7 +431,7 @@ static int wall_tty_block(void) { if ((r = get_ctty_devnr(&devnr)) < 0) return -r; - if (asprintf(&p, "/dev/.run/systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0) + if (asprintf(&p, "/run/systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0) return -ENOMEM; mkdir_parents(p, 0700); @@ -475,7 +475,7 @@ static bool wall_tty_match(const char *path) { * advantage that the block will automatically go away if the * process dies. */ - if (asprintf(&p, "/dev/.run/systemd/ask-password-block/%u:%u", major(st.st_rdev), minor(st.st_rdev)) < 0) + if (asprintf(&p, "/run/systemd/ask-password-block/%u:%u", major(st.st_rdev), minor(st.st_rdev)) < 0) return true; fd = open(p, O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); @@ -494,7 +494,7 @@ static int show_passwords(void) { struct dirent *de; int r = 0; - if (!(d = opendir("/dev/.run/systemd/ask-password"))) { + if (!(d = opendir("/run/systemd/ask-password"))) { if (errno == ENOENT) return 0; @@ -519,7 +519,7 @@ static int show_passwords(void) { if (!startswith(de->d_name, "ask.")) continue; - if (!(p = strappend("/dev/.run/systemd/ask-password/", de->d_name))) { + if (!(p = strappend("/run/systemd/ask-password/", de->d_name))) { log_error("Out of memory"); r = -ENOMEM; goto finish; @@ -558,14 +558,14 @@ static int watch_passwords(void) { tty_block_fd = wall_tty_block(); - mkdir_p("/dev/.run/systemd/ask-password", 0755); + mkdir_p("/run/systemd/ask-password", 0755); if ((notify = inotify_init1(IN_CLOEXEC)) < 0) { r = -errno; goto finish; } - if (inotify_add_watch(notify, "/dev/.run/systemd/ask-password", IN_CLOSE_WRITE|IN_MOVED_TO) < 0) { + if (inotify_add_watch(notify, "/run/systemd/ask-password", IN_CLOSE_WRITE|IN_MOVED_TO) < 0) { r = -errno; goto finish; } |