hush: get rid of charmap[]
[oweals/busybox.git] / 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 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 }