annotate usr/src/cmd/script/script.c @ 14050:0c8d9998d589

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