Magellan Linux

Contents of /tags/mkinitrd-6_1_12/busybox/libbb/login.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 939 - (show annotations) (download)
Tue Nov 17 21:24:51 2009 UTC (14 years, 6 months ago) by niro
File MIME type: text/plain
File size: 2383 byte(s)
tagged 'mkinitrd-6_1_12'
1 /* vi: set sw=4 ts=4: */
2 /*
3 * issue.c: issue printing code
4 *
5 * Copyright (C) 2003 Bastian Blank <waldi@tuxbox.org>
6 *
7 * Optimize and correcting OCRNL by Vladimir Oleynik <dzo@simtreas.ru>
8 *
9 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
10 */
11
12 #include <sys/param.h> /* MAXHOSTNAMELEN */
13 #include <sys/utsname.h>
14 #include "libbb.h"
15
16 #define LOGIN " login: "
17
18 static const char fmtstr_d[] ALIGN1 = "%A, %d %B %Y";
19 static const char fmtstr_t[] ALIGN1 = "%H:%M:%S";
20
21 void FAST_FUNC print_login_issue(const char *issue_file, const char *tty)
22 {
23 FILE *fp;
24 int c;
25 char buf[256+1];
26 const char *outbuf;
27 time_t t;
28 struct utsname uts;
29
30 time(&t);
31 uname(&uts);
32
33 puts("\r"); /* start a new line */
34
35 fp = fopen_for_read(issue_file);
36 if (!fp)
37 return;
38 while ((c = fgetc(fp)) != EOF) {
39 outbuf = buf;
40 buf[0] = c;
41 buf[1] = '\0';
42 if (c == '\n') {
43 buf[1] = '\r';
44 buf[2] = '\0';
45 }
46 if (c == '\\' || c == '%') {
47 c = fgetc(fp);
48 switch (c) {
49 case 's':
50 outbuf = uts.sysname;
51 break;
52 case 'n':
53 case 'h':
54 outbuf = uts.nodename;
55 break;
56 case 'r':
57 outbuf = uts.release;
58 break;
59 case 'v':
60 outbuf = uts.version;
61 break;
62 case 'm':
63 outbuf = uts.machine;
64 break;
65 case 'D':
66 case 'o':
67 outbuf = uts.domainname;
68 break;
69 case 'd':
70 strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
71 break;
72 case 't':
73 strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
74 break;
75 case 'l':
76 outbuf = tty;
77 break;
78 default:
79 buf[0] = c;
80 }
81 }
82 fputs(outbuf, stdout);
83 }
84 fclose(fp);
85 fflush(stdout);
86 }
87
88 void FAST_FUNC print_login_prompt(void)
89 {
90 char *hostname = safe_gethostname();
91
92 fputs(hostname, stdout);
93 fputs(LOGIN, stdout);
94 fflush(stdout);
95 free(hostname);
96 }
97
98 /* Clear dangerous stuff, set PATH */
99 static const char forbid[] ALIGN1 =
100 "ENV" "\0"
101 "BASH_ENV" "\0"
102 "HOME" "\0"
103 "IFS" "\0"
104 "SHELL" "\0"
105 "LD_LIBRARY_PATH" "\0"
106 "LD_PRELOAD" "\0"
107 "LD_TRACE_LOADED_OBJECTS" "\0"
108 "LD_BIND_NOW" "\0"
109 "LD_AOUT_LIBRARY_PATH" "\0"
110 "LD_AOUT_PRELOAD" "\0"
111 "LD_NOWARN" "\0"
112 "LD_KEEPDIR" "\0";
113
114 int FAST_FUNC sanitize_env_if_suid(void)
115 {
116 const char *p;
117
118 if (getuid() == geteuid())
119 return 0;
120
121 p = forbid;
122 do {
123 unsetenv(p);
124 p += strlen(p) + 1;
125 } while (*p);
126 putenv((char*)bb_PATH_root_path);
127
128 return 1; /* we indeed were run by different user! */
129 }