X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind.c;h=5a394401dc414e5b09806982b80ca827ad814739;hp=63422f4c323f947e829724623666d2a422667aed;hb=db5c0122853a9ecf1cc92e6593461932df2fa866;hpb=ab06eef8101866dd1337c4759002f7360a9db416 diff --git a/src/login/logind.c b/src/login/logind.c index 63422f4c3..5a394401d 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -597,9 +597,9 @@ int manager_enumerate_seats(Manager *m) { } static int manager_enumerate_users_from_cgroup(Manager *m) { + _cleanup_closedir_ DIR *d = NULL; int r = 0, k; char *name; - DIR *d; r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_path, &d); if (r < 0) { @@ -612,31 +612,37 @@ static int manager_enumerate_users_from_cgroup(Manager *m) { while ((k = cg_read_subgroup(d, &name)) > 0) { User *user; + char *e; - k = manager_add_user_by_name(m, name, &user); - if (k < 0) { - free(name); - r = k; - continue; - } - - user_add_to_gc_queue(user); + e = endswith(name, ".user"); + if (e) { + *e = 0; - if (!user->cgroup_path) - if (asprintf(&user->cgroup_path, "%s/%s", m->cgroup_path, name) < 0) { - r = -ENOMEM; + k = manager_add_user_by_name(m, name, &user); + if (k < 0) { free(name); - break; + r = k; + continue; } + user_add_to_gc_queue(user); + + if (!user->cgroup_path) { + user->cgroup_path = strjoin(m->cgroup_path, "/", name, NULL); + if (!user->cgroup_path) { + k = log_oom(); + free(name); + break; + } + } + } + free(name); } - if (r >= 0 && k < 0) + if (k < 0) r = k; - closedir(d); - return r; } @@ -732,7 +738,7 @@ static int manager_enumerate_sessions_from_cgroup(Manager *m) { int r = 0; HASHMAP_FOREACH(u, m->users, i) { - DIR *d; + _cleanup_closedir_ DIR *d = NULL; char *name; int k; @@ -751,30 +757,34 @@ static int manager_enumerate_sessions_from_cgroup(Manager *m) { while ((k = cg_read_subgroup(d, &name)) > 0) { Session *session; + char *e; - if (streq(name, "shared")) - continue; + e = endswith(name, ".session"); + if (e) { + *e = 0; - k = manager_add_session(m, u, name, &session); - if (k < 0) { - free(name); - break; - } + k = manager_add_session(m, u, name, &session); + if (k < 0) { + free(name); + r = k; + continue; + } - session_add_to_gc_queue(session); + session_add_to_gc_queue(session); - if (!session->cgroup_path) - if (asprintf(&session->cgroup_path, "%s/%s", u->cgroup_path, name) < 0) { - k = -ENOMEM; - free(name); - break; + if (!session->cgroup_path) { + session->cgroup_path = strjoin(m->cgroup_path, "/", name, NULL); + if (!session->cgroup_path) { + k = log_oom(); + free(name); + break; + } } + } free(name); } - closedir(d); - if (k < 0) r = k; } @@ -1041,16 +1051,13 @@ int manager_get_session_by_cgroup(Manager *m, const char *cgroup, Session **sess return 1; } - p = strdup(cgroup); - if (!p) - return log_oom(); + p = strdupa(cgroup); for (;;) { char *e; e = strrchr(p, '/'); if (!e || e == p) { - free(p); *session = NULL; return 0; } @@ -1059,7 +1066,6 @@ int manager_get_session_by_cgroup(Manager *m, const char *cgroup, Session **sess s = hashmap_get(m->session_cgroups, p); if (s) { - free(p); *session = s; return 1; } @@ -1080,7 +1086,7 @@ int manager_get_user_by_cgroup(Manager *m, const char *cgroup, User **user) { return 1; } - p = strdup(cgroup); + p = strdupa(cgroup); if (!p) return log_oom(); @@ -1089,7 +1095,6 @@ int manager_get_user_by_cgroup(Manager *m, const char *cgroup, User **user) { e = strrchr(p, '/'); if (!e || e == p) { - free(p); *user = NULL; return 0; } @@ -1098,7 +1103,6 @@ int manager_get_user_by_cgroup(Manager *m, const char *cgroup, User **user) { u = hashmap_get(m->user_cgroups, p); if (u) { - free(p); *user = u; return 1; } @@ -1106,21 +1110,18 @@ int manager_get_user_by_cgroup(Manager *m, const char *cgroup, User **user) { } int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session) { - char *p; + _cleanup_free_ char *p = NULL; int r; assert(m); assert(pid >= 1); assert(session); - r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &p); + r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &p); if (r < 0) return r; - r = manager_get_session_by_cgroup(m, p, session); - free(p); - - return r; + return manager_get_session_by_cgroup(m, p, session); } void manager_cgroup_notify_empty(Manager *m, const char *cgroup) { @@ -1625,7 +1626,7 @@ int manager_run(Manager *m) { manager_gc(m, true); - if (m->action_what != 0) { + if (m->action_what != 0 && !m->action_job) { usec_t x, y; x = now(CLOCK_MONOTONIC); @@ -1682,13 +1683,12 @@ int manager_run(Manager *m) { } static int manager_parse_config_file(Manager *m) { - FILE *f; - const char *fn; + static const char fn[] = "/etc/systemd/logind.conf"; + _cleanup_fclose_ FILE *f = NULL; int r; assert(m); - fn = "/etc/systemd/logind.conf"; f = fopen(fn, "re"); if (!f) { if (errno == ENOENT) @@ -1698,12 +1698,11 @@ static int manager_parse_config_file(Manager *m) { return -errno; } - r = config_parse(fn, f, "Login\0", config_item_perf_lookup, (void*) logind_gperf_lookup, false, m); + r = config_parse(NULL, fn, f, "Login\0", config_item_perf_lookup, + (void*) logind_gperf_lookup, false, false, m); if (r < 0) log_warning("Failed to parse configuration file: %s", strerror(-r)); - fclose(f); - return r; }