[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, ¬_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