summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-11-16 04:28:04 +0100
committerLennart Poettering <lennart@poettering.net>2010-11-16 04:28:04 +0100
commit0cf84693877f060254f04cf38120f52c2aa3059c (patch)
tree29b6985cb82f1d39d098ab3e7a5e0cf49a1e0323
parent42e19823e649e7f29fab93d47f14738996c743f9 (diff)
downloadsystemd-0cf84693877f060254f04cf38120f52c2aa3059c.tar.gz
ask-password: add --console mode to ask questions on /dev/console
-rw-r--r--TODO2
-rw-r--r--src/tty-ask-password-agent.c43
2 files changed, 37 insertions, 8 deletions
diff --git a/TODO b/TODO
index 12cf78325c..0a9adc9e4e 100644
--- a/TODO
+++ b/TODO
@@ -75,6 +75,8 @@
* fix hotplug transactions
+* isolate multi-user.target doesn't start a getty@tty1 if we run it from graphical.target
+
External:
* patch kernel for xattr support in /dev, /proc/, /sys and /sys/fs/cgroup.
diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c
index d389c98a48..c3c5f7a8b6 100644
--- a/src/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent.c
@@ -46,6 +46,7 @@ static enum {
} arg_action = ACTION_QUERY;
static bool arg_plymouth = false;
+static bool arg_console = false;
static int ask_password_plymouth(const char *message, usec_t until, const char *flag_file, char **_passphrase) {
int fd = -1, notify = -1;
@@ -289,9 +290,23 @@ static int parse_password(const char *filename, char **wall) {
if (arg_plymouth)
r = ask_password_plymouth(message, not_after, filename, &password);
- else
+ else {
+ int tty_fd = -1;
+
+ if (arg_console)
+ if ((tty_fd = acquire_terminal("/dev/console", false, false, false)) < 0) {
+ r = tty_fd;
+ goto finish;
+ }
+
r = ask_password_tty(message, not_after, filename, &password);
+ if (arg_console) {
+ close_nointr_nofail(tty_fd);
+ release_terminal();
+ }
+ }
+
if (r < 0) {
log_error("Failed to query password: %s", strerror(-r));
goto finish;
@@ -336,7 +351,7 @@ finish:
return r;
}
-static int tty_block(void) {
+static int wall_tty_block(void) {
char *p;
const char *t;
int fd;
@@ -359,7 +374,7 @@ static int tty_block(void) {
return fd;
}
-static bool tty_match(const char *path) {
+static bool wall_tty_match(const char *path) {
int fd;
char *p;
@@ -425,7 +440,7 @@ static int show_passwords(void) {
free(p);
if (wall) {
- utmp_wall(wall, tty_match);
+ utmp_wall(wall, wall_tty_match);
free(wall);
}
}
@@ -449,7 +464,7 @@ static int watch_passwords(void) {
sigset_t mask;
int r;
- tty_block_fd = tty_block();
+ tty_block_fd = wall_tty_block();
mkdir_p("/dev/.systemd/ask-password", 0755);
@@ -481,7 +496,7 @@ static int watch_passwords(void) {
for (;;) {
if ((r = show_passwords()) < 0)
- goto finish;
+ log_error("Failed to show password: %s", strerror(-r));
if (poll(pollfd, _FD_MAX, -1) < 0) {
@@ -523,7 +538,8 @@ static int help(void) {
" --query Process pending password requests\n"
" --watch Continously process password requests\n"
" --wall Continously forward password requests to wall\n"
- " --plymouth Ask question with Plymouth instead of on TTY\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);
return 0;
@@ -536,7 +552,8 @@ static int parse_argv(int argc, char *argv[]) {
ARG_QUERY,
ARG_WATCH,
ARG_WALL,
- ARG_PLYMOUTH
+ ARG_PLYMOUTH,
+ ARG_CONSOLE
};
static const struct option options[] = {
@@ -546,6 +563,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "watch", no_argument, NULL, ARG_WATCH },
{ "wall", no_argument, NULL, ARG_WALL },
{ "plymouth", no_argument, NULL, ARG_PLYMOUTH },
+ { "console", no_argument, NULL, ARG_CONSOLE },
{ NULL, 0, NULL, 0 }
};
@@ -582,6 +600,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_plymouth = true;
break;
+ case ARG_CONSOLE:
+ arg_console = true;
+ break;
+
case '?':
return -EINVAL;
@@ -608,6 +630,11 @@ int main(int argc, char *argv[]) {
if ((r = parse_argv(argc, argv)) <= 0)
goto finish;
+ if (arg_console) {
+ setsid();
+ release_terminal();
+ }
+
if (arg_action == ACTION_WATCH ||
arg_action == ACTION_WALL)
r = watch_passwords();