chiark / gitweb /
logind: remove redundant check in manager_new()
[elogind.git] / src / login / logind-dbus.c
index 40885557c14a465f9f9d4aa2f0df0f9e98f96f9b..bd0de33866c0a23ac3321bcdc77c59db8e25b67d 100644 (file)
@@ -939,7 +939,7 @@ static int method_terminate_session(sd_bus *bus, sd_bus_message *message, void *
         if (!session)
                 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_SESSION, "No session '%s' known", name);
 
-        r = session_stop(session);
+        r = session_stop(session, true);
         if (r < 0)
                 return r;
 
@@ -964,7 +964,7 @@ static int method_terminate_user(sd_bus *bus, sd_bus_message *message, void *use
         if (!user)
                 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_USER, "No user '%lu' known or logged in", (unsigned long) uid);
 
-        r = user_stop(user);
+        r = user_stop(user, true);
         if (r < 0)
                 return r;
 
@@ -989,7 +989,7 @@ static int method_terminate_seat(sd_bus *bus, sd_bus_message *message, void *use
         if (!seat)
                 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_SEAT, "No seat '%s' known", name);
 
-        r = seat_stop_sessions(seat);
+        r = seat_stop_sessions(seat, true);
         if (r < 0)
                 return r;
 
@@ -1911,6 +1911,27 @@ const sd_bus_vtable manager_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
+static int session_jobs_reply(Session *s, const char *unit, const char *result) {
+        int r = 0;
+
+        assert(s);
+        assert(unit);
+
+        if (!s->started)
+                return r;
+
+        if (streq(result, "done"))
+                r = session_send_create_reply(s, NULL);
+        else {
+                _cleanup_bus_error_free_ sd_bus_error e = SD_BUS_ERROR_NULL;
+
+                sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, "Start job for unit %s failed with '%s'", unit, result);
+                r = session_send_create_reply(s, &e);
+        }
+
+        return r;
+}
+
 int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) {
         const char *path, *result, *unit;
         Manager *m = userdata;
@@ -1950,18 +1971,9 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b
                         session->scope_job = NULL;
                 }
 
-                if (session->started) {
-                        if (streq(result, "done"))
-                                session_send_create_reply(session, NULL);
-                        else {
-                                _cleanup_bus_error_free_ sd_bus_error e = SD_BUS_ERROR_NULL;
-
-                                sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, "Start job for unit %s failed with '%s'", unit, result);
-                                session_send_create_reply(session, &e);
-                        }
-                } else
-                        session_save(session);
+                session_jobs_reply(session, unit, result);
 
+                session_save(session);
                 session_add_to_gc_queue(session);
         }
 
@@ -1979,17 +1991,7 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b
                 }
 
                 LIST_FOREACH(sessions_by_user, session, user->sessions) {
-                        if (!session->started)
-                                continue;
-
-                        if (streq(result, "done"))
-                                session_send_create_reply(session, NULL);
-                        else {
-                                _cleanup_bus_error_free_ sd_bus_error e = SD_BUS_ERROR_NULL;
-
-                                sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, "Start job for unit %s failed with '%s'", unit, result);
-                                session_send_create_reply(session, &e);
-                        }
+                        session_jobs_reply(session, unit, result);
                 }
 
                 user_save(user);
@@ -2045,7 +2047,8 @@ int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdat
 
         r = unit_name_from_dbus_path(path, &unit);
         if (r < 0)
-                return r;
+                /* quietly ignore non-units paths */
+                return r == -EINVAL ? 0 : r;
 
         session = hashmap_get(m->session_units, unit);
         if (session)
@@ -2176,7 +2179,7 @@ int manager_start_scope(
                 pid_t pid,
                 const char *slice,
                 const char *description,
-                const char *after,
+                const char *after, const char *after2,
                 sd_bus_error *error,
                 char **job) {
 
@@ -2217,21 +2220,23 @@ int manager_start_scope(
                         return r;
         }
 
-        if (!isempty(description)) {
+        if (!isempty(after)) {
                 r = sd_bus_message_append(m, "(sv)", "After", "as", 1, after);
                 if (r < 0)
                         return r;
         }
 
+        if (!isempty(after2)) {
+                r = sd_bus_message_append(m, "(sv)", "After", "as", 1, after2);
+                if (r < 0)
+                        return r;
+        }
+
         /* cgroup empty notification is not available in containers
          * currently. To make this less problematic, let's shorten the
          * stop timeout for sessions, so that we don't wait
          * forever. */
 
-        r = sd_bus_message_append(m, "(sv)", "TimeoutStopUSec", "t", 500 * USEC_PER_MSEC);
-        if (r < 0)
-                return r;
-
         /* Make sure that the session shells are terminated with
          * SIGHUP since bash and friends tend to ignore SIGTERM */
         r = sd_bus_message_append(m, "(sv)", "SendSIGHUP", "b", true);
@@ -2358,7 +2363,6 @@ int manager_stop_unit(Manager *manager, const char *unit, sd_bus_error *error, c
 }
 
 int manager_abandon_scope(Manager *manager, const char *scope, sd_bus_error *error) {
-        _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_free_ char *path = NULL;
         int r;
 
@@ -2380,7 +2384,8 @@ int manager_abandon_scope(Manager *manager, const char *scope, sd_bus_error *err
                         NULL);
         if (r < 0) {
                 if (sd_bus_error_has_name(error, BUS_ERROR_NO_SUCH_UNIT) ||
-                    sd_bus_error_has_name(error, BUS_ERROR_LOAD_FAILED)) {
+                    sd_bus_error_has_name(error, BUS_ERROR_LOAD_FAILED) ||
+                    sd_bus_error_has_name(error, BUS_ERROR_SCOPE_NOT_RUNNING)) {
                         sd_bus_error_free(error);
                         return 0;
                 }