chiark / gitweb /
logind: send dbus signals when sessions/users/seats come and go
authorLennart Poettering <lennart@poettering.net>
Tue, 21 Jun 2011 18:43:34 +0000 (20:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 21 Jun 2011 18:43:34 +0000 (20:43 +0200)
src/logind-seat-dbus.c
src/logind-seat.c
src/logind-seat.h
src/logind-session-dbus.c
src/logind-session.c
src/logind-session.h
src/logind-user-dbus.c
src/logind-user.c
src/logind-user.h

index 32171ce4010d1a5d15243e558835ebb3440acaa9..33eafe5ee5dd2a0e71398fa0f26d6063bf23a66d 100644 (file)
@@ -333,3 +333,40 @@ char *seat_bus_path(Seat *s) {
 
         return r;
 }
+
+int seat_send_signal(Seat *s, bool new_seat) {
+        DBusMessage *m;
+        int r = -ENOMEM;
+        char *p = NULL;
+
+        assert(s);
+
+        m = dbus_message_new_signal("/org/freedesktop/login1",
+                                    "org.freedesktop.login1.Manager",
+                                    new_seat ? "SeatNew" : "SeatRemoved");
+
+        if (!m)
+                return -ENOMEM;
+
+        p = seat_bus_path(s);
+        if (!p)
+                goto finish;
+
+        if (!dbus_message_append_args(
+                            m,
+                            DBUS_TYPE_STRING, &s->id,
+                            DBUS_TYPE_OBJECT_PATH, &p,
+                            DBUS_TYPE_INVALID))
+                goto finish;
+
+        if (!dbus_connection_send(s->manager->bus, m, NULL))
+                goto finish;
+
+        r = 0;
+
+finish:
+        dbus_message_unref(m);
+        free(p);
+
+        return r;
+}
index 751f59a48d6f3d74239263f5be67e4761cccf8bd..95c66dd7125649cff8d54efbe6c475e65109bc9f 100644 (file)
@@ -314,6 +314,8 @@ int seat_start(Seat *s) {
 
         s->started = true;
 
+        seat_send_signal(s, true);
+
         return 0;
 }
 
@@ -327,6 +329,8 @@ int seat_stop(Seat *s) {
 
         log_info("Removed seat %s.", s->id);
 
+        seat_send_signal(s, false);
+
         seat_stop_sessions(s);
 
         unlink(s->state_file);
index dfbb2a2a0a6e698cf1e3413b80564093b545ee09..a7cd6c7e47c194f48886a3807c04294f86a4002b 100644 (file)
@@ -74,4 +74,6 @@ char *seat_bus_path(Seat *s);
 
 extern const DBusObjectPathVTable bus_seat_vtable;
 
+int seat_send_signal(Seat *s, bool new_seat);
+
 #endif
index 6bded6a4549d830562a6a582fe1e10ac74d15984..edc96dd6443a91b298a3b729d10ff8b4ca535973 100644 (file)
@@ -382,3 +382,40 @@ char *session_bus_path(Session *s) {
 
         return r;
 }
+
+int session_send_signal(Session *s, bool new_session) {
+        DBusMessage *m;
+        int r = -ENOMEM;
+        char *p = NULL;
+
+        assert(s);
+
+        m = dbus_message_new_signal("/org/freedesktop/login1",
+                                    "org.freedesktop.login1.Manager",
+                                    new_session ? "SessionNew" : "SessionRemoved");
+
+        if (!m)
+                return -ENOMEM;
+
+        p = session_bus_path(s);
+        if (!p)
+                goto finish;
+
+        if (!dbus_message_append_args(
+                            m,
+                            DBUS_TYPE_STRING, &s->id,
+                            DBUS_TYPE_OBJECT_PATH, &p,
+                            DBUS_TYPE_INVALID))
+                goto finish;
+
+        if (!dbus_connection_send(s->manager->bus, m, NULL))
+                goto finish;
+
+        r = 0;
+
+finish:
+        dbus_message_unref(m);
+        free(p);
+
+        return r;
+}
index 0d34037b5d8cc024c17649b0dec8561d385ade80..26f857dc3956e78a33815de6a2abe80e74b73796 100644 (file)
@@ -443,6 +443,8 @@ int session_start(Session *s) {
 
         dual_timestamp_get(&s->timestamp);
 
+        session_send_signal(s, true);
+
         return 0;
 }
 
@@ -519,6 +521,8 @@ int session_stop(Session *s) {
 
         assert(s);
 
+        session_send_signal(s, false);
+
         /* Kill cgroup */
         k = session_kill_cgroup(s);
         if (k < 0)
index 9f58165da9fbb284f01a3372701fc31f45e5352e..a30c3e727ea9c71c3a16456682f48b00dd441601 100644 (file)
@@ -96,6 +96,8 @@ char *session_bus_path(Session *s);
 
 extern const DBusObjectPathVTable bus_session_vtable;
 
+int session_send_signal(Session *s, bool new_session);
+
 const char* session_type_to_string(SessionType t);
 SessionType session_type_from_string(const char *s);
 
index 3be2c05d263f2b2d7c6c562d7489290d2fa51b4f..c8d47de0e7358ea9d0b058c0150038acac4fd488 100644 (file)
@@ -313,3 +313,43 @@ char *user_bus_path(User *u) {
 
         return s;
 }
+
+int user_send_signal(User *u, bool new_user) {
+        DBusMessage *m;
+        int r = -ENOMEM;
+        char *p = NULL;
+        uint32_t uid;
+
+        assert(u);
+
+        m = dbus_message_new_signal("/org/freedesktop/login1",
+                                    "org.freedesktop.login1.Manager",
+                                    new_user ? "UserNew" : "UserRemoved");
+
+        if (!m)
+                return -ENOMEM;
+
+        p = user_bus_path(u);
+        if (!p)
+                goto finish;
+
+        uid = u->uid;
+
+        if (!dbus_message_append_args(
+                            m,
+                            DBUS_TYPE_UINT32, &uid,
+                            DBUS_TYPE_OBJECT_PATH, &p,
+                            DBUS_TYPE_INVALID))
+                goto finish;
+
+        if (!dbus_connection_send(u->manager->bus, m, NULL))
+                goto finish;
+
+        r = 0;
+
+finish:
+        dbus_message_unref(m);
+        free(p);
+
+        return r;
+}
index 206064f1039224339330627be7f7128bab6c6edf..70d6a9a5242a22c1e033a793a69ce60e76989a82 100644 (file)
@@ -280,6 +280,8 @@ int user_start(User *u) {
 
         dual_timestamp_get(&u->timestamp);
 
+        user_send_signal(u, true);
+
         return 0;
 }
 
@@ -365,6 +367,8 @@ int user_stop(User *u) {
                         r = k;
         }
 
+        user_send_signal(u, false);
+
         /* Kill systemd */
         k = user_stop_service(u);
         if (k < 0)
index c891119e274f897fefa41354692a0134d99d61b3..c6f14011099c8db2c7361633421ea128f97d2547 100644 (file)
@@ -75,6 +75,8 @@ char *user_bus_path(User *s);
 
 extern const DBusObjectPathVTable bus_user_vtable;
 
+int user_send_signal(User *u, bool new_user);
+
 const char* user_state_to_string(UserState s);
 UserState user_state_from_string(const char *s);