[systemd-commits] 6 commits - src/cryptsetup-generator.c src/manager.c src/shutdownd.c src/systemctl.c src/tty-ask-password-agent.c src/utmp-wtmp.c src/utmp-wtmp.h TODO

Lennart Poettering lennart at kemper.freedesktop.org
Thu Nov 11 18:33:17 PST 2010


 TODO                         |    2 +
 src/cryptsetup-generator.c   |   30 ++++++++++++++++----
 src/manager.c                |    1 
 src/shutdownd.c              |    4 +-
 src/systemctl.c              |    4 +-
 src/tty-ask-password-agent.c |   64 ++++++++++++++++++++++++++++++++++++++++---
 src/utmp-wtmp.c              |    7 ++--
 src/utmp-wtmp.h              |    2 -
 8 files changed, 96 insertions(+), 18 deletions(-)

New commits:
commit 7af53310dd9154ba76be7808292d9a046b849e43
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 12 03:33:08 2010 +0100

    ask-password: don't show wall message on ttys we are already running a tty agent on

diff --git a/src/shutdownd.c b/src/shutdownd.c
index bf69fb5..143fa8d 100644
--- a/src/shutdownd.c
+++ b/src/shutdownd.c
@@ -108,7 +108,7 @@ static void warn_wall(usec_t n, struct shutdownd_command *c) {
                 return;
 
         if (c->wall_message[0])
-                utmp_wall(c->wall_message);
+                utmp_wall(c->wall_message, NULL);
         else {
                 char date[FORMAT_TIMESTAMP_MAX];
                 const char* prefix;
@@ -126,7 +126,7 @@ static void warn_wall(usec_t n, struct shutdownd_command *c) {
                 if (asprintf(&l, "%s%s!", prefix, format_timestamp(date, sizeof(date), c->elapse)) < 0)
                         log_error("Failed to allocate wall message");
                 else {
-                        utmp_wall(l);
+                        utmp_wall(l, NULL);
                         free(l);
                 }
         }
diff --git a/src/systemctl.c b/src/systemctl.c
index 4f4b6dd..372b3d0 100644
--- a/src/systemctl.c
+++ b/src/systemctl.c
@@ -258,7 +258,7 @@ static void warn_wall(enum action action) {
                 }
 
                 if (*p) {
-                        utmp_wall(p);
+                        utmp_wall(p, NULL);
                         free(p);
                         return;
                 }
@@ -269,7 +269,7 @@ static void warn_wall(enum action action) {
         if (!table[action])
                 return;
 
-        utmp_wall(table[action]);
+        utmp_wall(table[action], NULL);
 }
 
 struct unit_info {
diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c
index 2e8a92f..1d17e22 100644
--- a/src/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent.c
@@ -30,6 +30,7 @@
 #include <unistd.h>
 #include <getopt.h>
 #include <sys/signalfd.h>
+#include <fcntl.h>
 
 #include "util.h"
 #include "conf-parser.h"
@@ -335,6 +336,55 @@ finish:
         return r;
 }
 
+static int tty_block(void) {
+        char *p;
+        const char *t;
+        int fd;
+
+        if (!(t = ttyname(STDIN_FILENO)))
+                return -errno;
+
+        if (asprintf(&p, "/dev/.systemd/ask-password-block/%s", file_name_from_path(t)) < 0)
+                return -ENOMEM;
+
+        mkdir_parents(p, 0700);
+        mkfifo(p, 0600);
+
+        fd = open(p, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
+        free(p);
+
+        if (fd < 0)
+                return -errno;
+
+        return fd;
+}
+
+static bool tty_match(const char *path) {
+        int fd;
+        char *p;
+
+        /* We use named pipes to ensure that wall messages suggesting
+         * password entry are not printed over password prompts
+         * already shown. We use the fact here that opening a pipe in
+         * non-blocking mode for write-only will succeed only if
+         * there's some writer behind it. Using pipes has the
+         * advantage that the block will automatically go away if the
+         * process dies. */
+
+        if (asprintf(&p, "/dev/.systemd/ask-password-block/%s", file_name_from_path(path)) < 0)
+                return true;
+
+        fd = open(p, O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
+        free(p);
+
+        if (fd < 0)
+                return true;
+
+        /* What, we managed to open the pipe? Then this tty is filtered. */
+        close_nointr_nofail(fd);
+        return false;
+}
+
 static int show_passwords(void) {
         DIR *d;
         struct dirent *de;
@@ -375,7 +425,7 @@ static int show_passwords(void) {
                 free(p);
 
                 if (wall) {
-                        utmp_wall(wall);
+                        utmp_wall(wall, tty_match);
                         free(wall);
                 }
         }
@@ -394,11 +444,13 @@ static int watch_passwords(void) {
                 _FD_MAX
         };
 
-        int notify = -1, signal_fd = -1;
+        int notify = -1, signal_fd = -1, tty_block_fd = -1;
         struct pollfd pollfd[_FD_MAX];
         sigset_t mask;
         int r;
 
+        tty_block_fd = tty_block();
+
         mkdir_p("/dev/.systemd/ask-password", 0755);
 
         if ((notify = inotify_init1(IN_CLOEXEC)) < 0) {
@@ -456,6 +508,9 @@ finish:
         if (signal_fd >= 0)
                 close_nointr_nofail(signal_fd);
 
+        if (tty_block_fd >= 0)
+                close_nointr_nofail(tty_block_fd);
+
         return r;
 }
 
diff --git a/src/utmp-wtmp.c b/src/utmp-wtmp.c
index 4158930..83da640 100644
--- a/src/utmp-wtmp.c
+++ b/src/utmp-wtmp.c
@@ -358,7 +358,7 @@ finish:
         return r;
 }
 
-int utmp_wall(const char *message) {
+int utmp_wall(const char *message, bool (*match_tty)(const char *tty)) {
         struct utmpx *u;
         char date[FORMAT_TIMESTAMP_MAX];
         char *text = NULL, *hn = NULL, *un = NULL, *tty = NULL;
@@ -407,8 +407,9 @@ int utmp_wall(const char *message) {
                         path = buf;
                 }
 
-                if ((q = write_to_terminal(path, text)) < 0)
-                        r = q;
+                if (!match_tty || match_tty(path))
+                        if ((q = write_to_terminal(path, text)) < 0)
+                                r = q;
 
                 free(buf);
         }
diff --git a/src/utmp-wtmp.h b/src/utmp-wtmp.h
index 86bc6bd..4054aff 100644
--- a/src/utmp-wtmp.h
+++ b/src/utmp-wtmp.h
@@ -33,6 +33,6 @@ int utmp_put_runlevel(usec_t timestamp, int runlevel, int previous);
 int utmp_put_dead_process(const char *id, pid_t pid, int code, int status);
 int utmp_put_init_process(usec_t timestamp, const char *id, pid_t pid, pid_t sid, const char *line);
 
-int utmp_wall(const char *message);
+int utmp_wall(const char *message, bool (*match_tty)(const char *tty));
 
 #endif

commit 9d3e691e709eb12ce48a3dec6e50537406d12ad2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 12 03:05:20 2010 +0100

    ask-password: refer to right binary name in wall message

diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c
index 8b02b26..2e8a92f 100644
--- a/src/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent.c
@@ -255,7 +255,7 @@ static int parse_password(const char *filename, char **wall) {
 
                 if (asprintf(&_wall,
                              "%s%sPassword entry required for \'%s\' (PID %u).\r\n"
-                             "Please enter password with the systemd-tty-password-agent tool!",
+                             "Please enter password with the systemd-tty-ask-password-agent tool!",
                              *wall ? *wall : "",
                              *wall ? "\r\n\r\n" : "",
                              message,

commit 656ce8f77a840b7615180de4d63c4fc29b40cc47
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 12 03:05:03 2010 +0100

    ask-password: ignore unknown query file fields

diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c
index 8a6e3d3..8b02b26 100644
--- a/src/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent.c
@@ -231,7 +231,7 @@ static int parse_password(const char *filename, char **wall) {
                 return -errno;
         }
 
-        if ((r = config_parse(filename, f, NULL, items, false, NULL)) < 0) {
+        if ((r = config_parse(filename, f, NULL, items, true, NULL)) < 0) {
                 log_error("Failed to parse password file %s: %s", filename, strerror(-r));
                 goto finish;
         }

commit 53d3afa8ca2811093c482b0e14addd1aaa92fb67
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 12 03:04:47 2010 +0100

    ask-password: properly NULL terminate table

diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c
index e995622..8a6e3d3 100644
--- a/src/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent.c
@@ -213,6 +213,7 @@ static int parse_password(const char *filename, char **wall) {
                 { "NotAfter", config_parse_uint64,   &not_after,   "Ask" },
                 { "Message",  config_parse_string,   &message,     "Ask" },
                 { "PID",      config_parse_unsigned, &pid,         "Ask" },
+                { NULL, NULL, NULL, NULL }
         };
 
         FILE *f;

commit c5fd1e57e4ae44be039dbfd7ab7f6eed9ca600c5
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 12 03:04:29 2010 +0100

    manager: be a bit more verbose if we receive unknown epoll event

diff --git a/src/manager.c b/src/manager.c
index 9640fca..b1eac57 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -2205,6 +2205,7 @@ static int process_event(Manager *m, struct epoll_event *ev) {
                 break;
 
         default:
+                log_error("event type=%i", w->type);
                 assert_not_reached("Unknown epoll event type.");
         }
 

commit 74715b82cb6a09e10ba3fbd2146cd3285f5e6544
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 12 03:04:10 2010 +0100

    cryptsetup: automatically start cryptsetup when looking for mount source

diff --git a/TODO b/TODO
index 1390471..119de40 100644
--- a/TODO
+++ b/TODO
@@ -84,6 +84,8 @@
 
 * fsck-root.service/start gets queued twice
 
+* tmpfiles: allow specification of .conf files on cmdline
+
 External:
 
 * patch kernel for xattr support in /dev, /proc/, /sys and /sys/fs/cgroup.
diff --git a/src/cryptsetup-generator.c b/src/cryptsetup-generator.c
index 73c3679..d1d7bb6 100644
--- a/src/cryptsetup-generator.c
+++ b/src/cryptsetup-generator.c
@@ -59,7 +59,7 @@ static int create_disk(
                 const char *password,
                 const char *options) {
 
-        char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL;
+        char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL, *e = NULL;
         int r;
         FILE *f = NULL;
 
@@ -139,6 +139,11 @@ static int create_disk(
                 goto fail;
         }
 
+        if (asprintf(&from, "../%s", n) < 0) {
+                r = -ENOMEM;
+                goto fail;
+        }
+
         if (!options || !has_option(options, "noauto")) {
 
                 if (asprintf(&to, "%s/%s.wants/%s", arg_dest, d, n) < 0) {
@@ -146,11 +151,6 @@ static int create_disk(
                         goto fail;
                 }
 
-                if (asprintf(&from, "../%s", n) < 0) {
-                        r = -ENOMEM;
-                        goto fail;
-                }
-
                 mkdir_parents(to, 0755);
 
                 if (symlink(from, to) < 0) {
@@ -160,12 +160,30 @@ static int create_disk(
                 }
         }
 
+        free(to);
+        to = NULL;
+
+        e = unit_name_escape(name);
+        if (asprintf(&to, "%s/dev-mapper-%s.device.wants/%s", arg_dest, e, n) < 0) {
+                r = -ENOMEM;
+                goto fail;
+        }
+
+        mkdir_parents(to, 0755);
+
+        if (symlink(from, to) < 0) {
+                log_error("Failed to create symlink '%s' to '%s': %m", from, to);
+                r = -errno;
+                goto fail;
+        }
+
         r = 0;
 
 fail:
         free(p);
         free(n);
         free(d);
+        free(e);
 
         free(from);
         free(to);



More information about the systemd-commits mailing list