X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftty-ask-password-agent.c;h=43d008fc7038278588116578eaf67051d5231094;hp=14b01486bd4636a942347df45c7df77880f5838e;hb=7210bfb3706f8cbb2b35403f916dace1824c516c;hpb=21bc923aa35d455cdef1607eb7022608c705c9f3 diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c index 14b01486b..43d008fc7 100644 --- a/src/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent.c @@ -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; } @@ -250,23 +250,22 @@ static int parse_password(const char *filename, char **wall) { int socket_fd = -1; bool accept_cached = false; - const ConfigItem items[] = { - { "Socket", config_parse_string, &socket_name, "Ask" }, - { "NotAfter", config_parse_uint64, ¬_after, "Ask" }, - { "Message", config_parse_string, &message, "Ask" }, - { "PID", config_parse_unsigned, &pid, "Ask" }, - { "AcceptCached", config_parse_bool, &accept_cached, "Ask" }, - { NULL, NULL, NULL, NULL } + const ConfigTableItem items[] = { + { "Ask", "Socket", config_parse_string, 0, &socket_name }, + { "Ask", "NotAfter", config_parse_uint64, 0, ¬_after }, + { "Ask", "Message", config_parse_string, 0, &message }, + { "Ask", "PID", config_parse_unsigned, 0, &pid }, + { "Ask", "AcceptCached", config_parse_bool, 0, &accept_cached }, + { NULL, NULL, NULL, 0, NULL } }; FILE *f; int r; - usec_t n; assert(filename); - if (!(f = fopen(filename, "re"))) { - + f = fopen(filename, "re"); + if (!f) { if (errno == ENOENT) return 0; @@ -274,19 +273,28 @@ static int parse_password(const char *filename, char **wall) { return -errno; } - if ((r = config_parse(filename, f, NULL, items, true, NULL)) < 0) { + r = config_parse(filename, f, NULL, config_item_table_lookup, (void*) items, true, NULL); + if (r < 0) { log_error("Failed to parse password file %s: %s", filename, strerror(-r)); goto finish; } - if (!socket_name || not_after <= 0) { + if (!socket_name) { log_error("Invalid password file %s", filename); r = -EBADMSG; goto finish; } - n = now(CLOCK_MONOTONIC); - if (n > not_after) { + if (not_after > 0) { + if (now(CLOCK_MONOTONIC) > not_after) { + r = 0; + goto finish; + } + } + + if (pid > 0 && + kill(pid, 0) < 0 && + errno == ESRCH) { r = 0; goto finish; } @@ -315,7 +323,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 +338,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; @@ -369,20 +377,27 @@ static int parse_password(const char *filename, char **wall) { release_terminal(); } - asprintf(&packet, "+%s", password); - free(password); + if (r >= 0) { + packet_length = 1+strlen(password)+1; + if (!(packet = new(char, packet_length))) + r = -ENOMEM; + else { + packet[0] = '+'; + strcpy(packet+1, password); + } - packet_length = strlen(packet); + free(password); + } } - if (r < 0) { - log_error("Failed to query password: %s", strerror(-r)); + if (r == -ETIME || r == -ENOENT) { + /* If the query went away, that's OK */ + r = 0; goto finish; } - if (!packet) { - log_error("Out of memory"); - r = -ENOMEM; + if (r < 0) { + log_error("Failed to query password: %s", strerror(-r)); goto finish; } @@ -421,10 +436,11 @@ static int wall_tty_block(void) { int fd, r; dev_t devnr; - if ((r = get_ctty_devnr(&devnr)) < 0) + r = get_ctty_devnr(0, &devnr); + if (r < 0) return -r; - if (asprintf(&p, "/dev/.systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0) + if (asprintf(&p, "/run/systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0) return -ENOMEM; mkdir_parents(p, 0700); @@ -468,7 +484,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, "/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 +503,7 @@ static int show_passwords(void) { struct dirent *de; int r = 0; - if (!(d = opendir("/dev/.systemd/ask-password"))) { + if (!(d = opendir("/run/systemd/ask-password"))) { if (errno == ENOENT) return 0; @@ -500,6 +516,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 +528,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("/run/systemd/ask-password/", de->d_name))) { log_error("Out of memory"); r = -ENOMEM; goto finish; @@ -548,14 +567,14 @@ static int watch_passwords(void) { tty_block_fd = wall_tty_block(); - mkdir_p("/dev/.systemd/ask-password", 0755); + mkdir_p("/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, "/run/systemd/ask-password", IN_CLOSE_WRITE|IN_MOVED_TO) < 0) { r = -errno; goto finish; } @@ -618,8 +637,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); @@ -709,6 +728,8 @@ int main(int argc, char *argv[]) { log_parse_environment(); log_open(); + umask(0022); + if ((r = parse_argv(argc, argv)) <= 0) goto finish;