diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-10-26 04:45:27 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-10-26 04:45:27 +0200 |
commit | 0ddf1d3aa5e96b752ad62be48f99d7850a3d8542 (patch) | |
tree | f1e9a169fe0b4173f8cd51cd1f492b0f507ef072 | |
parent | e0e1580aae5913870933518f3cb7055730ce3a49 (diff) |
ask-password: properly handle multiple pending passwords when writing wall msg
-rw-r--r-- | src/tty-ask-password-agent.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c index 8a9330d4ac..5b429398c0 100644 --- a/src/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent.c @@ -200,7 +200,7 @@ finish: return r; } -static int parse_password(const char *filename) { +static int parse_password(const char *filename, char **wall) { char *socket_name = NULL, *message = NULL, *packet = NULL; uint64_t not_after = 0; unsigned pid = 0; @@ -248,11 +248,13 @@ static int parse_password(const char *filename) { if (arg_action == ACTION_LIST) printf("'%s' (PID %u)\n", message, pid); else if (arg_action == ACTION_WALL) { - char *wall; + char *_wall; - if (asprintf(&wall, - "Password entry required for \'%s\' (PID %u).\r\n" + if (asprintf(&_wall, + "%s%sPassword entry required for \'%s\' (PID %u).\r\n" "Please enter password with the systemd-tty-password-agent tool!", + *wall ? *wall : "", + *wall ? "\r\n\r\n" : "", message, pid) < 0) { log_error("Out of memory"); @@ -260,8 +262,8 @@ static int parse_password(const char *filename) { goto finish; } - r = utmp_wall(wall); - free(wall); + free(*wall); + *wall = _wall; } else { union { struct sockaddr sa; @@ -346,6 +348,7 @@ static int show_passwords(void) { while ((de = readdir(d))) { char *p; int q; + char *wall; if (de->d_type != DT_REG) continue; @@ -362,10 +365,16 @@ static int show_passwords(void) { goto finish; } - if ((q = parse_password(p)) < 0) + wall = NULL; + if ((q = parse_password(p, &wall)) < 0) r = q; free(p); + + if (wall) { + utmp_wall(wall); + free(wall); + } } finish: |