Skip to content
Newer
Older
100644 507 lines (420 sloc) 11.2 KB
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
1 /* vi: set sw=4 ts=4: */
801ab14 Add one-line GPL boilerplate to numerous (but not all yet) source files.
Robert P. J. Day authored
2 /*
3 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
4 */
5
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
6 #include <fcntl.h>
7 #include <signal.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <syslog.h>
12 #include <termios.h>
13 #include <unistd.h>
14 #include <utmp.h>
15 #include <sys/resource.h>
16 #include <sys/stat.h>
17 #include <sys/types.h>
2e50291 login: style fixes
Denis Vlasenko authored
18 #include <sys/wait.h>
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
19 #include <ctype.h>
20 #include <time.h>
21
27f64e1 Port over the last of the tinylogin applets
Eric Andersen authored
22 #include "busybox.h"
9e48045 Patch from Russell Coker:
Eric Andersen authored
23 #ifdef CONFIG_SELINUX
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
24 #include <selinux/selinux.h> /* for is_selinux_enabled() */
25 #include <selinux/get_context_list.h> /* for get_default_context() */
26 #include <selinux/flask.h> /* for security class definitions */
27 #include <errno.h>
9e48045 Patch from Russell Coker:
Eric Andersen authored
28 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
29
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
30 #ifdef CONFIG_FEATURE_UTMP
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
31 // import from utmp.c
32 static void checkutmp(int picky);
33 static void setutmp(const char *name, const char *line);
71ae64b last_patch61 from vodz:
Eric Andersen authored
34 /* Stuff global to this file */
14f5c8d Patch from Bernhard Fischer to make a bunch of symbols static
Eric Andersen authored
35 static struct utmp utent;
fdfe298 last_patch60 from vodz:
Eric Andersen authored
36 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
37
38 // login defines
39 #define TIMEOUT 60
0fbff13 Several login cleanups from vodz
Eric Andersen authored
40 #define EMPTY_USERNAME_COUNT 10
41 #define USERNAME_SIZE 32
42
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
43
44 static int check_nologin ( int amroot );
45
46 #if defined CONFIG_FEATURE_SECURETTY
47 static int check_tty ( const char *tty );
48
49 #else
50 static inline int check_tty ( const char *tty ) { return 1; }
51
52 #endif
53
54 static int is_my_tty ( const char *tty );
0fbff13 Several login cleanups from vodz
Eric Andersen authored
55 static int login_prompt ( char *buf_name );
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
56 static void motd ( void );
57
58
77bb33c destroy potential overflow for x86_64. Added ATTRIBUTE_UNUSED
Vladimir N. Oleynik authored
59 static void alarm_handler ( int sig ATTRIBUTE_UNUSED)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
60 {
0fbff13 Several login cleanups from vodz
Eric Andersen authored
61 fprintf (stderr, "\nLogin timed out after %d seconds.\n", TIMEOUT );
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
62 exit ( EXIT_SUCCESS );
63 }
64
65
dfba741 @landley Robert P. Day removed 8 gazillion occurrences of "extern" on function
landley authored
66 int login_main(int argc, char **argv)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
67 {
68 char tty[BUFSIZ];
69 char full_tty[200];
70 char fromhost[512];
0fbff13 Several login cleanups from vodz
Eric Andersen authored
71 char username[USERNAME_SIZE];
dc4e75e move all "-/bin/sh" "/bin/sh" and "sh" to libbb/messages.c file as one
Glenn L McGrath authored
72 const char *tmp;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
73 int amroot;
74 int flag;
75 int failed;
76 int count=0;
77 struct passwd *pw, pw_copy;
27f64e1 Port over the last of the tinylogin applets
Eric Andersen authored
78 #ifdef CONFIG_WHEEL_GROUP
79 struct group *grp;
80 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
81 int opt_preserve = 0;
82 int opt_fflag = 0;
83 char *opt_host = 0;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
84 int alarmstarted = 0;
9e48045 Patch from Russell Coker:
Eric Andersen authored
85 #ifdef CONFIG_SELINUX
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
86 security_context_t user_sid = NULL;
9e48045 Patch from Russell Coker:
Eric Andersen authored
87 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
88
0fbff13 Several login cleanups from vodz
Eric Andersen authored
89 username[0]=0;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
90 amroot = ( getuid ( ) == 0 );
91 signal ( SIGALRM, alarm_handler );
d8ceba9 Ronny L Nilsson writes:
Eric Andersen authored
92 alarm ( TIMEOUT );
93 alarmstarted = 1;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
94
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
95 while (( flag = getopt(argc, argv, "f:h:p")) != EOF ) {
96 switch ( flag ) {
97 case 'p':
98 opt_preserve = 1;
99 break;
100 case 'f':
101 /*
aff114c Larry Doolittle writes:
Eric Andersen authored
102 * username must be a separate token
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
103 * (-f root, *NOT* -froot). --marekm
104 */
105 if ( optarg != argv[optind-1] )
cad5364 Major coreutils update.
Manuel Novoa III authored
106 bb_show_usage( );
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
107
c1ef7bd @timriker just whitespace
timriker authored
108 if ( !amroot ) /* Auth bypass only if real UID is zero */
cad5364 Major coreutils update.
Manuel Novoa III authored
109 bb_error_msg_and_die ( "-f permission denied" );
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
110
0fbff13 Several login cleanups from vodz
Eric Andersen authored
111 safe_strncpy(username, optarg, USERNAME_SIZE);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
112 opt_fflag = 1;
113 break;
114 case 'h':
115 opt_host = optarg;
116 break;
117 default:
cad5364 Major coreutils update.
Manuel Novoa III authored
118 bb_show_usage( );
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
119 }
120 }
121
0fbff13 Several login cleanups from vodz
Eric Andersen authored
122 if (optind < argc) // user from command line (getty)
123 safe_strncpy(username, argv[optind], USERNAME_SIZE);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
124
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
125 if ( !isatty ( 0 ) || !isatty ( 1 ) || !isatty ( 2 ))
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
126 return EXIT_FAILURE; /* Must be a terminal */
127
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
128 #ifdef CONFIG_FEATURE_UTMP
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
129 checkutmp ( !amroot );
fdfe298 last_patch60 from vodz:
Eric Andersen authored
130 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
131
132 tmp = ttyname ( 0 );
b37f883 Sigh. The patch from David Anders (prpplague) broke standard
Eric Andersen authored
133 if ( tmp && ( strncmp ( tmp, "/dev/", 5 ) == 0 ))
134 safe_strncpy ( tty, tmp + 5, sizeof( tty ));
135 else if ( tmp && *tmp == '/' )
21d3086 David Anders (prpplague) submitted this patch to allow login to work
Eric Andersen authored
136 safe_strncpy ( tty, tmp, sizeof( tty ));
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
137 else
138 safe_strncpy ( tty, "UNKNOWN", sizeof( tty ));
139
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
140 #ifdef CONFIG_FEATURE_UTMP
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
141 if ( amroot )
142 memset ( utent.ut_host, 0, sizeof utent.ut_host );
71ae64b last_patch61 from vodz:
Eric Andersen authored
143 #endif
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
144
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
145 if ( opt_host ) {
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
146 #ifdef CONFIG_FEATURE_UTMP
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
147 safe_strncpy ( utent.ut_host, opt_host, sizeof( utent. ut_host ));
71ae64b last_patch61 from vodz:
Eric Andersen authored
148 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
149 snprintf ( fromhost, sizeof( fromhost ) - 1, " on `%.100s' from `%.200s'", tty, opt_host );
150 }
151 else
152 snprintf ( fromhost, sizeof( fromhost ) - 1, " on `%.100s'", tty );
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
153
b180e5a @aldot - use portability wrapper define bb_setpgrp.
aldot authored
154 bb_setpgrp;
0fbff13 Several login cleanups from vodz
Eric Andersen authored
155
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
156 openlog ( "login", LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH );
157
158 while ( 1 ) {
159 failed = 0;
160
0fbff13 Several login cleanups from vodz
Eric Andersen authored
161 if ( !username[0] )
162 if(!login_prompt ( username ))
163 return EXIT_FAILURE;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
164
165 if ( !alarmstarted && ( TIMEOUT > 0 )) {
166 alarm ( TIMEOUT );
167 alarmstarted = 1;
168 }
169
170 if (!( pw = getpwnam ( username ))) {
0fbff13 Several login cleanups from vodz
Eric Andersen authored
171 pw_copy.pw_name = "UNKNOWN";
172 pw_copy.pw_passwd = "!";
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
173 opt_fflag = 0;
174 failed = 1;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
175 } else
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
176 pw_copy = *pw;
177
178 pw = &pw_copy;
179
180 if (( pw-> pw_passwd [0] == '!' ) || ( pw-> pw_passwd[0] == '*' ))
181 failed = 1;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
182
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
183 if ( opt_fflag ) {
184 opt_fflag = 0;
185 goto auth_ok;
186 }
187
0fbff13 Several login cleanups from vodz
Eric Andersen authored
188 if (!failed && ( pw-> pw_uid == 0 ) && ( !check_tty ( tty )))
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
189 failed = 1;
190
191 /* Don't check the password if password entry is empty (!) */
192 if ( !pw-> pw_passwd[0] )
193 goto auth_ok;
194
195 /* authorization takes place here */
196 if ( correct_password ( pw ))
197 goto auth_ok;
198
199 failed = 1;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
200
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
201 auth_ok:
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
202 if ( !failed)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
203 break;
204
84cb767 @landley patch from tito: consolidate delay functions as bb_do_delay()
landley authored
205 bb_do_delay(FAIL_DELAY);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
206 puts("Login incorrect");
0fbff13 Several login cleanups from vodz
Eric Andersen authored
207 username[0] = 0;
208 if ( ++count == 3 ) {
209 syslog ( LOG_WARNING, "invalid password for `%s'%s\n", pw->pw_name, fromhost);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
210 return EXIT_FAILURE;
211 }
0fbff13 Several login cleanups from vodz
Eric Andersen authored
212 }
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
213
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
214 alarm ( 0 );
215 if ( check_nologin ( pw-> pw_uid == 0 ))
216 return EXIT_FAILURE;
217
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
218 #ifdef CONFIG_FEATURE_UTMP
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
219 setutmp ( username, tty );
fdfe298 last_patch60 from vodz:
Eric Andersen authored
220 #endif
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
221
222 if ( *tty != '/' )
223 snprintf ( full_tty, sizeof( full_tty ) - 1, "/dev/%s", tty);
224 else
225 safe_strncpy ( full_tty, tty, sizeof( full_tty ) - 1 );
226
9e48045 Patch from Russell Coker:
Eric Andersen authored
227 #ifdef CONFIG_SELINUX
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
228 if (is_selinux_enabled())
9e48045 Patch from Russell Coker:
Eric Andersen authored
229 {
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
230 security_context_t old_tty_sid, new_tty_sid;
9e48045 Patch from Russell Coker:
Eric Andersen authored
231
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
232 if (get_default_context(username, NULL, &user_sid))
9e48045 Patch from Russell Coker:
Eric Andersen authored
233 {
234 fprintf(stderr, "Unable to get SID for %s\n", username);
235 exit(1);
236 }
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
237 if (getfilecon(full_tty, &old_tty_sid) < 0)
9e48045 Patch from Russell Coker:
Eric Andersen authored
238 {
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
239 fprintf(stderr, "getfilecon(%.100s) failed: %.100s\n", full_tty, strerror(errno));
9e48045 Patch from Russell Coker:
Eric Andersen authored
240 return EXIT_FAILURE;
241 }
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
242 if (security_compute_relabel(user_sid, old_tty_sid, SECCLASS_CHR_FILE, &new_tty_sid) != 0)
9e48045 Patch from Russell Coker:
Eric Andersen authored
243 {
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
244 fprintf(stderr, "security_change_sid(%.100s) failed: %.100s\n", full_tty, strerror(errno));
9e48045 Patch from Russell Coker:
Eric Andersen authored
245 return EXIT_FAILURE;
246 }
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
247 if(setfilecon(full_tty, new_tty_sid) != 0)
9e48045 Patch from Russell Coker:
Eric Andersen authored
248 {
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
249 fprintf(stderr, "chsid(%.100s, %s) failed: %.100s\n", full_tty, new_tty_sid, strerror(errno));
9e48045 Patch from Russell Coker:
Eric Andersen authored
250 return EXIT_FAILURE;
251 }
252 }
253 #endif
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
254 if ( !is_my_tty ( full_tty ))
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
255 syslog ( LOG_ERR, "unable to determine TTY name, got %s\n", full_tty );
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
256
257 /* Try these, but don't complain if they fail
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
258 * (for example when the root fs is read only) */
259 chown ( full_tty, pw-> pw_uid, pw-> pw_gid );
260 chmod ( full_tty, 0600 );
261
2e50291 login: style fixes
Denis Vlasenko authored
262 if (ENABLE_LOGIN_SCRIPTS) {
263 char *script = getenv("LOGIN_PRE_SUID_SCRIPT");
264 if (script) {
265 char *t_argv[2] = { script, NULL };
266 switch(fork()) {
267 case -1: break;
268 case 0: /* child */
269 xchdir("/");
270 setenv("LOGIN_TTY", full_tty, 1);
271 setenv("LOGIN_USER", pw->pw_name, 1);
272 setenv("LOGIN_UID", utoa(pw->pw_uid), 1);
273 setenv("LOGIN_GID", utoa(pw->pw_gid), 1);
274 setenv("LOGIN_SHELL", pw->pw_shell, 1);
275 execvp(script, t_argv);
276 exit(1);
277 default: /* parent */
278 wait(NULL);
279 }
280 }
281 }
282
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
283 change_identity ( pw );
dc4e75e move all "-/bin/sh" "/bin/sh" and "sh" to libbb/messages.c file as one
Glenn L McGrath authored
284 tmp = pw-> pw_shell;
285 if(!tmp || !*tmp)
286 tmp = DEFAULT_SHELL;
287 setup_environment ( tmp, 1, !opt_preserve, pw );
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
288
289 motd ( );
290 signal ( SIGALRM, SIG_DFL ); /* default alarm signal */
291
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
292 if ( pw-> pw_uid == 0 )
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
293 syslog ( LOG_INFO, "root login %s\n", fromhost );
9e48045 Patch from Russell Coker:
Eric Andersen authored
294 #ifdef CONFIG_SELINUX
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
295 /* well, a simple setexeccon() here would do the job as well,
296 * but let's play the game for now */
297 set_current_security_context(user_sid);
9e48045 Patch from Russell Coker:
Eric Andersen authored
298 #endif
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
299 run_shell ( tmp, 1, 0, 0); /* exec the shell finally. */
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
300
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
301 return EXIT_FAILURE;
302 }
303
304
305
0fbff13 Several login cleanups from vodz
Eric Andersen authored
306 static int login_prompt ( char *buf_name )
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
307 {
308 char buf [1024];
309 char *sp, *ep;
0fbff13 Several login cleanups from vodz
Eric Andersen authored
310 int i;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
311
0fbff13 Several login cleanups from vodz
Eric Andersen authored
312 for(i=0; i<EMPTY_USERNAME_COUNT; i++) {
9e5d6c0 run telnet from inetd, present login prompt if login is configured,
Glenn L McGrath authored
313 print_login_prompt();
314
315 if ( !fgets ( buf, sizeof( buf ) - 1, stdin ))
316 return 0;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
317
0fbff13 Several login cleanups from vodz
Eric Andersen authored
318 if ( !strchr ( buf, '\n' ))
9e5d6c0 run telnet from inetd, present login prompt if login is configured,
Glenn L McGrath authored
319 return 0;
320
321 for ( sp = buf; isspace ( *sp ); sp++ ) { }
322 for ( ep = sp; isgraph ( *ep ); ep++ ) { }
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
323
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
324 *ep = 0;
0fbff13 Several login cleanups from vodz
Eric Andersen authored
325 safe_strncpy(buf_name, sp, USERNAME_SIZE);
326 if(buf_name[0])
327 return 1;
328 }
329 return 0;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
330 }
331
332
333 static int check_nologin ( int amroot )
334 {
cad5364 Major coreutils update.
Manuel Novoa III authored
335 if ( access ( bb_path_nologin_file, F_OK ) == 0 ) {
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
336 FILE *fp;
337 int c;
338
cad5364 Major coreutils update.
Manuel Novoa III authored
339 if (( fp = fopen ( bb_path_nologin_file, "r" ))) {
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
340 while (( c = getc ( fp )) != EOF )
341 putchar (( c == '\n' ) ? '\r' : c );
342
343 fflush ( stdout );
344 fclose ( fp );
345 } else {
346 puts ( "\r\nSystem closed for routine maintenance.\r" );
347 }
348 if ( !amroot )
349 return 1;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
350
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
351 puts ( "\r\n[Disconnect bypassed -- root login allowed.]\r" );
352 }
353 return 0;
354 }
355
356 #ifdef CONFIG_FEATURE_SECURETTY
357
358 static int check_tty ( const char *tty )
359 {
360 FILE *fp;
361 int i;
362 char buf[BUFSIZ];
363
cad5364 Major coreutils update.
Manuel Novoa III authored
364 if (( fp = fopen ( bb_path_securetty_file, "r" ))) {
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
365 while ( fgets ( buf, sizeof( buf ) - 1, fp )) {
a389651 @landley Remove bb_strlen() in favor of -fno-builtin-strlen. Saves as many bytes
landley authored
366 for ( i = strlen( buf ) - 1; i >= 0; --i ) {
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
367 if ( !isspace ( buf[i] ))
368 break;
369 }
370 buf[++i] = '\0';
371 if (( buf [0] == '\0' ) || ( buf [0] == '#' ))
372 continue;
373
374 if ( strcmp ( buf, tty ) == 0 ) {
375 fclose ( fp );
376 return 1;
377 }
378 }
379 fclose(fp);
380 return 0;
381 }
f870148 A missing securetty file is not an error.
Eric Andersen authored
382 /* A missing securetty file is not an error. */
69b5756 A missing /etc/securetty is not an error when checking the tty name -…
Robert Griebl authored
383 return 1;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
384 }
385
386 #endif
387
388 /* returns 1 if true */
389 static int is_my_tty ( const char *tty )
390 {
391 struct stat by_name, by_fd;
392
393 if ( stat ( tty, &by_name ) || fstat ( 0, &by_fd ))
394 return 0;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
395
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
396 if ( by_name. st_rdev != by_fd. st_rdev )
397 return 0;
398 else
399 return 1;
400 }
401
402
4e5936e @vapier In Bug 208, bernhardf writes:
vapier authored
403 static void motd (void)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
404 {
405 FILE *fp;
6822983 Remove all usage of the "register" storage class specifier.
Robert P. J. Day authored
406 int c;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
407
cad5364 Major coreutils update.
Manuel Novoa III authored
408 if (( fp = fopen ( bb_path_motd_file, "r" ))) {
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
409 while (( c = getc ( fp )) != EOF )
410 putchar ( c );
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
411 fclose ( fp );
412 }
413 }
414
415
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
416 #ifdef CONFIG_FEATURE_UTMP
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
417 // vv Taken from tinylogin utmp.c vv
418
419 #define NO_UTENT \
420 "No utmp entry. You must exec \"login\" from the lowest level \"sh\""
421 #define NO_TTY \
422 "Unable to determine your tty name."
423
424 /*
425 * checkutmp - see if utmp file is correct for this process
426 *
427 * System V is very picky about the contents of the utmp file
428 * and requires that a slot for the current process exist.
429 * The utmp file is scanned for an entry with the same process
430 * ID. If no entry exists the process exits with a message.
431 *
432 * The "picky" flag is for network and other logins that may
433 * use special flags. It allows the pid checks to be overridden.
434 * This means that getty should never invoke login with any
435 * command line flags.
436 */
437
438 static void checkutmp(int picky)
439 {
440 char *line;
441 struct utmp *ut;
442 pid_t pid = getpid();
443
444 setutent();
445
446 /* First, try to find a valid utmp entry for this process. */
447 while ((ut = getutent()))
448 if (ut->ut_pid == pid && ut->ut_line[0] && ut->ut_id[0] &&
449 (ut->ut_type == LOGIN_PROCESS || ut->ut_type == USER_PROCESS))
450 break;
451
452 /* If there is one, just use it, otherwise create a new one. */
453 if (ut) {
454 utent = *ut;
455 } else {
77bb33c destroy potential overflow for x86_64. Added ATTRIBUTE_UNUSED
Vladimir N. Oleynik authored
456 time_t t_tmp;
457
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
458 if (picky) {
459 puts(NO_UTENT);
460 exit(1);
461 }
462 line = ttyname(0);
463 if (!line) {
464 puts(NO_TTY);
465 exit(1);
466 }
467 if (strncmp(line, "/dev/", 5) == 0)
468 line += 5;
a980165 getty, sulogin: convert to using bb_msg for syslog output
Denis Vlasenko authored
469 memset(&utent, 0, sizeof utent);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
470 utent.ut_type = LOGIN_PROCESS;
471 utent.ut_pid = pid;
472 strncpy(utent.ut_line, line, sizeof utent.ut_line);
473 /* XXX - assumes /dev/tty?? */
474 strncpy(utent.ut_id, utent.ut_line + 3, sizeof utent.ut_id);
475 strncpy(utent.ut_user, "LOGIN", sizeof utent.ut_user);
77bb33c destroy potential overflow for x86_64. Added ATTRIBUTE_UNUSED
Vladimir N. Oleynik authored
476 t_tmp = (time_t)utent.ut_time;
477 time(&t_tmp);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
478 }
479 }
480
481 /*
482 * setutmp - put a USER_PROCESS entry in the utmp file
483 *
484 * setutmp changes the type of the current utmp entry to
485 * USER_PROCESS. the wtmp file will be updated as well.
486 */
487
77bb33c destroy potential overflow for x86_64. Added ATTRIBUTE_UNUSED
Vladimir N. Oleynik authored
488 static void setutmp(const char *name, const char *line ATTRIBUTE_UNUSED)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
489 {
39e7510 more destroy potential overflow for x86_64.
Vladimir N. Oleynik authored
490 time_t t_tmp = (time_t)utent.ut_time;
781e42d @aldot - introduce and use bb_path_wtmp_file for portability (saves 11 Bytes).
aldot authored
491
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
492 utent.ut_type = USER_PROCESS;
493 strncpy(utent.ut_user, name, sizeof utent.ut_user);
39e7510 more destroy potential overflow for x86_64.
Vladimir N. Oleynik authored
494 time(&t_tmp);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
495 /* other fields already filled in by checkutmp above */
496 setutent();
497 pututline(&utent);
498 endutent();
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
499 #ifdef CONFIG_FEATURE_WTMP
781e42d @aldot - introduce and use bb_path_wtmp_file for portability (saves 11 Bytes).
aldot authored
500 if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
501 close(creat(bb_path_wtmp_file, 0664));
aad29b3 Fixup getty, login, etc so the utmp and wtmp are updated, allowing
Eric Andersen authored
502 }
781e42d @aldot - introduce and use bb_path_wtmp_file for portability (saves 11 Bytes).
aldot authored
503 updwtmp(bb_path_wtmp_file, &utent);
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
504 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
505 }
8deb686 @vapier Patch by jonlar in Bug 312 to split the U_W_TMP feature into sep UTMP…
vapier authored
506 #endif /* CONFIG_FEATURE_UTMP */
Something went wrong with that request. Please try again.