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:
parent
e1c9c2d536
commit
da11939561
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user