Mercurial > hg > toybox
annotate toys/pending/getty.c @ 1363:e65f9a9ba62d draft
Cleanup pass on mkpasswd.c
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 25 Jun 2014 22:54:59 -0500 |
parents | b6226bf22826 |
children | 27f608badc20 |
rev | line source |
---|---|
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* getty.c - A getty program to get controlling terminal. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2012 Sandeep Sharma <sandeep.jack2756@gamil.com> |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * No Standard. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 USE_GETTY(NEWTOY(getty, "<2t#<0H:I:l:f:iwnmLh",TOYFLAG_SBIN)) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 config GETTY |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 bool "getty" |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 default n |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 help |
1265
0ecfaa7022e8
usage: is lower case (the help generator looks for that, might as well be consistent).
Rob Landley <rob@landley.net>
parents:
1253
diff
changeset
|
14 usage: getty [OPTIONS] BAUD_RATE[,BAUD_RATE]... TTY [TERMTYPE] |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 -h Enable hardware RTS/CTS flow control |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 -L Set CLOCAL (ignore Carrier Detect state) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 -m Get baud rate from modem's CONNECT status message |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 -n Don't prompt for login name |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 -w Wait for CR or LF before sending /etc/issue |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 -i Don't display /etc/issue |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 -f ISSUE_FILE Display ISSUE_FILE instead of /etc/issue |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 -l LOGIN Invoke LOGIN instead of /bin/login |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 -t SEC Terminate after SEC if no login name is read |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 -I INITSTR Send INITSTR before anything else |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 -H HOST Log HOST into the utmp file as the hostname |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 */ |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 #define FOR_getty |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 #include "toys.h" |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 #include <utmp.h> |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 GLOBALS( |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 char *issue_str; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 char *login_str; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 char *init_str; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 char *host_str; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 long timeout; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 char *tty_name; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 int speeds[20]; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 int sc; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 struct termios termios; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 char buff[128]; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 ) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 #define CTL(x) ((x) ^ 0100) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 #define HOSTNAME_SIZE 32 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 typedef void (*sighandler_t)(int); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 struct speed_mapper { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 long speed; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 speed_t code; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 }; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 struct speed_mapper speedtab[] = { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 {50, B50}, {75, B75}, {110, B110}, {134, B134}, {150, B150}, {200, B200}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 {300, B300}, {600, B600}, {1200, B1200}, {1800, B1800}, {2400, B2400}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 {4800, B4800}, {9600, B9600}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 #ifdef B19200 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 {19200, B19200}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 #ifdef B38400 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 {38400, B38400}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 #ifdef EXTA |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 {19200, EXTA}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 #ifdef EXTB |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 {38400, B38400}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 #ifdef B57600 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 {57600, B57600}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 #ifdef B115200 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 {115200, B115200}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 #ifdef B230400 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 {230400, B230400}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 {0, 0}, |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 }; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 // Find speed from mapper array |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 static speed_t encode(char *s) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 struct speed_mapper *sp; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 long speed = atolx(s); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 if (!speed) return 0; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 for (sp = speedtab; sp->speed; sp++) if (sp->speed == speed) return sp->code; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 return (speed_t) -1; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 static void get_speed(char *sp) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 char *ptr; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 TT.sc = 0; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 while ((ptr = strsep(&sp, ","))) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 TT.speeds[TT.sc] = encode(ptr); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
101 if (TT.speeds[TT.sc] < 0) perror_exit("bad speed"); |
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
102 if (++TT.sc > 10) perror_exit("too many speeds, max is 10"); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 // Parse args and set TERM env. variable |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 static void parse_arguments(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 if (isdigit(**toys.optargs)) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 get_speed(*toys.optargs); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
111 if (*++toys.optargs) TT.tty_name = xmprintf("%s", *toys.optargs); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 } else { |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
113 TT.tty_name = xmprintf("%s", *toys.optargs); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 if (*++toys.optargs) get_speed(*toys.optargs); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 if (*++toys.optargs) setenv("TERM", *toys.optargs, 1); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 // Get controlling terminal and redirect stdio |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 static void open_tty(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 if (strcmp(TT.tty_name, "-")) { |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
123 if (*(TT.tty_name) != '/') TT.tty_name = xmprintf("/dev/%s", TT.tty_name); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 // Sends SIGHUP to all foreground process if Session leader don't die,Ignore |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 sighandler_t sig = signal(SIGHUP, SIG_IGN); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 ioctl(0, TIOCNOTTY, 0); // Giveup if there is any controlling terminal |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 signal(SIGHUP, sig); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
128 if ((setsid() < 0) && (getpid() != getsid(0))) |
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
129 perror_exit("setsid"); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 xclose(0); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 xopen(TT.tty_name, O_RDWR|O_NDELAY); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 fcntl(0, F_SETFL, fcntl(0, F_GETFL) & ~O_NONBLOCK); // Block read |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 dup2(0, 1); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 dup2(0, 2); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 if (ioctl(0, TIOCSCTTY, 1) < 0) perror_msg("ioctl(TIOCSCTTY)"); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
136 if (!isatty(0)) perror_exit("/dev/%s: not a tty", TT.tty_name); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 chown(TT.tty_name, 0, 0); // change ownership, Hope login will change this |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 chmod(TT.tty_name, 0620); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 } else { // We already have opened TTY |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
140 if (setsid() < 0) perror_msg("setsid failed"); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 if ((fcntl(0, F_GETFL) & (O_RDWR|O_RDONLY|O_WRONLY)) != O_RDWR) |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
142 perror_exit("no read/write permission"); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 // Intialise terminal settings |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 static void termios_init(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 if (tcgetattr(STDIN_FILENO, &TT.termios) < 0) perror_exit("tcgetattr"); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 // Flush input and output queues, important for modems! |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 tcflush(STDIN_FILENO, TCIOFLUSH); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 TT.termios.c_cflag &= (0|CSTOPB|PARENB|PARODD); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 #ifdef CRTSCTS |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 if (toys.optflags & FLAG_h) TT.termios.c_cflag |= CRTSCTS; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 #endif |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 if (toys.optflags & FLAG_L) TT.termios.c_cflag |= CLOCAL; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 TT.termios.c_cc[VTIME] = 0; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 TT.termios.c_cc[VMIN] = 1; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 TT.termios.c_oflag = OPOST|ONLCR; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 TT.termios.c_cflag |= CS8|CREAD|HUPCL|CBAUDEX; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 // login will disable echo for passwd. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 TT.termios.c_lflag |= ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOKE; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 TT.termios.c_cc[VINTR] = CTL('C'); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 TT.termios.c_cc[VQUIT] = CTL('\\'); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 TT.termios.c_cc[VEOF] = CTL('D'); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 TT.termios.c_cc[VEOL] = '\n'; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 TT.termios.c_cc[VKILL] = CTL('U'); |
1361
b6226bf22826
Glibc and uClibc provide CERASE from termios.h, but musl requies you to #include a non-posix header and the maintainer considers this a feature. So just use the constant directly.
Rob Landley <rob@landley.net>
parents:
1265
diff
changeset
|
168 TT.termios.c_cc[VERASE] = 127; // CERASE |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
169 TT.termios.c_iflag = ICRNL|IXON|IXOFF; |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 // set non-zero baud rate. Zero baud rate left it unchanged. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 if (TT.speeds[0] != B0) cfsetspeed(&TT.termios, TT.speeds[0]); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 if (tcsetattr(STDIN_FILENO, TCSANOW, &TT.termios) < 0) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 perror_exit("tcsetattr"); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 // Get the baud rate from modems CONNECT mesage, Its of form <junk><BAUD><Junk> |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 static void sense_baud(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 int vmin; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 ssize_t size; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 char *ptr; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 speed_t speed; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 vmin = TT.termios.c_cc[VMIN]; // Store old |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 TT.termios.c_cc[VMIN] = 0; // No block even queue is empty. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 if (tcsetattr(STDIN_FILENO, TCSANOW, &TT.termios) < 0) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 perror_exit("tcsetattr"); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 size = readall(STDIN_FILENO, TT.buff, sizeof(TT.buff)-1); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 if (size > 0) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 for (ptr = TT.buff; ptr < TT.buff+size; ptr++) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 if (isdigit(*ptr)) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 speed = encode(ptr); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 if (speed > 0) cfsetspeed(&TT.termios,speed); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 break; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 TT.termios.c_cc[VMIN] = vmin; //restore old value |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 if (tcsetattr(STDIN_FILENO, TCSANOW, &TT.termios) < 0) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 perror_exit("tcsetattr"); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 // Just prompt for login name |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 void print_prompt(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 char *hostname; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 struct utsname uts; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 uname(&uts); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 hostname = xstrdup(uts.nodename); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 fputs(hostname, stdout); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
212 fputs(" login: ", stdout); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 fflush(NULL); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 free(hostname); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 hostname = NULL; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 // Print /etc/isuue with taking care of each escape sequence |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 void write_issue(char *file) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 char buff[20] = {0,}; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 struct utsname u; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 uname(&u); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 int size, fd = open(TT.issue_str, O_RDONLY); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 if (fd < 0) return; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 while ((size = readall(fd, buff, 1)) > 0) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 char *ch = buff; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 if (*ch == '\\' || *ch == '%') { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 if (readall(fd, buff, 1) <= 0) perror_exit("readall"); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 if (*ch == 's') fputs(u.sysname, stdout); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 if (*ch == 'n'|| *ch == 'h') fputs(u.nodename, stdout); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 if (*ch == 'r') fputs(u.release, stdout); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 if (*ch == 'm') fputs(u.machine, stdout); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 if (*ch == 'l') fputs(TT.tty_name, stdout); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 } else xputc(*ch); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 // Read login name and print prompt and Issue file. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 static int read_login_name(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 tcflush(STDIN_FILENO, TCIFLUSH); // Flush pending speed switches |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 int i = 0; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 while (1) { // Option -i will overide -f |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 if (!(toys.optflags & FLAG_i)) write_issue(TT.issue_str); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 print_prompt(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 TT.buff[0] = getchar(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 if (!TT.buff[0] && TT.sc > 1) return 0; // Switch speed |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 if (TT.buff[0] == '\n') continue; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 if (TT.buff[0] != '\n') |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 if (!fgets(&TT.buff[1], HOSTNAME_SIZE-1, stdin)) _exit(1); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 while (i < HOSTNAME_SIZE-1 && isgraph(TT.buff[i])) i++; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 TT.buff[i] = 0; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 break; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 return 1; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 // Put hostname entry in utmp file |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 static void utmp_entry(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 struct utmp entry; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 struct utmp *utp_ptr; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 pid_t pid = getpid(); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
268 char *utmperr = "can't make utmp entry, host length greater than UT_HOSTSIZE(256)"; |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 utmpname(_PATH_UTMP); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 setutent(); // Starts from start |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 while ((utp_ptr = getutent())) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 if (utp_ptr->ut_pid == pid && utp_ptr->ut_type >= INIT_PROCESS) break; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 if (!utp_ptr) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 entry.ut_type = LOGIN_PROCESS; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 entry.ut_pid = getpid(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 xstrncpy(entry.ut_line, ttyname(STDIN_FILENO) + |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 strlen("/dev/"), UT_LINESIZE); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 time((time_t *)&entry.ut_time); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 xstrncpy(entry.ut_user, "LOGIN", UT_NAMESIZE); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 if (strlen(TT.host_str) > UT_HOSTSIZE) |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
282 perror_msg(utmperr); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 else xstrncpy(entry.ut_host, TT.host_str, UT_HOSTSIZE); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 setutent(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 pututline(&entry); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 return; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 xstrncpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"), UT_LINESIZE); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 xstrncpy(entry.ut_user, "LOGIN", UT_NAMESIZE); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 if (strlen(TT.host_str) > UT_HOSTSIZE) |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
291 perror_msg(utmperr); |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 else xstrncpy(entry.ut_host, TT.host_str, UT_HOSTSIZE); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 time((time_t *)&entry.ut_time); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 setutent(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 pututline(&entry); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 void getty_main(void) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 pid_t pid = getpid(); |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
301 char *ptr[3] = {"/bin/login", NULL, NULL}; //2 NULLs so we can add username |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 if (!(toys.optflags & FLAG_f)) TT.issue_str = "/etc/issue"; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 if (toys.optflags & FLAG_l) ptr[0] = TT.login_str; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 parse_arguments(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 open_tty(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 termios_init(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 tcsetpgrp(STDIN_FILENO, pid); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 if (toys.optflags & FLAG_H) utmp_entry(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 if (toys.optflags & FLAG_I) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 writeall(STDOUT_FILENO,TT.init_str,strlen(TT.init_str)); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 if (toys.optflags & FLAG_m) sense_baud(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 if (toys.optflags & FLAG_t) alarm(TT.timeout); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 if (toys.optflags & FLAG_w) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 char ch; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 while (readall(STDIN_FILENO, &ch, 1) != 1) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 if (ch == '\n' || ch == '\r') break; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 } |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 if (!(toys.optflags & FLAG_n)) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 int index = 1; // 0th we already set. |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 while (1) { |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 int l = read_login_name(); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 if (l) break; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 index = index % TT.sc; |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 cfsetspeed(&TT.termios, TT.speeds[index]); // Select from multiple speeds |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 //Necessary after cfsetspeed |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 if (tcsetattr(STDIN_FILENO, TCSANOW, &TT.termios) < 0) |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 perror_exit("tcsetattr"); |
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 } |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
333 ptr[1]=TT.buff; //put the username in the login command line |
1244
40ed517e0cda
A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 } |
1253
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
335 xexec(ptr); |
43c3d6350b38
getty: build fix, clean up messages, simplify code
Isaac Dunham <ibid.ag@gmail.com>
parents:
1244
diff
changeset
|
336 } |