]>
git.saurik.com Git - apple/shell_cmds.git/blob - script/script.c
1 /* $NetBSD: script.c,v 1.6 1998/04/02 11:08:34 kleink Exp $ */
4 * Copyright (c) 1980, 1992, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/cdefs.h>
38 __COPYRIGHT("@(#) Copyright (c) 1980, 1992, 1993\n\
39 The Regents of the University of California. All rights reserved.\n");
44 static char sccsid
[] = "@(#)script.c 8.1 (Berkeley) 6/6/93";
46 __RCSID("$NetBSD: script.c,v 1.6 1998/04/02 11:08:34 kleink Exp $");
49 #include <sys/types.h>
52 #include <sys/ioctl.h>
77 void done
__P((void));
78 void dooutput
__P((void));
79 void doshell
__P((void));
80 void fail
__P((void));
81 void finish
__P((int));
82 int main
__P((int, char **));
83 void scriptflush
__P((int));
97 while ((ch
= getopt(argc
, argv
, "a")) != -1)
104 (void)fprintf(stderr
, "usage: script [-a] [file]\n");
113 fname
= "typescript";
115 if ((fscript
= fopen(fname
, aflg
? "a" : "w")) == NULL
)
116 err(1, "fopen %s", fname
);
118 (void)tcgetattr(STDIN_FILENO
, &tt
);
119 (void)ioctl(STDIN_FILENO
, TIOCGWINSZ
, &win
);
120 if (openpty(&master
, &slave
, NULL
, &tt
, &win
) == -1)
123 (void)printf("Script started, output file is %s\n", fname
);
126 rtt
.c_lflag
&= ~ECHO
;
127 (void)tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &rtt
);
129 (void)signal(SIGCHLD
, finish
);
136 subchild
= child
= fork();
147 (void)fclose(fscript
);
148 while ((cc
= read(STDIN_FILENO
, ibuf
, BUFSIZ
)) > 0)
149 (void)write(master
, ibuf
, cc
);
163 while ((pid
= wait3((int *)&status
, WNOHANG
, 0)) > 0)
174 struct itimerval value
;
179 (void)close(STDIN_FILENO
);
181 (void)fprintf(fscript
, "Script started on %s", ctime(&tvec
));
183 (void)signal(SIGALRM
, scriptflush
);
184 value
.it_interval
.tv_sec
= SECSPERMIN
/ 2;
185 value
.it_interval
.tv_usec
= 0;
186 value
.it_value
= value
.it_interval
;
187 (void)setitimer(ITIMER_REAL
, &value
, NULL
);
189 cc
= read(master
, obuf
, sizeof (obuf
));
192 (void)write(1, obuf
, cc
);
193 (void)fwrite(obuf
, 1, cc
, fscript
);
204 (void)fflush(fscript
);
214 shell
= getenv("SHELL");
216 shell
= _PATH_BSHELL
;
219 (void)fclose(fscript
);
221 execl(shell
, shell
, "-i", NULL
);
222 warn("execl %s", shell
);
230 (void)kill(0, SIGTERM
);
241 (void)fprintf(fscript
,"\nScript done on %s", ctime(&tvec
));
242 (void)fclose(fscript
);
245 (void)tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &tt
);
246 (void)printf("Script done, output file is %s\n", fname
);