Replace current verbose GPL stuff in libbb/*.c with one-line GPL boilerplate.
[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 <stdio.h>
14 #include <unistd.h>
15 #include "libbb.h"
16
17 #include <sys/utsname.h>
18 #include <time.h>
19
20 #define LOGIN " login: "
21
22 static const char fmtstr_d[] = "%A, %d %B %Y";
23 static const char fmtstr_t[] = "%H:%M:%S";
24
25 void print_login_issue(const char *issue_file, const char *tty)
26 {
27         FILE *fd;
28         int c;
29         char buf[256+1];
30         const char *outbuf;
31         time_t t;
32         struct utsname uts;
33
34         time(&t);
35         uname(&uts);
36
37         puts("\r");     /* start a new line */
38
39         if ((fd = fopen(issue_file, "r"))) {
40                 while ((c = fgetc(fd)) != EOF) {
41                         outbuf = buf;
42                         buf[0] = c;
43                         if(c == '\n') {
44                                 buf[1] = '\r';
45                                 buf[2] = 0;
46                         } else {
47                                 buf[1] = 0;
48                         }
49                         if (c == '\\' || c == '%') {
50                                 c = fgetc(fd);
51                                 switch (c) {
52                                         case 's':
53                                                 outbuf = uts.sysname;
54                                                 break;
55
56                                         case 'n':
57                                                 outbuf = uts.nodename;
58                                                 break;
59
60                                         case 'r':
61                                                 outbuf = uts.release;
62                                                 break;
63
64                                         case 'v':
65                                                 outbuf = uts.version;
66                                                 break;
67
68                                         case 'm':
69                                                 outbuf = uts.machine;
70                                                 break;
71
72                                         case 'D':
73                                         case 'o':
74                                                 c = getdomainname(buf, sizeof(buf) - 1);
75                                                 buf[c >= 0 ? c : 0] = '\0'; 
76                                                 break;
77
78                                         case 'd':
79                                                 strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
80                                                 break;
81
82                                         case 't':
83                                                 strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
84                                                 break;
85
86                                         case 'h':
87                                                 gethostname(buf, sizeof(buf) - 1);
88                                                 buf[sizeof(buf) - 1] = '\0';
89                                                 break;
90
91                                         case 'l':
92                                                 outbuf = tty;
93                                                 break;
94
95                                         default:
96                                                 buf[0] = c;
97                                 }
98                         }
99                         fputs(outbuf, stdout);
100                 }
101
102                 fclose(fd);
103
104                 fflush(stdout);
105         }
106 }
107
108 void print_login_prompt(void)
109 {
110         char buf[MAXHOSTNAMELEN+1];
111
112         if(gethostname(buf, MAXHOSTNAMELEN) == 0)
113                 fputs(buf, stdout);
114
115         fputs(LOGIN, stdout);
116         fflush(stdout);
117 }
118