X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftty-ask-password-agent.c;h=2c854fa8d986fc293f98cabecaac524755f3d80e;hp=bedb0bc319aafd9e0b01bdd747185ea447152578;hb=b74949bcdc65982a5eaca64c836f4d2a3b8a8d0c;hpb=c0f9c7da07fccafed646e0a15df9bc132e3fc7fb diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c index bedb0bc31..2c854fa8d 100644 --- a/src/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent.c @@ -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);