X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=loginutils%2Fvlock.c;h=b4426ad41a607be9fe23d676f0a026c8370d339c;hb=d25a2645f5273e70616abe73e6ac1adda5016532;hp=a26999f895f648aefb6de39ada645b71efec8616;hpb=27f64e1f4eb4354844f6553e37501deffde8373e;p=oweals%2Fbusybox.git diff --git a/loginutils/vlock.c b/loginutils/vlock.c index a26999f89..b4426ad41 100644 --- a/loginutils/vlock.c +++ b/loginutils/vlock.c @@ -1,24 +1,12 @@ /* vi: set sw=4 ts=4: */ + /* * vlock implementation for busybox * * Copyright (C) 2000 by spoon * Written by spoon * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ /* Shoutz to Michael K. Johnson , author of the @@ -28,42 +16,14 @@ /* Fixed by Erik Andersen to do passwords the tinylogin way... * It now works with md5, sha1, etc passwords. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "busybox.h" +#include static struct passwd *pw; -static struct spwd *spw; static struct vt_mode ovtm; static struct termios oterm; static int vfd; -static int o_lock_all = 0; - -/* getspuid - get a shadow entry by uid */ -struct spwd *getspuid(uid_t uid) -{ - struct spwd *sp; - struct passwd *mypw; - - if ((mypw = getpwuid(getuid())) == NULL) { - return (NULL); - } - setspent(); - while ((sp = getspent()) != NULL) { - if (strcmp(mypw->pw_name, sp->sp_namp) == 0) - break; - } - endspent(); - return (sp); -} +static unsigned long o_lock_all; static void release_vt(int signo) { @@ -84,57 +44,28 @@ static void restore_terminal(void) tcsetattr(STDIN_FILENO, TCSANOW, &oterm); } -extern int vlock_main(int argc, char **argv) +int vlock_main(int argc, char **argv) { sigset_t sig; struct sigaction sa; struct vt_mode vtm; - int times = 0; struct termios term; if (argc > 2) { - show_usage(); + bb_show_usage(); } - if (argc == 2) { - if (strncmp(argv[1], "-a", 2)) { - show_usage(); - } else { - o_lock_all = 1; - } - } - - if ((pw = getpwuid(getuid())) == NULL) { - error_msg_and_die("no password for uid %d\n", getuid()); - } -#ifdef CONFIG_FEATURE_SHADOWPASSWDS - if ((strcmp(pw->pw_passwd, "x") == 0) - || (strcmp(pw->pw_passwd, "*") == 0)) { + o_lock_all = bb_getopt_ulflags (argc, argv, "a"); - if ((spw = getspuid(getuid())) == NULL) { - error_msg_and_die("could not read shadow password for uid %d: %s\n", - getuid(), strerror(errno)); - } - if (spw->sp_pwdp) { - pw->pw_passwd = spw->sp_pwdp; - } - } -#endif /* CONFIG_FEATURE_SHADOWPASSWDS */ - if (pw->pw_passwd[0] == '!' || pw->pw_passwd[0] == '*') { - error_msg_and_die("Account disabled for uid %d\n", getuid()); + if((pw = getpwuid(getuid())) == NULL) { + bb_error_msg_and_die("Unknown uid %d", getuid()); } - /* we no longer need root privs */ - setuid(getuid()); - setgid(getgid()); - - if ((vfd = open("/dev/tty", O_RDWR)) < 0) { - error_msg_and_die("/dev/tty"); - }; + vfd = xopen(CURRENT_TTY, O_RDWR); if (ioctl(vfd, VT_GETMODE, &vtm) < 0) { - error_msg_and_die("/dev/tty"); - }; + bb_perror_msg_and_die("VT_GETMODE"); + } /* mask a bunch of signals */ sigprocmask(SIG_SETMASK, NULL, &sig); @@ -177,53 +108,14 @@ extern int vlock_main(int argc, char **argv) tcsetattr(STDIN_FILENO, TCSANOW, &term); do { - char *pass, *crypt_pass; - char prompt[100]; - - if (o_lock_all) { - printf("All Virtual Consoles locked.\n"); - } else { - printf("This Virtual Console locked.\n"); - } + printf("Virtual Console%s locked.\n%s's ", (o_lock_all) ? "s" : "", pw->pw_name); fflush(stdout); - - snprintf(prompt, 100, "%s's password: ", pw->pw_name); - - if ((pass = getpass(prompt)) == NULL) { - perror("getpass"); - restore_terminal(); - exit(1); - } - - crypt_pass = pw_encrypt(pass, pw->pw_passwd); - if (strncmp(crypt_pass, pw->pw_passwd, sizeof(crypt_pass)) == 0) { - memset(pass, 0, strlen(pass)); - memset(crypt_pass, 0, strlen(crypt_pass)); - restore_terminal(); - return 0; - } - memset(pass, 0, strlen(pass)); - memset(crypt_pass, 0, strlen(crypt_pass)); - - if (isatty(STDIN_FILENO) == 0) { - perror("isatty"); - restore_terminal(); - exit(1); - } - - sleep(++times); - printf("Password incorrect.\n"); - if (times >= 3) { - sleep(15); - times = 2; + if (correct_password (pw)) { + break; } + bb_do_delay(FAIL_DELAY); + puts("Password incorrect."); } while (1); + restore_terminal(); + return 0; } - -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/