Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | /* vi: set sw=4 ts=4: */
/*
* issue.c: issue printing code
*
* Copyright (C) 2003 Bastian Blank <waldi@tuxbox.org>
*
* Optimize and correcting OCRNL by Vladimir Oleynik <dzo@simtreas.ru>
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
#include "libbb.h"
/* After libbb.h, since it needs sys/types.h on some systems */
#include <sys/utsname.h>
#define LOGIN " login: "
static const char fmtstr_d[] ALIGN1 = "%A, %d %B %Y";
void FAST_FUNC print_login_issue(const char *issue_file, const char *tty)
{
FILE *fp;
int c;
char buf[256+1];
const char *outbuf;
time_t t;
struct utsname uts;
time(&t);
uname(&uts);
puts("\r"); /* start a new line */
fp = fopen_for_read(issue_file);
if (!fp)
return;
while ((c = fgetc(fp)) != EOF) {
outbuf = buf;
buf[0] = c;
buf[1] = '\0';
if (c == '\n') {
buf[1] = '\r';
buf[2] = '\0';
}
if (c == '\\' || c == '%') {
c = fgetc(fp);
switch (c) {
//From getty manpage (* - supported by us)
//========================================
//4 or 4{interface}
// Insert the IPv4 address of the network interface (example: \4{eth0}).
// If the interface argument is not specified, then select the first
// fully configured (UP, non-LOOPBACK, RUNNING) interface.
//6 or 6{interface} -- The same as \4 but for IPv6.
//b -- Insert the baudrate of the current line.
//*d -- Insert the current date.
//*t -- Insert the current time.
//e or e{name}
// Translate the human-readable name to an escape sequence and insert it
// (for example: \e{red}Alert text.\e{reset}). If the name argument
// is not specified, then insert \033. The currently supported names are:
// black, blink, blue, bold, brown, cyan, darkgray, gray, green, halfbright,
// lightblue, lightcyan, lightgray, lightgreen, lightmagenta, lightred,
// magenta, red, reset, reverse, and yellow. Unknown names are ignored.
//*s
// Insert the system name (the name of the operating system - `uname -s`)
//*S or S{VARIABLE}
// Insert the VARIABLE data from /etc/os-release.
// If the VARIABLE argument is not specified, use PRETTY_NAME.
// If PRETTY_NAME is not in /etc/os-release, \S is the same as \s.
//*l -- Insert the name of the current tty line.
//*m -- Insert the architecture identifier of the machine: `uname -m`.
//*n -- Insert the nodename of the machine: `uname -n`.
//*o -- Insert the NIS domainname of the machine. Same as `hostname -d'.
//*O -- Insert the DNS domainname of the machine.
//*r -- Insert the release number of the OS: `uname -r`.
//u -- Insert the number of current users logged in.
//U -- Insert the string "1 user" or "N users" (current users logged in).
//*v -- Insert the version of the OS, e.g. the build-date etc: `uname -v`.
//We also implement:
//*D -- same as \O "DNS domainname"
//*h -- same as \n "nodename"
case 'S':
/* minimal implementation, not reading /etc/os-release */
/*FALLTHROUGH*/
case 's':
outbuf = uts.sysname;
break;
case 'n':
case 'h':
outbuf = uts.nodename;
break;
case 'r':
outbuf = uts.release;
break;
case 'v':
outbuf = uts.version;
break;
case 'm':
outbuf = uts.machine;
break;
/* The field domainname of struct utsname is Linux specific. */
#if defined(__linux__)
case 'D':
case 'o':
case 'O':
outbuf = uts.domainname;
break;
#endif
case 'd':
strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
break;
case 't':
strftime_HHMMSS(buf, sizeof(buf), &t);
break;
case 'l':
outbuf = tty;
break;
default:
buf[0] = c;
}
}
fputs(outbuf, stdout);
}
fclose(fp);
fflush_all();
}
void FAST_FUNC print_login_prompt(void)
{
char *hostname = safe_gethostname();
fputs(hostname, stdout);
fputs(LOGIN, stdout);
fflush_all();
free(hostname);
}
/* Clear dangerous stuff, set PATH */
static const char forbid[] ALIGN1 =
"ENV" "\0"
"BASH_ENV" "\0"
"HOME" "\0"
"IFS" "\0"
"SHELL" "\0"
"LD_LIBRARY_PATH" "\0"
"LD_PRELOAD" "\0"
"LD_TRACE_LOADED_OBJECTS" "\0"
"LD_BIND_NOW" "\0"
"LD_AOUT_LIBRARY_PATH" "\0"
"LD_AOUT_PRELOAD" "\0"
"LD_NOWARN" "\0"
"LD_KEEPDIR" "\0";
int FAST_FUNC sanitize_env_if_suid(void)
{
const char *p;
if (getuid() == geteuid())
return 0;
p = forbid;
do {
unsetenv(p);
p += strlen(p) + 1;
} while (*p);
putenv((char*)bb_PATH_root_path);
return 1; /* we indeed were run by different user! */
}
|