X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind.c;h=4633a5ef29109c9cf51538dfdc99deb5de96a4fb;hb=e99fa3cba5c0a07bdcea22a308bf9b973e88b624;hp=f96ace2315734b4dcd99b14a2d8c6f015cc369e6;hpb=7e2bb92dcae6ee785ff7462aadc8c369fd93715b;p=elogind.git diff --git a/src/logind.c b/src/logind.c index f96ace231..4633a5ef2 100644 --- a/src/logind.c +++ b/src/logind.c @@ -239,17 +239,18 @@ int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User ** } int manager_add_user_by_name(Manager *m, const char *name, User **_user) { - struct passwd *p; + uid_t uid; + gid_t gid; + int r; assert(m); assert(name); - errno = 0; - p = getpwnam(name); - if (!p) - return errno ? -errno : -ENOENT; + r = get_user_creds(&name, &uid, &gid, NULL); + if (r < 0) + return r; - return manager_add_user(m, p->pw_uid, p->pw_gid, name, _user); + return manager_add_user(m, uid, gid, name, _user); } int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user) { @@ -273,8 +274,7 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) { if (streq_ptr(udev_device_get_action(d), "remove")) { - /* FIXME: use syspath instead of sysname here, as soon as fb driver is fixed */ - device = hashmap_get(m->devices, udev_device_get_sysname(d)); + device = hashmap_get(m->devices, udev_device_get_syspath(d)); if (!device) return 0; @@ -294,7 +294,7 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) { return 0; } - r = manager_add_device(m, udev_device_get_sysname(d), &device); + r = manager_add_device(m, udev_device_get_syspath(d), &device); if (r < 0) return r; @@ -413,6 +413,7 @@ static int manager_enumerate_users_from_cgroup(Manager *m) { int r = 0; char *name; DIR *d; + int k; r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_path, &d); if (r < 0) { @@ -423,9 +424,8 @@ static int manager_enumerate_users_from_cgroup(Manager *m) { return r; } - while ((r = cg_read_subgroup(d, &name)) > 0) { + while ((k = cg_read_subgroup(d, &name)) > 0) { User *user; - int k; k = manager_add_user_by_name(m, name, &user); if (k < 0) { @@ -446,6 +446,9 @@ static int manager_enumerate_users_from_cgroup(Manager *m) { free(name); } + if (r >= 0 && k < 0) + r = k; + closedir(d); return r; @@ -509,19 +512,19 @@ int manager_enumerate_users(Manager *m) { } while ((de = readdir(d))) { - unsigned long ul; + uid_t uid; User *u; if (!dirent_is_file(de)) continue; - k = safe_atolu(de->d_name, &ul); + k = parse_uid(de->d_name, &uid); if (k < 0) { log_error("Failed to parse file name %s: %s", de->d_name, strerror(-k)); continue; } - u = hashmap_get(m->users, ULONG_TO_PTR(ul)); + u = hashmap_get(m->users, ULONG_TO_PTR(uid)); if (!u) { unlinkat(dirfd(d), de->d_name, 0); continue; @@ -1159,22 +1162,6 @@ int manager_run(Manager *m) { } static int manager_parse_config_file(Manager *m) { - - const ConfigItem items[] = { - { "NAutoVTs", config_parse_unsigned, 0, &m->n_autovts, "Login" }, - { "KillUserProcesses", config_parse_bool, 0, &m->kill_user_processes, "Login" }, - { "KillOnlyUsers", config_parse_strv, 0, &m->kill_only_users, "Login" }, - { "KillExcludeUsers", config_parse_strv, 0, &m->kill_exclude_users, "Login" }, - { "Controllers", config_parse_strv, 0, &m->controllers, "Login" }, - { "ResetControllers", config_parse_strv, 0, &m->reset_controllers, "Login" }, - { NULL, NULL, 0, NULL, NULL } - }; - - static const char * const sections[] = { - "Login", - NULL - }; - FILE *f; const char *fn; int r; @@ -1191,7 +1178,7 @@ static int manager_parse_config_file(Manager *m) { return -errno; } - r = config_parse(fn, f, sections, items, false, NULL); + r = config_parse(fn, f, "Login\0", config_item_perf_lookup, (void*) logind_gperf_lookup, false, m); if (r < 0) log_warning("Failed to parse configuration file: %s", strerror(-r)); @@ -1208,14 +1195,14 @@ int main(int argc, char *argv[]) { log_parse_environment(); log_open(); + umask(0022); + if (argc != 1) { log_error("This program takes no arguments."); r = -EINVAL; goto finish; } - umask(0022); - m = manager_new(); if (!m) { log_error("Out of memory");