chiark / gitweb /
execute: when running in session mode, still enforce proper ordering of logger socket
[elogind.git] / load-fragment.c
index e2c04e26beebb7faefcfc81a697fe6762a752b03..0b43c81194c7931f25565cbe976618ffd1002860 100644 (file)
@@ -1094,6 +1094,8 @@ static int load_from_path(Unit *u, const char *path) {
                 { "TimeoutSec",             config_parse_usec,            &u->service.timeout_usec,                        "Service" },
                 { "Type",                   config_parse_service_type,    &u->service,                                     "Service" },
                 { "Restart",                config_parse_service_restart, &u->service,                                     "Service" },
+                { "PermissionsStartOnly",   config_parse_bool,            &u->service.permissions_start_only,              "Service" },
+                { "RootDirectoryStartOnly", config_parse_bool,            &u->service.root_directory_start_only,           "Service" },
                 EXEC_CONTEXT_CONFIG_ITEMS(u->service.exec_context, "Service"),
 
                 { "ListenStream",           config_parse_listen,          &u->socket,                                      "Socket"  },
@@ -1219,7 +1221,6 @@ finish:
 
 int unit_load_fragment(Unit *u) {
         int r = 0;
-        ExecContext *c;
 
         assert(u);
         assert(u->meta.load_state == UNIT_STUB);
@@ -1228,33 +1229,43 @@ int unit_load_fragment(Unit *u) {
                 r = load_from_path(u, u->meta.fragment_path);
         else {
                 Iterator i;
-                char *t;
+                const char *t;
 
-                /* Try to find a name we can load this with */
-                SET_FOREACH(t, u->meta.names, i)
-                        if ((r = load_from_path(u, t)) != 0)
-                                return r;
+                /* Try to find the unit under its id */
+                if ((t = unit_id(u)))
+                        r = load_from_path(u, t);
+
+                /* Try to find an alias we can load this with */
+                if (r == 0)
+                        SET_FOREACH(t, u->meta.names, i)
+                                if ((r = load_from_path(u, t)) != 0)
+                                        break;
         }
 
-        if (u->meta.type == UNIT_SOCKET)
-                c = &u->socket.exec_context;
-        else if (u->meta.type == UNIT_SERVICE)
-                c = &u->service.exec_context;
-        else
-                c = NULL;
+        if (r >= 0) {
+                ExecContext *c;
 
-        if (r >= 0 && c &&
-            (c->output == EXEC_OUTPUT_KERNEL || c->output == EXEC_OUTPUT_SYSLOG)) {
-                int k;
+                if (u->meta.type == UNIT_SOCKET)
+                        c = &u->socket.exec_context;
+                else if (u->meta.type == UNIT_SERVICE)
+                        c = &u->service.exec_context;
+                else
+                        c = NULL;
 
-                /* If syslog or kernel logging is requested, make sure
-                 * our own logging daemon is run first. */
+                if (c &&
+                    (c->output == EXEC_OUTPUT_KERNEL || c->output == EXEC_OUTPUT_SYSLOG)) {
+                        int k;
 
-                if ((k = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET)) < 0)
-                        return k;
+                        /* If syslog or kernel logging is requested, make sure
+                         * our own logging daemon is run first. */
 
-                if ((k = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_LOGGER_SOCKET)) < 0)
-                        return k;
+                        if ((k = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET)) < 0)
+                                return k;
+
+                        if (u->meta.manager->running_as != MANAGER_SESSION)
+                                if ((k = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_LOGGER_SOCKET)) < 0)
+                                        return k;
+                }
         }
 
         return r;