X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=loginutils%2Fvlock.c;h=5ba6a8780d610046148b47e6eb5fe37e4730091a;hb=5b2cc0aaee6985431d9bab1b49ceea7e1fa1d7af;hp=85f489c2286d1b5574e5a339139be1941c7fb391;hpb=0c68a874e7d996c62c8d00b0c0289180bdce1590;p=oweals%2Fbusybox.git diff --git a/loginutils/vlock.c b/loginutils/vlock.c index 85f489c22..5ba6a8780 100644 --- a/loginutils/vlock.c +++ b/loginutils/vlock.c @@ -5,7 +5,7 @@ * Copyright (C) 2000 by spoon * Written by spoon * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ /* Shoutz to Michael K. Johnson , author of the @@ -13,11 +13,33 @@ * minimalistic vlock. */ /* Fixed by Erik Andersen to do passwords the tinylogin way... - * It now works with md5, sha1, etc passwords. */ + * It now works with md5, sha1, etc passwords. + */ +//config:config VLOCK +//config: bool "vlock" +//config: default y +//config: help +//config: Build the "vlock" applet which allows you to lock (virtual) terminals. +//config: +//config: Note that Busybox binary must be setuid root for this applet to +//config: work properly. + +//applet:/* Needs to be run by root or be suid root - needs to change uid and gid: */ +//applet:IF_VLOCK(APPLET(vlock, BB_DIR_USR_BIN, BB_SUID_REQUIRE)) + +//kbuild:lib-$(CONFIG_VLOCK) += vlock.o + +//usage:#define vlock_trivial_usage +//usage: "[-a]" +//usage:#define vlock_full_usage "\n\n" +//usage: "Lock a virtual terminal. A password is required to unlock.\n" +//usage: "\n -a Lock all VTs" -#include #include "libbb.h" +#ifdef __linux__ +#include + static void release_vt(int signo UNUSED_PARAM) { /* If -a, param is 0, which means: @@ -30,14 +52,17 @@ static void acquire_vt(int signo UNUSED_PARAM) /* ACK to kernel that switch to console is successful */ ioctl(STDIN_FILENO, VT_RELDISP, VT_ACKACQ); } +#endif int vlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int vlock_main(int argc UNUSED_PARAM, char **argv) { +#ifdef __linux__ struct vt_mode vtm; + struct vt_mode ovtm; +#endif struct termios term; struct termios oterm; - struct vt_mode ovtm; struct passwd *pw; pw = xgetpwuid(getuid()); @@ -55,6 +80,7 @@ int vlock_main(int argc UNUSED_PARAM, char **argv) + (1 << SIGINT ) , SIG_IGN); +#ifdef __linux__ /* We will use SIGUSRx for console switch control: */ /* 1: set handlers */ signal_SA_RESTART_empty_mask(SIGUSR1, release_vt); @@ -62,12 +88,14 @@ int vlock_main(int argc UNUSED_PARAM, char **argv) /* 2: unmask them */ sig_unblock(SIGUSR1); sig_unblock(SIGUSR2); +#endif /* Revert stdin/out to our controlling tty * (or die if we have none) */ xmove_fd(xopen(CURRENT_TTY, O_RDWR), STDIN_FILENO); xdup2(STDIN_FILENO, STDOUT_FILENO); +#ifdef __linux__ xioctl(STDIN_FILENO, VT_GETMODE, &vtm); ovtm = vtm; /* "console switches are controlled by us, not kernel!" */ @@ -75,27 +103,31 @@ int vlock_main(int argc UNUSED_PARAM, char **argv) vtm.relsig = SIGUSR1; vtm.acqsig = SIGUSR2; ioctl(STDIN_FILENO, VT_SETMODE, &vtm); +#endif +//TODO: use set_termios_to_raw() tcgetattr(STDIN_FILENO, &oterm); term = oterm; - term.c_iflag &= ~BRKINT; - term.c_iflag |= IGNBRK; - term.c_lflag &= ~ISIG; - term.c_lflag &= ~(ECHO | ECHOCTL); + term.c_iflag |= IGNBRK; /* ignore serial break (why? VTs don't have breaks, right?) */ + term.c_iflag &= ~BRKINT; /* redundant? "dont translate break to SIGINT" */ + term.c_lflag &= ~(ISIG | ECHO | ECHOCTL); /* ignore ^C ^Z, echo off */ tcsetattr_stdin_TCSANOW(&term); - do { + while (1) { printf("Virtual console%s locked by %s.\n", - option_mask32 /*o_lock_all*/ ? "s" : "", - pw->pw_name); - if (correct_password(pw)) { + /* "s" if -a, else "": */ "s" + !option_mask32, + pw->pw_name + ); + if (ask_and_check_password(pw) > 0) { break; } - bb_do_delay(FAIL_DELAY); - puts("Password incorrect"); - } while (1); + bb_do_delay(LOGIN_FAIL_DELAY); + puts("Incorrect password"); + } +#ifdef __linux__ ioctl(STDIN_FILENO, VT_SETMODE, &ovtm); +#endif tcsetattr_stdin_TCSANOW(&oterm); fflush_stdout_and_exit(EXIT_SUCCESS); }