chiark / gitweb /
exec: Ignore the setting SELinuxContext if selinux is not enabled
[elogind.git] / src / core / mount.c
index 77493dbd3c40c4ca72a9a96e4a385490c6a4199d..45c0040bd1e0541f30086518b748aa6fc9b4d08d 100644 (file)
@@ -750,8 +750,8 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) {
 
         if (m->control_pid > 0)
                 fprintf(f,
-                        "%sControl PID: %lu\n",
-                        prefix, (unsigned long) m->control_pid);
+                        "%sControl PID: "PID_FMT"\n",
+                        prefix, m->control_pid);
 
         exec_context_dump(&m->exec_context, f, prefix);
         kill_context_dump(&m->kill_context, f, prefix);
@@ -787,6 +787,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
                        UNIT(m)->manager->cgroup_supported,
                        UNIT(m)->cgroup_path,
                        UNIT(m)->id,
+                       0,
                        NULL,
                        m->exec_runtime,
                        &pid);
@@ -853,8 +854,14 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
                         goto fail;
 
                 mount_set_state(m, state);
-        } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
+        } else if (state == MOUNT_REMOUNTING_SIGTERM)
+                mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS);
+        else if (state == MOUNT_REMOUNTING_SIGKILL)
                 mount_enter_mounted(m, MOUNT_SUCCESS);
+        else if (state == MOUNT_MOUNTING_SIGTERM)
+                mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_SUCCESS);
+        else if (state == MOUNT_UNMOUNTING_SIGTERM)
+                mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_SUCCESS);
         else
                 mount_enter_dead(m, MOUNT_SUCCESS);
 
@@ -1092,7 +1099,7 @@ static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
         unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
 
         if (m->control_pid > 0)
-                unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
+                unit_serialize_item_format(u, f, "control-pid", PID_FMT, m->control_pid);
 
         if (m->control_command_id >= 0)
                 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
@@ -1377,12 +1384,13 @@ static int mount_add_one(
                 const char *options,
                 const char *fstype,
                 bool set_flags) {
-        int r;
-        Unit *u;
-        bool delete;
-        char *e, *w = NULL, *o = NULL, *f = NULL;
-        MountParameters *p;
+
+        _cleanup_free_ char *e = NULL, *w = NULL, *o = NULL, *f = NULL;
         bool load_extras = false;
+        MountParameters *p;
+        bool delete;
+        Unit *u;
+        int r;
 
         assert(m);
         assert(what);
@@ -1408,20 +1416,13 @@ static int mount_add_one(
 
         u = manager_get_unit(m, e);
         if (!u) {
-                const char* const target =
-                        fstype_is_network(fstype) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
-
                 delete = true;
 
                 u = unit_new(m, sizeof(Mount));
-                if (!u) {
-                        free(e);
+                if (!u)
                         return -ENOMEM;
-                }
 
                 r = unit_add_name(u, e);
-                free(e);
-
                 if (r < 0)
                         goto fail;
 
@@ -1437,20 +1438,26 @@ static int mount_add_one(
                         goto fail;
                 }
 
-                r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true);
-                if (r < 0)
-                        goto fail;
 
-                if (should_umount(MOUNT(u))) {
-                        r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
+                if (m->running_as == SYSTEMD_SYSTEM) {
+                        const char* target;
+
+                        target = fstype_is_network(fstype) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
+
+                        r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true);
                         if (r < 0)
                                 goto fail;
+
+                        if (should_umount(MOUNT(u))) {
+                                r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
+                                if (r < 0)
+                                        goto fail;
+                        }
                 }
 
                 unit_add_to_load_queue(u);
         } else {
                 delete = false;
-                free(e);
 
                 if (!MOUNT(u)->where) {
                         MOUNT(u)->where = strdup(where);
@@ -1488,12 +1495,15 @@ static int mount_add_one(
 
         free(p->what);
         p->what = w;
+        w = NULL;
 
         free(p->options);
         p->options = o;
+        o = NULL;
 
         free(p->fstype);
         p->fstype = f;
+        f = NULL;
 
         if (load_extras) {
                 r = mount_add_extras(MOUNT(u));
@@ -1506,10 +1516,6 @@ static int mount_add_one(
         return 0;
 
 fail:
-        free(w);
-        free(o);
-        free(f);
-
         if (delete && u)
                 unit_free(u);
 
@@ -1583,6 +1589,20 @@ static void mount_shutdown(Manager *m) {
         }
 }
 
+static int mount_get_timeout(Unit *u, uint64_t *timeout) {
+        Mount *m = MOUNT(u);
+        int r;
+
+        if (!m->timer_event_source)
+                return 0;
+
+        r = sd_event_source_get_time(m->timer_event_source, timeout);
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
 static int mount_enumerate(Manager *m) {
         int r;
         assert(m);
@@ -1793,10 +1813,11 @@ const UnitVTable mount_vtable = {
 
         .bus_interface = "org.freedesktop.systemd1.Mount",
         .bus_vtable = bus_mount_vtable,
-        .bus_changing_properties = bus_mount_changing_properties,
         .bus_set_property = bus_mount_set_property,
         .bus_commit_properties = bus_mount_commit_properties,
 
+        .get_timeout = mount_get_timeout,
+
         .enumerate = mount_enumerate,
         .shutdown = mount_shutdown,