1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-06 16:59:03 +03:00

logind: send dbus signals when sessions/users/seats come and go

This commit is contained in:
Lennart Poettering 2011-06-21 20:43:34 +02:00
parent e1c9c2d536
commit da11939561
9 changed files with 132 additions and 0 deletions

View 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;
}

View 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);

View 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

View 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;
}

View 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)

View 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);

View 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;
}

View 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)

View 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);