diff options
-rw-r--r-- | src/cerberus.c | 19 | ||||
-rw-r--r-- | src/cerberus.h | 3 | ||||
-rw-r--r-- | src/login.c | 3 |
3 files changed, 25 insertions, 0 deletions
diff --git a/src/cerberus.c b/src/cerberus.c index 6f0ce91..01cbe08 100644 --- a/src/cerberus.c +++ b/src/cerberus.c @@ -44,6 +44,10 @@ int main(int argc, char** argv) do_login(argc, argv); + /* Ignore signals */ + signal(SIGQUIT, SIG_IGN); + signal(SIGINT, SIG_IGN); + /* Wait for the login shell to exit */ waitpid(child_pid, &_status, 0); @@ -220,6 +224,12 @@ void do_login(int argc, char** argv) set_environ(entry, preserve_env); + /* Stop signal handling */ + signal(SIGALRM, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTSTP, SIG_IGN); + + child_pid = fork(); /* vfork cannot be used as the child changes the user, the parent would not be able to chown the TTY */ @@ -227,10 +237,19 @@ void do_login(int argc, char** argv) if (child_pid == -1) { perror("fork"); + sleep(ERROR_SLEEP); _exit(1); } else if (child_pid == 0) { + /* In case the shell does not do this */ + setsid(); + + /* Set controlling terminal */ + if (ioctl(STDIN_FILENO, TIOCSCTTY, 1)) + perror("TIOCSCTTY"); + signal(SIGINT, SIG_DFL); + /* Partial login */ /* TODO set supplemental groups */ set_user(entry); diff --git a/src/cerberus.h b/src/cerberus.h index e195245..706925a 100644 --- a/src/cerberus.h +++ b/src/cerberus.h @@ -26,7 +26,10 @@ #include <signal.h> #include <pwd.h> #include <errno.h> +#include <stropts.h> +#include <termios.h> #include <sys/wait.h> +#include <sys/ioctl.h> #ifdef USE_TTY_GROUP #include <grp.h> #endif diff --git a/src/login.c b/src/login.c index 3ad1204..32f118f 100644 --- a/src/login.c +++ b/src/login.c @@ -193,5 +193,8 @@ void exec_shell(struct passwd* entry) *(child_argv + child_argc) = NULL; execvp(*child_argv, child_argv + 1); + perror("execvp"); + sleep(ERROR_SLEEP); + _exit(1); } |