* Copyright (c) 1980, 1992, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char copyright
[] =
"@(#) Copyright (c) 1980, 1992, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)script.c 8.1 (Berkeley) 6/6/93";
__dead
void done
__P((void));
void dooutput
__P((void));
void doshell
__P((void));
void err
__P((const char *, ...));
void scriptflush
__P((int));
while ((ch
= getopt(argc
, argv
, "a")) != EOF
)
(void)fprintf(stderr
, "usage: script [-a] [file]\n");
if ((fscript
= fopen(fname
, aflg
? "a" : "w")) == NULL
)
err("%s: %s", fname
, strerror(errno
));
(void)tcgetattr(STDIN_FILENO
, &tt
);
(void)ioctl(STDIN_FILENO
, TIOCGWINSZ
, &win
);
if (openpty(&master
, &slave
, NULL
, &tt
, &win
) == -1)
err("openpty: %s", strerror(errno
));
(void)printf("Script started, output file is %s\n", fname
);
(void)tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &rtt
);
(void)signal(SIGCHLD
, finish
);
subchild
= child
= fork();
while ((cc
= read(STDIN_FILENO
, ibuf
, BUFSIZ
)) > 0)
(void)write(master
, ibuf
, cc
);
while ((pid
= wait3((int *)&status
, WNOHANG
, 0)) > 0)
(void)close(STDIN_FILENO
);
(void)fprintf(fscript
, "Script started on %s", ctime(&tvec
));
(void)signal(SIGALRM
, scriptflush
);
value
.it_interval
.tv_sec
= SECSPERMIN
/ 2;
value
.it_interval
.tv_usec
= 0;
value
.it_value
= value
.it_interval
;
(void)setitimer(ITIMER_REAL
, &value
, NULL
);
cc
= read(master
, obuf
, sizeof (obuf
));
(void)write(1, obuf
, cc
);
(void)fwrite(obuf
, 1, cc
, fscript
);
execl(shell
, "sh", "-i", NULL
);
(void)fprintf(fscript
,"\nScript done on %s", ctime(&tvec
));
(void)tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &tt
);
(void)printf("Script done, output file is %s\n", fname
);
err(const char *fmt
, ...)
(void)fprintf(stderr
, "script: ");
(void)vfprintf(stderr
, fmt
, ap
);
(void)fprintf(stderr
, "\n");