annotate toys/pending/getty.c @ 1276:d48bdc1cb017 draft

Switch human_readable() to just outputing decimal kilo/mega/gigabytes, make du use it, move it from lib/pending.c to lib.c.
author Rob Landley <rob@landley.net>
date Tue, 06 May 2014 06:31:28 -0500
parents 0ecfaa7022e8
children b6226bf22826
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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');
40ed517e0cda A getty implementation from Sandeep Sharma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 TT.termios.c_cc[VERASE] = 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 }