From: Werner Fink Date: Fri, 7 Dec 2012 08:00:56 +0000 (+0100) Subject: sulogin: use alarm function to indicate if a timeout occurs X-Git-Tag: v2.23-rc1~418 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=729bfb80ffc308b685006de496df06551c627057;p=thirdparty%2Futil-linux.git sulogin: use alarm function to indicate if a timeout occurs A small change to use the alarm handler to indicate if a timeout occurs. Signed-off-by: Werner Fink --- diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c index db783a2a00..9fdbb69c75 100644 --- a/login-utils/sulogin.c +++ b/login-utils/sulogin.c @@ -8,6 +8,7 @@ * * Copyright (C) 1998-2003 Miquel van Smoorenburg. * Copyright (C) 2012 Karel Zak + * Copyright (C) 2012 Werner Fink * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -60,12 +61,15 @@ struct sigaction saved_sigint; struct sigaction saved_sigtstp; struct sigaction saved_sigquit; +static volatile sig_atomic_t alarm_rised; + /* * Called at timeout. */ static void alrm_handler(int sig __attribute__((unused))) { - return; + /* Timeout expired */ + alarm_rised++; } static void mask_signal(int signal, void (*handler)(int), @@ -594,17 +598,27 @@ int main(int argc, char **argv) * Ask for the password. */ while (pwd) { + int failed = 0; if ((p = getpasswd(pwd->pw_passwd)) == NULL) break; if (pwd->pw_passwd[0] == 0 || - strcmp(crypt(p, pwd->pw_passwd), pwd->pw_passwd) == 0) + strcmp(crypt(p, pwd->pw_passwd), pwd->pw_passwd) == 0) { sushell(pwd); + failed++; + } mask_signal(SIGQUIT, SIG_IGN, &saved_sigquit); mask_signal(SIGTSTP, SIG_IGN, &saved_sigtstp); mask_signal(SIGINT, SIG_IGN, &saved_sigint); - fprintf(stderr, _("Login incorrect\n\n")); + if (failed) { + fprintf(stderr, _("Can not execute su shell\n\n")); + break; + } else + fprintf(stderr, _("Login incorrect\n\n")); } + if (alarm_rised) + fprintf(stderr, _("Timed out\n\n")); + /* * User pressed Control-D. */