summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-10-26 04:45:27 +0200
committerLennart Poettering <lennart@poettering.net>2010-10-26 04:45:27 +0200
commit0ddf1d3aa5e96b752ad62be48f99d7850a3d8542 (patch)
treef1e9a169fe0b4173f8cd51cd1f492b0f507ef072
parente0e1580aae5913870933518f3cb7055730ce3a49 (diff)
ask-password: properly handle multiple pending passwords when writing wall msg
-rw-r--r--src/tty-ask-password-agent.c23
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: