Print this page
14249 pseudo-terminal nomenclature should reflect POSIX
Change-Id: Ib4a3cef899ff4c71b09cb0dc6878863c5e8357bc
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/cmd/script/script.c
+++ new/usr/src/cmd/script/script.c
1 1 /*
2 2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3 3 * Use is subject to license terms.
4 4 */
5 5
6 -/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
7 -/* All Rights Reserved */
6 +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
7 +/* All Rights Reserved */
8 8
9 9
10 10 /*
11 11 * Copyright (c) 1980 Regents of the University of California.
12 12 * All rights reserved. The Berkeley software License Agreement
13 13 * specifies the terms and conditions for redistribution.
14 14 */
15 15
16 16 /* Portions Copyright(c) 1988, Sun Microsystems, Inc. */
17 17 /* All Rights Reserved. */
18 18
19 19 /*
20 20 * script: Produce a record of a terminal session.
21 21 */
22 22 #include <stdio.h>
23 23 #include <stdlib.h>
24 24 #include <unistd.h>
25 25 #include <signal.h>
|
↓ open down ↓ |
8 lines elided |
↑ open up ↑ |
26 26 #include <fcntl.h>
27 27 #include <locale.h>
28 28 #include <time.h>
29 29 #include <sys/stropts.h>
30 30 #include <sys/types.h>
31 31 #include <sys/stat.h>
32 32 #include <sys/termios.h>
33 33 #include <sys/file.h>
34 34 #include <errno.h>
35 35
36 -int grantpt();
37 -int unlockpt();
36 +int grantpt();
37 +int unlockpt();
38 38 char *ptsname();
39 39 void doinput() __NORETURN;
40 40 void dooutput();
41 41 void doshell();
42 42 void fixtty();
43 43 void fail();
44 44 void done() __NORETURN;
45 -void getmaster();
46 -void getslave();
45 +void getmanager();
46 +void getsubsid();
47 47
48 48 char *shell;
49 49 FILE *fscript;
50 -int master; /* file descriptor for master pseudo-tty */
51 -int slave; /* file descriptor for slave pseudo-tty */
50 +int manager; /* file descriptor for manager pseudo-tty */
51 +int subsid; /* file descriptor for subsidiary pseudo-tty */
52 52 int child;
53 53 int subchild;
54 54 char *fname = "typescript";
55 55 void sigwinch();
56 56 void finish();
57 57
58 58 struct termios b;
59 59 struct winsize size;
60 60 int lb;
61 61 int l;
62 -char *mptname = "/dev/ptmx"; /* master pseudo-tty device */
62 +char *mptname = "/dev/ptmx"; /* manager pseudo-tty device */
63 63
64 64 int aflg;
65 65
66 66 int
67 67 main(int argc, char *argv[])
68 68 {
69 69 uid_t ruidt;
70 70 gid_t gidt;
71 71
72 72 (void) setlocale(LC_ALL, "");
73 73 #if !defined(TEXT_DOMAIN)
74 74 #define TEXT_DOMAIN "SYS_TEST"
75 75 #endif
76 76 (void) textdomain(TEXT_DOMAIN);
77 77
78 78 shell = getenv("SHELL");
79 79 if (shell == NULL)
80 80 shell = "/bin/sh";
81 81 argc--, argv++;
82 82 while (argc > 0 && argv[0][0] == '-') {
83 83 switch (argv[0][1]) {
84 84
85 85 case 'a':
86 86 aflg++;
87 87 break;
88 88
89 89 default:
90 90 fprintf(stderr,
91 91 gettext("usage: script [ -a ] [ typescript ]\n"));
92 92 exit(1);
93 93 }
94 94 argc--, argv++;
95 95 }
|
↓ open down ↓ |
23 lines elided |
↑ open up ↑ |
96 96 if (argc > 0)
97 97 fname = argv[0];
98 98 ruidt = getuid();
99 99 gidt = getgid();
100 100 if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL) {
101 101 perror(fname);
102 102 fail();
103 103 }
104 104 setbuf(fscript, NULL);
105 105 chown(fname, ruidt, gidt);
106 - getmaster();
106 + getmanager();
107 107 printf(gettext("Script started, file is %s\n"), fname);
108 108 fixtty();
109 109
110 110 (void) signal(SIGCHLD, finish);
111 111 child = fork();
112 112 if (child < 0) {
113 113 perror("fork");
114 114 fail();
115 115 }
116 116 if (child == 0) {
117 117 subchild = child = fork();
118 118 if (child < 0) {
119 119 perror("fork");
120 120 fail();
121 121 }
122 122 if (child)
123 123 dooutput();
124 124 else
125 125 doshell();
126 126 }
127 127 doinput();
128 128 /* NOTREACHED */
129 129 return (0);
130 130 }
131 131
132 132 void
133 133 doinput()
134 134 {
135 135 char ibuf[BUFSIZ];
136 136 int cc;
137 137
138 138 (void) fclose(fscript);
|
↓ open down ↓ |
22 lines elided |
↑ open up ↑ |
139 139 sigset(SIGWINCH, sigwinch);
140 140
141 141 while ((cc = read(0, ibuf, BUFSIZ)) != 0) {
142 142 if (cc == -1) {
143 143 if (errno == EINTR) { /* SIGWINCH probably */
144 144 continue;
145 145 } else {
146 146 break;
147 147 }
148 148 }
149 - (void) write(master, ibuf, cc);
149 + (void) write(manager, ibuf, cc);
150 150 }
151 151 done();
152 152 }
153 153
154 154 void
155 155 sigwinch()
156 156 {
157 157 struct winsize ws;
158 158
159 159 if (ioctl(0, TIOCGWINSZ, &ws) == 0)
160 - (void) ioctl(master, TIOCSWINSZ, &ws);
160 + (void) ioctl(manager, TIOCSWINSZ, &ws);
161 161 }
162 162
163 163 #include <sys/wait.h>
164 164
165 165 void
166 166 finish()
167 167 {
168 168 int status;
169 169 register int pid;
170 170 register int die = 0;
171 171
172 172 while ((pid = wait(&status)) > 0)
173 173 if (pid == child)
174 174 die = 1;
175 175
176 176 if (die)
177 177 done();
178 178 }
179 179
180 180 void
181 181 dooutput()
182 182 {
|
↓ open down ↓ |
12 lines elided |
↑ open up ↑ |
183 183 time_t tvec;
184 184 char obuf[BUFSIZ];
185 185 char tbuf[BUFSIZ];
186 186 int cc;
187 187
188 188 (void) close(0);
189 189 tvec = time((time_t *)0);
190 190 strftime(tbuf, BUFSIZ, "%c", localtime(&tvec));
191 191 fprintf(fscript, gettext("Script started on %s\n"), tbuf);
192 192 for (;;) {
193 - cc = read(master, obuf, sizeof (obuf));
193 + cc = read(manager, obuf, sizeof (obuf));
194 194 if (cc <= 0)
195 195 break;
196 196 (void) write(1, obuf, cc);
197 197 (void) fwrite(obuf, 1, cc, fscript);
198 198 }
199 199 done();
200 200 }
201 201
202 202 void
203 203 doshell()
204 204 {
205 205
206 206 setpgrp(); /* relinquish control terminal */
207 - getslave();
208 - (void) close(master);
207 + getsubsid();
208 + (void) close(manager);
209 209 (void) fclose(fscript);
210 - (void) dup2(slave, 0);
211 - (void) dup2(slave, 1);
212 - (void) dup2(slave, 2);
213 - (void) close(slave);
210 + (void) dup2(subsid, 0);
211 + (void) dup2(subsid, 1);
212 + (void) dup2(subsid, 2);
213 + (void) close(subsid);
214 214 execl(shell, shell, "-i", (char *)0);
215 215 perror(shell);
216 216 fail();
217 217 }
218 218
219 219 void
220 220 fixtty()
221 221 {
222 222 struct termios sbuf;
223 223
224 224 sbuf = b;
225 225 sbuf.c_iflag &= ~(INLCR|IGNCR|ICRNL|IUCLC|IXON);
226 226 sbuf.c_oflag &= ~OPOST;
227 227 sbuf.c_lflag &= ~(ICANON|ISIG|ECHO);
228 228 sbuf.c_cc[VMIN] = 1;
229 229 sbuf.c_cc[VTIME] = 0;
230 230 (void) ioctl(0, TCSETSF, (char *)&sbuf);
231 231 }
232 232
233 233 void
234 234 fail()
235 235 {
236 236
237 237 (void) kill(0, SIGTERM);
238 238 done();
239 239 }
240 240
241 241 void
|
↓ open down ↓ |
18 lines elided |
↑ open up ↑ |
242 242 done()
243 243 {
244 244 time_t tvec;
245 245 char tbuf[BUFSIZ];
246 246
247 247 if (subchild) {
248 248 tvec = time((time_t *)0);
249 249 strftime(tbuf, BUFSIZ, "%c", localtime(&tvec));
250 250 fprintf(fscript, gettext("\nscript done on %s\n"), tbuf);
251 251 (void) fclose(fscript);
252 - (void) close(master);
252 + (void) close(manager);
253 253 } else {
254 254 (void) ioctl(0, TCSETSW, (char *)&b);
255 255 printf(gettext("Script done, file is %s\n"), fname);
256 256 }
257 257 exit(0);
258 258 }
259 259
260 260 void
261 -getmaster()
261 +getmanager()
262 262 {
263 263 struct stat stb;
264 264
265 - if ((master = open(mptname, O_RDWR)) >= 0) { /* a pseudo-tty is free */
265 + if ((manager = open(mptname, O_RDWR)) >= 0) { /* a pseudo-tty is free */
266 266 (void) ioctl(0, TCGETS, (char *)&b);
267 267 (void) ioctl(0, TIOCGWINSZ, (char *)&size);
268 268 return;
269 269 } else { /* out of pseudo-tty's */
270 270 perror(mptname);
271 271 fprintf(stderr, gettext("Out of pseudo-tty's\n"));
272 272 fail();
273 273 }
274 274 }
275 275
276 276 void
277 -getslave()
277 +getsubsid()
278 278 {
279 - char *slavename; /* name of slave pseudo-tty */
279 + char *subsidname; /* name of subsidiary pseudo-tty */
280 280
281 - grantpt(master); /* change permissions of slave */
282 - unlockpt(master); /* unlock slave */
283 - slavename = ptsname(master); /* get name of slave */
284 - slave = open(slavename, O_RDWR); /* open slave */
285 - if (slave < 0) { /* error on opening slave */
286 - perror(slavename);
281 + grantpt(manager); /* change permissions of subsidiary */
282 + unlockpt(manager); /* unlock subsidiary */
283 + subsidname = ptsname(manager); /* get name of subsidiary */
284 + subsid = open(subsidname, O_RDWR); /* open subsidiary */
285 + if (subsid < 0) { /* error opening subsidiary */
286 + perror(subsidname);
287 287 fail();
288 288 }
289 - ioctl(slave, I_PUSH, "ptem"); /* push pt hw emulation module */
290 - ioctl(slave, I_PUSH, "ldterm"); /* push line discipline */
289 + ioctl(subsid, I_PUSH, "ptem"); /* push pt hw emulation module */
290 + ioctl(subsid, I_PUSH, "ldterm"); /* push line discipline */
291 291
292 - (void) ioctl(slave, TCSETSF, (char *)&b);
293 - (void) ioctl(slave, TIOCSWINSZ, (char *)&size);
292 + (void) ioctl(subsid, TCSETSF, (char *)&b);
293 + (void) ioctl(subsid, TIOCSWINSZ, (char *)&size);
294 294 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX