Contents of /trunk/mkinitrd-magellan/busybox/loginutils/sulogin.c
Parent Directory | Revision Log
Revision 532 -
(show annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 2273 byte(s)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 2273 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * Mini sulogin implementation for busybox |
4 | * |
5 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
6 | */ |
7 | |
8 | #include <syslog.h> |
9 | |
10 | #include "busybox.h" |
11 | |
12 | static const char * const forbid[] = { |
13 | "ENV", |
14 | "BASH_ENV", |
15 | "HOME", |
16 | "IFS", |
17 | "PATH", |
18 | "SHELL", |
19 | "LD_LIBRARY_PATH", |
20 | "LD_PRELOAD", |
21 | "LD_TRACE_LOADED_OBJECTS", |
22 | "LD_BIND_NOW", |
23 | "LD_AOUT_LIBRARY_PATH", |
24 | "LD_AOUT_PRELOAD", |
25 | "LD_NOWARN", |
26 | "LD_KEEPDIR", |
27 | (char *) 0 |
28 | }; |
29 | |
30 | |
31 | static void catchalarm(int ATTRIBUTE_UNUSED junk) |
32 | { |
33 | exit(EXIT_FAILURE); |
34 | } |
35 | |
36 | |
37 | int sulogin_main(int argc, char **argv) |
38 | { |
39 | char *cp; |
40 | int timeout = 0; |
41 | char *timeout_arg; |
42 | const char * const *p; |
43 | struct passwd *pwd; |
44 | const char *shell; |
45 | |
46 | logmode = LOGMODE_BOTH; |
47 | openlog(applet_name, 0, LOG_AUTH); |
48 | |
49 | if (getopt32(argc, argv, "t:", &timeout_arg)) { |
50 | timeout = xatoi_u(timeout_arg); |
51 | } |
52 | |
53 | if (argv[optind]) { |
54 | close(0); |
55 | close(1); |
56 | dup(xopen(argv[optind], O_RDWR)); |
57 | close(2); |
58 | dup(0); |
59 | } |
60 | |
61 | if (!isatty(0) || !isatty(1) || !isatty(2)) { |
62 | logmode = LOGMODE_SYSLOG; |
63 | bb_error_msg_and_die("not a tty"); |
64 | } |
65 | |
66 | /* Clear out anything dangerous from the environment */ |
67 | for (p = forbid; *p; p++) |
68 | unsetenv(*p); |
69 | |
70 | signal(SIGALRM, catchalarm); |
71 | |
72 | pwd = getpwuid(0); |
73 | if (!pwd) { |
74 | goto auth_error; |
75 | } |
76 | |
77 | #if ENABLE_FEATURE_SHADOWPASSWDS |
78 | { |
79 | struct spwd *spwd = getspnam(pwd->pw_name); |
80 | if (!spwd) { |
81 | goto auth_error; |
82 | } |
83 | pwd->pw_passwd = spwd->sp_pwdp; |
84 | } |
85 | #endif |
86 | |
87 | while (1) { |
88 | /* cp points to a static buffer that is zeroed every time */ |
89 | cp = bb_askpass(timeout, |
90 | "Give root password for system maintenance\n" |
91 | "(or type Control-D for normal startup):"); |
92 | |
93 | if (!cp || !*cp) { |
94 | bb_info_msg("Normal startup"); |
95 | return 0; |
96 | } |
97 | if (strcmp(pw_encrypt(cp, pwd->pw_passwd), pwd->pw_passwd) == 0) { |
98 | break; |
99 | } |
100 | bb_do_delay(FAIL_DELAY); |
101 | bb_error_msg("login incorrect"); |
102 | } |
103 | memset(cp, 0, strlen(cp)); |
104 | signal(SIGALRM, SIG_DFL); |
105 | |
106 | bb_info_msg("System Maintenance Mode"); |
107 | |
108 | USE_SELINUX(renew_current_security_context()); |
109 | |
110 | shell = getenv("SUSHELL"); |
111 | if (!shell) shell = getenv("sushell"); |
112 | if (!shell) { |
113 | shell = "/bin/sh"; |
114 | if (pwd->pw_shell[0]) |
115 | shell = pwd->pw_shell; |
116 | } |
117 | run_shell(shell, 1, 0, 0); |
118 | /* never returns */ |
119 | |
120 | auth_error: |
121 | bb_error_msg_and_die("no password entry for 'root'"); |
122 | } |