chiark / gitweb /
logind: hook up PAM module with logind
[elogind.git] / src / logind-user.c
index 206064f1039224339330627be7f7128bab6c6edf..8ebd6eca235b1a3e7803006872ed13b50d46294d 100644 (file)
@@ -45,7 +45,7 @@ User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name) {
                 return NULL;
         }
 
-        if (asprintf(&u->state_file, "/run/systemd/user/%lu", (unsigned long) uid) < 0) {
+        if (asprintf(&u->state_file, "/run/systemd/users/%lu", (unsigned long) uid) < 0) {
                 free(u->name);
                 free(u);
                 return NULL;
@@ -94,7 +94,7 @@ int user_save(User *u) {
         assert(u);
         assert(u->state_file);
 
-        r = safe_mkdir("/run/systemd/user", 0755, 0, 0);
+        r = safe_mkdir("/run/systemd/users", 0755, 0, 0);
         if (r < 0)
                 goto finish;
 
@@ -152,7 +152,7 @@ finish:
 int user_load(User *u) {
         int r;
         char *display = NULL;
-        Session *s;
+        Session *s = NULL;
 
         assert(u);
 
@@ -172,8 +172,10 @@ int user_load(User *u) {
                 return r;
         }
 
-        s = hashmap_get(u->manager->sessions, display);
-        free(display);
+        if (display) {
+                s = hashmap_get(u->manager->sessions, display);
+                free(display);
+        }
 
         if (s && s->display && x11_display_is_local(s->display))
                 u->display = s;
@@ -260,6 +262,9 @@ int user_start(User *u) {
 
         assert(u);
 
+        if (u->started)
+                return 0;
+
         /* Make XDG_RUNTIME_DIR */
         r = user_mkdir_runtime_path(u);
         if (r < 0)
@@ -280,6 +285,10 @@ int user_start(User *u) {
 
         dual_timestamp_get(&u->timestamp);
 
+        u->started = true;
+
+        user_send_signal(u, true);
+
         return 0;
 }
 
@@ -359,12 +368,17 @@ int user_stop(User *u) {
         int r = 0, k;
         assert(u);
 
+        if (!u->started)
+                return 0;
+
         LIST_FOREACH(sessions_by_user, s, u->sessions) {
                 k = session_stop(s);
                 if (k < 0)
                         r = k;
         }
 
+        user_send_signal(u, false);
+
         /* Kill systemd */
         k = user_stop_service(u);
         if (k < 0)
@@ -383,6 +397,8 @@ int user_stop(User *u) {
         unlink(u->state_file);
         user_add_to_gc_queue(u);
 
+        u->started = false;
+
         return r;
 }