chiark / gitweb /
logind: always kill session when termination is requested
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 9 Feb 2014 01:29:56 +0000 (20:29 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 12 Feb 2014 00:14:47 +0000 (19:14 -0500)
KillUserProcesses=yes/no should be ignored when termination is
explicitly requested.

src/login/logind-dbus.c
src/login/logind-seat-dbus.c
src/login/logind-seat.c
src/login/logind-seat.h
src/login/logind-session-dbus.c
src/login/logind-session.c
src/login/logind-session.h
src/login/logind-user-dbus.c
src/login/logind-user.c
src/login/logind-user.h
src/login/logind.c

index 7e96a04ca70a8a5883a1d2d4695dd0ec734f1d4e..08e53c36956a6821e56a717c646a637865375155 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;
 
index 909007c30c95296588581140cad9e6462b5d6a32..26cddfea70f7e40bdb71e14f9b4efa3c5e27ffad 100644 (file)
@@ -201,7 +201,7 @@ static int method_terminate(sd_bus *bus, sd_bus_message *message, void *userdata
         assert(message);
         assert(s);
 
-        r = seat_stop_sessions(s);
+        r = seat_stop_sessions(s, true);
         if (r < 0)
                 return r;
 
index c7f112afb77b8a4ff46435fe59d64c68724630ea..631be5f7409830d87592f6b278ce3057911e1b6a 100644 (file)
@@ -418,7 +418,7 @@ int seat_start(Seat *s) {
         return 0;
 }
 
-int seat_stop(Seat *s) {
+int seat_stop(Seat *s, bool force) {
         int r = 0;
 
         assert(s);
@@ -430,7 +430,7 @@ int seat_stop(Seat *s) {
                            "MESSAGE=Removed seat %s.", s->id,
                            NULL);
 
-        seat_stop_sessions(s);
+        seat_stop_sessions(s, force);
 
         unlink(s->state_file);
         seat_add_to_gc_queue(s);
@@ -443,14 +443,14 @@ int seat_stop(Seat *s) {
         return r;
 }
 
-int seat_stop_sessions(Seat *s) {
+int seat_stop_sessions(Seat *s, bool force) {
         Session *session;
         int r = 0, k;
 
         assert(s);
 
         LIST_FOREACH(sessions_by_seat, session, s->sessions) {
-                k = session_stop(session);
+                k = session_stop(session, force);
                 if (k < 0)
                         r = k;
         }
index 9e21e3a8a3afa8058e3e48bfd342dcd209faea4c..9e469d41c658e30dae3a5e642346dcf81372dade 100644 (file)
@@ -80,8 +80,8 @@ bool seat_can_graphical(Seat *s);
 int seat_get_idle_hint(Seat *s, dual_timestamp *t);
 
 int seat_start(Seat *s);
-int seat_stop(Seat *s);
-int seat_stop_sessions(Seat *s);
+int seat_stop(Seat *s, bool force);
+int seat_stop_sessions(Seat *s, bool force);
 
 bool seat_check_gc(Seat *s, bool drop_not_started);
 void seat_add_to_gc_queue(Seat *s);
index 7ee49562cf1539193483f021c58be8eb80bd21e9..f9305ddbee63c04147b98711e97eb6157d04ab7b 100644 (file)
@@ -188,7 +188,7 @@ static int method_terminate(sd_bus *bus, sd_bus_message *message, void *userdata
         assert(message);
         assert(s);
 
-        r = session_stop(s);
+        r = session_stop(s, true);
         if (r < 0)
                 return r;
 
index f661cc8b8d2aa1720b70bf6b349348b93b9b8239..d4742e1134475671843a3ebe5de5a63254be825f 100644 (file)
@@ -565,7 +565,7 @@ int session_start(Session *s) {
         return 0;
 }
 
-static int session_stop_scope(Session *s) {
+static int session_stop_scope(Session *s, bool force) {
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         char *job;
         int r;
@@ -575,7 +575,7 @@ static int session_stop_scope(Session *s) {
         if (!s->scope)
                 return 0;
 
-        if (manager_shall_kill(s->manager, s->user->name)) {
+        if (force || manager_shall_kill(s->manager, s->user->name)) {
                 r = manager_stop_unit(s->manager, s->scope, &error, &job);
                 if (r < 0) {
                         log_error("Failed to stop session scope: %s", bus_error_message(&error, r));
@@ -595,7 +595,7 @@ static int session_stop_scope(Session *s) {
         return 0;
 }
 
-int session_stop(Session *s) {
+int session_stop(Session *s, bool force) {
         int r;
 
         assert(s);
@@ -609,7 +609,7 @@ int session_stop(Session *s) {
         session_remove_fifo(s);
 
         /* Kill cgroup */
-        r = session_stop_scope(s);
+        r = session_stop_scope(s, force);
 
         s->stopping = true;
 
@@ -672,7 +672,7 @@ static int release_timeout_callback(sd_event_source *es, uint64_t usec, void *us
         assert(es);
         assert(s);
 
-        session_stop(s);
+        session_stop(s, false);
         return 0;
 }
 
@@ -812,7 +812,7 @@ static int session_dispatch_fifo(sd_event_source *es, int fd, uint32_t revents,
         /* EOF on the FIFO means the session died abnormally. */
 
         session_remove_fifo(s);
-        session_stop(s);
+        session_stop(s, false);
 
         return 1;
 }
index 42552bc2bdc62b69f27e46fca25bb144c305c044..c9af5ebe0d58a96b84cd6ba4e21d16950a885086 100644 (file)
@@ -136,7 +136,7 @@ int session_get_idle_hint(Session *s, dual_timestamp *t);
 void session_set_idle_hint(Session *s, bool b);
 int session_create_fifo(Session *s);
 int session_start(Session *s);
-int session_stop(Session *s);
+int session_stop(Session *s, bool force);
 int session_finalize(Session *s);
 void session_release(Session *s);
 int session_save(Session *s);
index 2d49b8b96ede5ec4d7ec5069a5a08dd11261fdf8..18eea89701cd45c4b2e410fe2c9489613190c3f1 100644 (file)
@@ -180,7 +180,7 @@ static int method_terminate(sd_bus *bus, sd_bus_message *message, void *userdata
         assert(message);
         assert(u);
 
-        r = user_stop(u);
+        r = user_stop(u, true);
         if (r < 0)
                 return r;
 
index 06fdbb36fc9758fc307b1dc43000db5fc8609181..ac4a651f367323d8b876c2afb7c831dc35f9ba3c 100644 (file)
@@ -494,13 +494,13 @@ static int user_remove_runtime_path(User *u) {
         return r;
 }
 
-int user_stop(User *u) {
+int user_stop(User *u, bool force) {
         Session *s;
         int r = 0, k;
         assert(u);
 
         LIST_FOREACH(sessions_by_user, s, u->sessions) {
-                k = session_stop(s);
+                k = session_stop(s, force);
                 if (k < 0)
                         r = k;
         }
index b0fefe9b9cfe10877007ccd97cdead9a79ff11e7..f237d2a6b97f7e3c5d768278286ce2b88ef23e55 100644 (file)
@@ -72,7 +72,7 @@ void user_free(User *u);
 bool user_check_gc(User *u, bool drop_not_started);
 void user_add_to_gc_queue(User *u);
 int user_start(User *u);
-int user_stop(User *u);
+int user_stop(User *u, bool force);
 int user_finalize(User *u);
 UserState user_get_state(User *u);
 int user_get_idle_hint(User *u, dual_timestamp *t);
index a6f84e85360cc172efd3aa017a77ec152c18c5aa..554409926a120b0b6345c36b4861c874f159d83b 100644 (file)
@@ -862,7 +862,7 @@ void manager_gc(Manager *m, bool drop_not_started) {
                 seat->in_gc_queue = false;
 
                 if (!seat_check_gc(seat, drop_not_started)) {
-                        seat_stop(seat);
+                        seat_stop(seat, false);
                         seat_free(seat);
                 }
         }
@@ -874,7 +874,7 @@ void manager_gc(Manager *m, bool drop_not_started) {
                 /* First, if we are not closing yet, initiate stopping */
                 if (!session_check_gc(session, drop_not_started) &&
                     session_get_state(session) != SESSION_CLOSING)
-                        session_stop(session);
+                        session_stop(session, false);
 
                 /* Normally, this should make the session busy again,
                  * if it doesn't then let's get rid of it
@@ -891,7 +891,7 @@ void manager_gc(Manager *m, bool drop_not_started) {
 
                 if (!user_check_gc(user, drop_not_started) &&
                     user_get_state(user) != USER_CLOSING)
-                        user_stop(user);
+                        user_stop(user, false);
 
                 if (!user_check_gc(user, drop_not_started)) {
                         user_finalize(user);