chiark / gitweb /
chkconfig: check against runlevel 5 instead of 3, since it is a superset of the latter
[elogind.git] / src / tty-ask-password-agent.c
index 14b01486bd4636a942347df45c7df77880f5838e..2c854fa8d986fc293f98cabecaac524755f3d80e 100644 (file)
@@ -92,7 +92,7 @@ static int ask_password_plymouth(
         sa.sa.sa_family = AF_UNIX;
         strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
         if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
-                log_error("FAILED TO CONNECT: %m");
+                log_error("Failed to connect to Plymouth: %m");
                 r = -errno;
                 goto finish;
         }
@@ -128,7 +128,7 @@ static int ask_password_plymouth(
                         y = now(CLOCK_MONOTONIC);
 
                         if (y > until) {
-                                r = -ETIMEDOUT;
+                                r = -ETIME;
                                 goto finish;
                         }
 
@@ -149,7 +149,7 @@ static int ask_password_plymouth(
                         r = -errno;
                         goto finish;
                 } else if (j == 0) {
-                        r = -ETIMEDOUT;
+                        r = -ETIME;
                         goto finish;
                 }
 
@@ -315,7 +315,7 @@ static int parse_password(const char *filename, char **wall) {
                         struct sockaddr sa;
                         struct sockaddr_un un;
                 } sa;
-                size_t packet_length;
+                size_t packet_length = 0;
 
                 assert(arg_action == ACTION_QUERY ||
                        arg_action == ACTION_WATCH);
@@ -330,7 +330,7 @@ static int parse_password(const char *filename, char **wall) {
                 }
 
                 if (arg_plymouth) {
-                        char **passwords;
+                        char **passwords = NULL;
 
                         if ((r = ask_password_plymouth(message, not_after, filename, accept_cached, &passwords)) >= 0) {
                                 char **p;
@@ -375,7 +375,14 @@ static int parse_password(const char *filename, char **wall) {
                         packet_length = strlen(packet);
                 }
 
+                if (r == -ETIME || r == -ENOENT) {
+                        /* If the query went away, that's OK */
+                        r = 0;
+                        goto finish;
+                }
+
                 if (r < 0) {
+
                         log_error("Failed to query password: %s", strerror(-r));
                         goto finish;
                 }
@@ -424,7 +431,7 @@ static int wall_tty_block(void) {
         if ((r = get_ctty_devnr(&devnr)) < 0)
                 return -r;
 
-        if (asprintf(&p, "/dev/.systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0)
+        if (asprintf(&p, "/dev/.run/systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0)
                 return -ENOMEM;
 
         mkdir_parents(p, 0700);
@@ -468,7 +475,7 @@ static bool wall_tty_match(const char *path) {
          * advantage that the block will automatically go away if the
          * process dies. */
 
-        if (asprintf(&p, "/dev/.systemd/ask-password-block/%u:%u", major(st.st_rdev), minor(st.st_rdev)) < 0)
+        if (asprintf(&p, "/dev/.run/systemd/ask-password-block/%u:%u", major(st.st_rdev), minor(st.st_rdev)) < 0)
                 return true;
 
         fd = open(p, O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
@@ -487,7 +494,7 @@ static int show_passwords(void) {
         struct dirent *de;
         int r = 0;
 
-        if (!(d = opendir("/dev/.systemd/ask-password"))) {
+        if (!(d = opendir("/dev/.run/systemd/ask-password"))) {
                 if (errno == ENOENT)
                         return 0;
 
@@ -500,6 +507,9 @@ static int show_passwords(void) {
                 int q;
                 char *wall;
 
+                /* We only support /dev on tmpfs, hence we can rely on
+                 * d_type to be reliable */
+
                 if (de->d_type != DT_REG)
                         continue;
 
@@ -509,7 +519,7 @@ static int show_passwords(void) {
                 if (!startswith(de->d_name, "ask."))
                         continue;
 
-                if (!(p = strappend("/dev/.systemd/ask-password/", de->d_name))) {
+                if (!(p = strappend("/dev/.run/systemd/ask-password/", de->d_name))) {
                         log_error("Out of memory");
                         r = -ENOMEM;
                         goto finish;
@@ -548,14 +558,14 @@ static int watch_passwords(void) {
 
         tty_block_fd = wall_tty_block();
 
-        mkdir_p("/dev/.systemd/ask-password", 0755);
+        mkdir_p("/dev/.run/systemd/ask-password", 0755);
 
         if ((notify = inotify_init1(IN_CLOEXEC)) < 0) {
                 r = -errno;
                 goto finish;
         }
 
-        if (inotify_add_watch(notify, "/dev/.systemd/ask-password", IN_CLOSE_WRITE|IN_MOVED_TO) < 0) {
+        if (inotify_add_watch(notify, "/dev/.run/systemd/ask-password", IN_CLOSE_WRITE|IN_MOVED_TO) < 0) {
                 r = -errno;
                 goto finish;
         }
@@ -618,8 +628,8 @@ static int help(void) {
                "  -h --help     Show this help\n"
                "     --list     Show pending password requests\n"
                "     --query    Process pending password requests\n"
-               "     --watch    Continously process password requests\n"
-               "     --wall     Continously forward password requests to wall\n"
+               "     --watch    Continuously process password requests\n"
+               "     --wall     Continuously forward password requests to wall\n"
                "     --plymouth Ask question with Plymouth instead of on TTY\n"
                "     --console  Ask question on /dev/console instead of current TTY\n",
                program_invocation_short_name);