}
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) {
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;
Seat *seat;
sn = udev_device_get_property_value(d, "ID_SEAT");
- if (!sn)
+ if (isempty(sn))
sn = "seat0";
if (!seat_name_is_valid(sn)) {
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;
return r;
}
-
static int manager_enumerate_linger_users(Manager *m) {
DIR *d;
struct dirent *de;
}
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;
while ((k = cg_read_subgroup(d, &name)) > 0) {
Session *session;
+ if (streq(name, "shared"))
+ continue;
+
k = manager_add_session(m, u, name, &session);
if (k < 0) {
free(name);
return 0;
}
-void manager_gc(Manager *m) {
+void manager_gc(Manager *m, bool drop_not_started) {
Seat *seat;
Session *session;
User *user;
LIST_REMOVE(Seat, gc_queue, m->seat_gc_queue, seat);
seat->in_gc_queue = false;
- if (seat_check_gc(seat) == 0) {
+ if (seat_check_gc(seat, drop_not_started) == 0) {
seat_stop(seat);
seat_free(seat);
}
LIST_REMOVE(Session, gc_queue, m->session_gc_queue, session);
session->in_gc_queue = false;
- if (session_check_gc(session) == 0) {
+ if (session_check_gc(session, drop_not_started) == 0) {
session_stop(session);
session_free(session);
}
LIST_REMOVE(User, gc_queue, m->user_gc_queue, user);
user->in_gc_queue = false;
- if (user_check_gc(user) == 0) {
+ if (user_check_gc(user, drop_not_started) == 0) {
user_stop(user);
user_free(user);
}
manager_enumerate_users(m);
manager_enumerate_sessions(m);
+ /* Remove stale objects before we start them */
+ manager_gc(m, false);
+
/* And start everything */
HASHMAP_FOREACH(seat, m->seats, i)
seat_start(seat);
struct epoll_event event;
int n;
- manager_gc(m);
+ manager_gc(m, true);
if (dbus_connection_dispatch(m->bus) != DBUS_DISPATCH_COMPLETE)
continue;
- manager_gc(m);
+ manager_gc(m, true);
n = epoll_wait(m->epoll_fd, &event, 1, -1);
if (n < 0) {
}
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;
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));
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");