Merge pull request #876 from zonque/logind
logind: switch to sd_bus_track helper
This commit is contained in:
@@ -183,44 +183,6 @@ int manager_add_button(Manager *m, const char *name, Button **_button) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int manager_watch_busname(Manager *m, const char *name) {
|
||||
char *n;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(name);
|
||||
|
||||
if (set_get(m->busnames, (char*) name))
|
||||
return 0;
|
||||
|
||||
n = strdup(name);
|
||||
if (!n)
|
||||
return -ENOMEM;
|
||||
|
||||
r = set_put(m->busnames, n);
|
||||
if (r < 0) {
|
||||
free(n);
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void manager_drop_busname(Manager *m, const char *name) {
|
||||
Session *session;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
assert(name);
|
||||
|
||||
/* keep it if the name still owns a controller */
|
||||
HASHMAP_FOREACH(session, m->sessions, i)
|
||||
if (session_is_controller(session, name))
|
||||
return;
|
||||
|
||||
free(set_remove(m->busnames, (char*) name));
|
||||
}
|
||||
|
||||
int manager_process_seat_device(Manager *m, struct udev_device *d) {
|
||||
Device *device;
|
||||
int r;
|
||||
|
||||
@@ -2652,41 +2652,6 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error
|
||||
return 0;
|
||||
}
|
||||
|
||||
int match_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
const char *name, *old, *new;
|
||||
Manager *m = userdata;
|
||||
Session *session;
|
||||
Iterator i;
|
||||
int r;
|
||||
char *key;
|
||||
|
||||
assert(message);
|
||||
assert(m);
|
||||
|
||||
r = sd_bus_message_read(message, "sss", &name, &old, &new);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return r;
|
||||
}
|
||||
|
||||
if (isempty(old) || !isempty(new))
|
||||
return 0;
|
||||
|
||||
key = set_remove(m->busnames, (char*) old);
|
||||
if (!key)
|
||||
return 0;
|
||||
|
||||
/* Drop all controllers owned by this name */
|
||||
|
||||
free(key);
|
||||
|
||||
HASHMAP_FOREACH(session, m->sessions, i)
|
||||
if (session_is_controller(session, old))
|
||||
session_drop_controller(session);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int manager_send_changed(Manager *manager, const char *property, ...) {
|
||||
char **l;
|
||||
|
||||
|
||||
@@ -1120,7 +1120,18 @@ static void session_release_controller(Session *s, bool notify) {
|
||||
session_device_free(sd);
|
||||
|
||||
s->controller = NULL;
|
||||
manager_drop_busname(s->manager, name);
|
||||
s->track = sd_bus_track_unref(s->track);
|
||||
}
|
||||
|
||||
static int on_bus_track(sd_bus_track *track, void *userdata) {
|
||||
Session *s = userdata;
|
||||
|
||||
assert(track);
|
||||
assert(s);
|
||||
|
||||
session_drop_controller(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int session_set_controller(Session *s, const char *sender, bool force) {
|
||||
@@ -1139,8 +1150,13 @@ int session_set_controller(Session *s, const char *sender, bool force) {
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
r = manager_watch_busname(s->manager, name);
|
||||
if (r)
|
||||
s->track = sd_bus_track_unref(s->track);
|
||||
r = sd_bus_track_new(s->manager->bus, &s->track, on_bus_track, s);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_track_add_name(s->track, name);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* When setting a session controller, we forcibly mute the VT and set
|
||||
@@ -1153,7 +1169,7 @@ int session_set_controller(Session *s, const char *sender, bool force) {
|
||||
* or reset the VT in case it crashed/exited, too. */
|
||||
r = session_prepare_vt(s);
|
||||
if (r < 0) {
|
||||
manager_drop_busname(s->manager, name);
|
||||
s->track = sd_bus_track_unref(s->track);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1171,6 +1187,7 @@ void session_drop_controller(Session *s) {
|
||||
if (!s->controller)
|
||||
return;
|
||||
|
||||
s->track = sd_bus_track_unref(s->track);
|
||||
session_release_controller(s, false);
|
||||
session_save(s);
|
||||
session_restore_vt(s);
|
||||
|
||||
@@ -117,6 +117,7 @@ struct Session {
|
||||
|
||||
char *controller;
|
||||
Hashmap *devices;
|
||||
sd_bus_track *track;
|
||||
|
||||
LIST_FIELDS(Session, sessions_by_user);
|
||||
LIST_FIELDS(Session, sessions_by_seat);
|
||||
|
||||
+1
-17
@@ -76,10 +76,7 @@ static Manager *manager_new(void) {
|
||||
m->user_units = hashmap_new(&string_hash_ops);
|
||||
m->session_units = hashmap_new(&string_hash_ops);
|
||||
|
||||
m->busnames = set_new(&string_hash_ops);
|
||||
|
||||
if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->busnames ||
|
||||
!m->user_units || !m->session_units)
|
||||
if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->user_units || !m->session_units)
|
||||
goto fail;
|
||||
|
||||
m->kill_exclude_users = strv_new("root", NULL);
|
||||
@@ -141,8 +138,6 @@ static void manager_free(Manager *m) {
|
||||
hashmap_free(m->user_units);
|
||||
hashmap_free(m->session_units);
|
||||
|
||||
set_free_free(m->busnames);
|
||||
|
||||
sd_event_source_unref(m->idle_action_event_source);
|
||||
sd_event_source_unref(m->inhibit_timeout_source);
|
||||
sd_event_source_unref(m->scheduled_shutdown_timeout_source);
|
||||
@@ -626,17 +621,6 @@ static int manager_connect_bus(Manager *m) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add user enumerator: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
"sender='org.freedesktop.DBus',"
|
||||
"interface='org.freedesktop.DBus',"
|
||||
"member='NameOwnerChanged',"
|
||||
"path='/org/freedesktop/DBus'",
|
||||
match_name_owner_changed, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add match for NameOwnerChanged: %m");
|
||||
|
||||
r = sd_bus_add_match(m->bus,
|
||||
NULL,
|
||||
"type='signal',"
|
||||
|
||||
@@ -48,8 +48,6 @@ struct Manager {
|
||||
Hashmap *inhibitors;
|
||||
Hashmap *buttons;
|
||||
|
||||
Set *busnames;
|
||||
|
||||
LIST_HEAD(Seat, seat_gc_queue);
|
||||
LIST_HEAD(Session, session_gc_queue);
|
||||
LIST_HEAD(User, user_gc_queue);
|
||||
@@ -181,9 +179,6 @@ int manager_job_is_active(Manager *manager, const char *path);
|
||||
/* gperf lookup function */
|
||||
const struct ConfigPerfItem* logind_gperf_lookup(const char *key, unsigned length);
|
||||
|
||||
int manager_watch_busname(Manager *manager, const char *name);
|
||||
void manager_drop_busname(Manager *manager, const char *name);
|
||||
|
||||
int manager_set_lid_switch_ignore(Manager *m, usec_t until);
|
||||
|
||||
int config_parse_tmpfs_size(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
|
||||
Reference in New Issue
Block a user