Initial public busybox upstream commit
[busybox4maemo] / libbb / login.c
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 print_login_issue(const char *issue_file, const char *tty)
22 {
23         FILE *fd;
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         fd = fopen(issue_file, "r");
36         if (!fd)
37                 return;
38         while ((c = fgetc(fd)) != 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(fd);
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                                 c = getdomainname(buf, sizeof(buf) - 1);
68                                 buf[c >= 0 ? c : 0] = '\0';
69                                 break;
70                         case 'd':
71                                 strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
72                                 break;
73                         case 't':
74                                 strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
75                                 break;
76                         case 'l':
77                                 outbuf = tty;
78                                 break;
79                         default:
80                                 buf[0] = c;
81                         }
82                 }
83                 fputs(outbuf, stdout);
84         }
85         fclose(fd);
86         fflush(stdout);
87 }
88
89 void print_login_prompt(void)
90 {
91         char *hostname = safe_gethostname();
92         
93         fputs(hostname, stdout);
94         fputs(LOGIN, stdout);
95         fflush(stdout);
96         free(hostname);
97 }
98
99 /* Clear dangerous stuff, set PATH */
100 static const char forbid[] ALIGN1 =
101         "ENV" "\0"
102         "BASH_ENV" "\0"
103         "HOME" "\0"
104         "IFS" "\0"
105         "SHELL" "\0"
106         "LD_LIBRARY_PATH" "\0"
107         "LD_PRELOAD" "\0"
108         "LD_TRACE_LOADED_OBJECTS" "\0"
109         "LD_BIND_NOW" "\0"
110         "LD_AOUT_LIBRARY_PATH" "\0"
111         "LD_AOUT_PRELOAD" "\0"
112         "LD_NOWARN" "\0"
113         "LD_KEEPDIR" "\0";
114
115 int sanitize_env_if_suid(void)
116 {
117         const char *p;
118
119         if (getuid() == geteuid())
120                 return 0;
121
122         p = forbid;
123         do {
124                 unsetenv(p);
125                 p += strlen(p) + 1;
126         } while (*p);
127         putenv((char*)bb_PATH_root_path);
128
129         return 1; /* we indeed were run by different user! */
130 }