Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/libbb/login.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 984 - (hide annotations) (download)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 2492 byte(s)
-updated to busybox-1.16.1 and enabled blkid/uuid support in default config
1 niro 532 /* 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 niro 984 #include "libbb.h"
13     /* After libbb.h, since it needs sys/types.h on some systems */
14 niro 816 #include <sys/utsname.h>
15 niro 532
16     #define LOGIN " login: "
17    
18 niro 816 static const char fmtstr_d[] ALIGN1 = "%A, %d %B %Y";
19     static const char fmtstr_t[] ALIGN1 = "%H:%M:%S";
20 niro 532
21 niro 816 void FAST_FUNC print_login_issue(const char *issue_file, const char *tty)
22 niro 532 {
23 niro 816 FILE *fp;
24 niro 532 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 niro 816 fp = fopen_for_read(issue_file);
36     if (!fp)
37 niro 532 return;
38 niro 816 while ((c = fgetc(fp)) != EOF) {
39 niro 532 outbuf = buf;
40     buf[0] = c;
41     buf[1] = '\0';
42 niro 816 if (c == '\n') {
43 niro 532 buf[1] = '\r';
44     buf[2] = '\0';
45     }
46     if (c == '\\' || c == '%') {
47 niro 816 c = fgetc(fp);
48 niro 532 switch (c) {
49     case 's':
50     outbuf = uts.sysname;
51     break;
52     case 'n':
53 niro 816 case 'h':
54 niro 532 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 niro 984 /* The field domainname of struct utsname is Linux specific. */
66     #if defined(__linux__)
67 niro 532 case 'D':
68     case 'o':
69 niro 816 outbuf = uts.domainname;
70 niro 532 break;
71 niro 984 #endif
72 niro 532 case 'd':
73     strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
74     break;
75     case 't':
76     strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
77     break;
78     case 'l':
79     outbuf = tty;
80     break;
81     default:
82     buf[0] = c;
83     }
84     }
85     fputs(outbuf, stdout);
86     }
87 niro 816 fclose(fp);
88 niro 984 fflush_all();
89 niro 532 }
90    
91 niro 816 void FAST_FUNC print_login_prompt(void)
92 niro 532 {
93 niro 816 char *hostname = safe_gethostname();
94 niro 532
95 niro 816 fputs(hostname, stdout);
96 niro 532 fputs(LOGIN, stdout);
97 niro 984 fflush_all();
98 niro 816 free(hostname);
99 niro 532 }
100 niro 816
101     /* Clear dangerous stuff, set PATH */
102     static const char forbid[] ALIGN1 =
103     "ENV" "\0"
104     "BASH_ENV" "\0"
105     "HOME" "\0"
106     "IFS" "\0"
107     "SHELL" "\0"
108     "LD_LIBRARY_PATH" "\0"
109     "LD_PRELOAD" "\0"
110     "LD_TRACE_LOADED_OBJECTS" "\0"
111     "LD_BIND_NOW" "\0"
112     "LD_AOUT_LIBRARY_PATH" "\0"
113     "LD_AOUT_PRELOAD" "\0"
114     "LD_NOWARN" "\0"
115     "LD_KEEPDIR" "\0";
116    
117     int FAST_FUNC sanitize_env_if_suid(void)
118     {
119     const char *p;
120    
121     if (getuid() == geteuid())
122     return 0;
123    
124     p = forbid;
125     do {
126     unsetenv(p);
127     p += strlen(p) + 1;
128     } while (*p);
129     putenv((char*)bb_PATH_root_path);
130    
131     return 1; /* we indeed were run by different user! */
132     }