From d905c9da4d8984f19cd74a17cebd2743d399b035 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 30 Nov 2015 14:49:56 +0100 Subject: Reorganize source directory --- src/unitd/askconsole.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/unitd/askconsole.c (limited to 'src/unitd/askconsole.c') diff --git a/src/unitd/askconsole.c b/src/unitd/askconsole.c new file mode 100644 index 0000000..d7d4cb5 --- /dev/null +++ b/src/unitd/askconsole.c @@ -0,0 +1,63 @@ +/* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "unitd.h" + +#include +#include + +#include +#include + + +static void askconsole(struct uloop_process *proc) { + char *const ask[] = { + "/lib/unitd/askfirst", + "/bin/ash", + "--login", + NULL, + }; + + pid_t p; + + proc->pid = fork(); + if (!proc->pid) { + p = setsid(); + + fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) & ~O_NONBLOCK); + + ioctl(STDIN_FILENO, TIOCSCTTY, 1); + tcsetpgrp(STDIN_FILENO, p); + + execvp(ask[0], ask); + ERROR("Failed to execute %s\n", ask[0]); + exit(-1); + } + + if (proc->pid > 0) { + DEBUG(4, "Launched askconsole, pid=%d\n", + (int) proc->pid); + uloop_process_add(proc); + } +} + +static void child_exit(struct uloop_process *proc, int ret) +{ + DEBUG(4, "pid:%d\n", proc->pid); + askconsole(proc); +} + +void unitd_askconsole(void) { + struct uloop_process *proc = calloc(1, sizeof(*proc)); + proc->cb = child_exit; + askconsole(proc); +} -- cgit v1.2.3