script.c
author viric@llimona
Sat, 09 Jun 2007 18:01:03 +0200
changeset 0 f7f7567e7bef
permissions -rw-r--r--
Initial import of script.c from util-linux-2.12r (gentoo)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     1
/*
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     2
 * Copyright (c) 1980 Regents of the University of California.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     3
 * All rights reserved.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     4
 *
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     5
 * Redistribution and use in source and binary forms, with or without
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     6
 * modification, are permitted provided that the following conditions
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     7
 * are met:
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     8
 * 1. Redistributions of source code must retain the above copyright
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
     9
 *    notice, this list of conditions and the following disclaimer.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    10
 * 2. Redistributions in binary form must reproduce the above copyright
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    11
 *    notice, this list of conditions and the following disclaimer in the
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    12
 *    documentation and/or other materials provided with the distribution.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    13
 * 3. All advertising materials mentioning features or use of this software
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    14
 *    must display the following acknowledgement:
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    15
 *	This product includes software developed by the University of
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    16
 *	California, Berkeley and its contributors.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    17
 * 4. Neither the name of the University nor the names of its contributors
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    18
 *    may be used to endorse or promote products derived from this software
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    19
 *    without specific prior written permission.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    20
 *
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    21
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    24
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    25
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    26
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    27
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    28
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    29
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    30
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    31
 * SUCH DAMAGE.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    32
 */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    33
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    34
/*
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    35
 * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    36
 * - added Native Language Support
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    37
 *
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    38
 * 2000-07-30 Per Andreas Buer <per@linpro.no> - added "q"-option
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    39
 */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    40
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    41
/*
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    42
 * script
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    43
 */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    44
#include <stdio.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    45
#include <stdlib.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    46
#include <paths.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    47
#include <time.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    48
#include <sys/types.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    49
#include <sys/stat.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    50
#include <termios.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    51
#include <sys/ioctl.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    52
#include <sys/time.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    53
#include <sys/file.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    54
#include <sys/signal.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    55
#include "nls.h"
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    56
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    57
#ifdef __linux__
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    58
#include <unistd.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    59
#include <string.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    60
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    61
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    62
#include "../defines.h"
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    63
#ifdef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    64
#include <pty.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    65
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    66
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    67
void finish(int);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    68
void done(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    69
void fail(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    70
void resize(int);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    71
void fixtty(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    72
void getmaster(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    73
void getslave(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    74
void doinput(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    75
void dooutput(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    76
void doshell(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    77
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    78
char	*shell;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    79
FILE	*fscript;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    80
int	master;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    81
int	slave;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    82
int	child;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    83
int	subchild;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    84
char	*fname;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    85
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    86
struct	termios tt;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    87
struct	winsize win;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    88
int	lb;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    89
int	l;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    90
#ifndef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    91
char	line[] = "/dev/ptyXX";
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    92
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    93
int	aflg = 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    94
char	*cflg = NULL;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    95
int	fflg = 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    96
int	qflg = 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    97
int	tflg = 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    98
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    99
static char *progname;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   100
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   101
static void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   102
die_if_link(char *fn) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   103
	struct stat s;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   104
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   105
	if (lstat(fn, &s) == 0 && (S_ISLNK(s.st_mode) || s.st_nlink > 1)) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   106
		fprintf(stderr,
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   107
			_("Warning: `%s' is a link.\n"
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   108
			  "Use `%s [options] %s' if you really "
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   109
			  "want to use it.\n"
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   110
			  "Script not started.\n"),
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   111
			fn, progname, fn);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   112
		exit(1);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   113
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   114
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   115
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   116
/*
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   117
 * script -t prints time delays as floating point numbers
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   118
 * The example program (scriptreplay) that we provide to handle this
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   119
 * timing output is a perl script, and does not handle numbers in
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   120
 * locale format (not even when "use locale;" is added).
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   121
 * So, since these numbers are not for human consumption, it seems
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   122
 * easiest to set LC_NUMERIC here.
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   123
 */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   124
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   125
int
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   126
main(int argc, char **argv) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   127
	extern int optind;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   128
	char *p;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   129
	int ch;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   130
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   131
	progname = argv[0];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   132
	if ((p = strrchr(progname, '/')) != NULL)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   133
		progname = p+1;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   134
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   135
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   136
	setlocale(LC_ALL, "");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   137
	setlocale(LC_NUMERIC, "C");	/* see comment above */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   138
	bindtextdomain(PACKAGE, LOCALEDIR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   139
	textdomain(PACKAGE);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   140
	
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   141
	if (argc == 2) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   142
		if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   143
			printf(_("%s from %s\n"),
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   144
			       progname, util_linux_version);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   145
			return 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   146
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   147
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   148
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   149
	while ((ch = getopt(argc, argv, "ac:fqt")) != -1)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   150
		switch((char)ch) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   151
		case 'a':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   152
			aflg++;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   153
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   154
		case 'c':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   155
			cflg = optarg;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   156
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   157
		case 'f':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   158
			fflg++;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   159
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   160
		case 'q':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   161
			qflg++;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   162
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   163
		case 't':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   164
			tflg++;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   165
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   166
		case '?':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   167
		default:
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   168
			fprintf(stderr,
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   169
				_("usage: script [-a] [-f] [-q] [-t] [file]\n"));
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   170
			exit(1);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   171
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   172
	argc -= optind;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   173
	argv += optind;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   174
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   175
	if (argc > 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   176
		fname = argv[0];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   177
	else {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   178
		fname = "typescript";
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   179
		die_if_link(fname);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   180
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   181
	if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   182
		perror(fname);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   183
		fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   184
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   185
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   186
	shell = getenv("SHELL");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   187
	if (shell == NULL)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   188
		shell = _PATH_BSHELL;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   189
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   190
	getmaster();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   191
	if (!qflg)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   192
		printf(_("Script started, file is %s\n"), fname);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   193
	fixtty();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   194
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   195
	(void) signal(SIGCHLD, finish);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   196
	child = fork();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   197
	if (child < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   198
		perror("fork");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   199
		fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   200
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   201
	if (child == 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   202
		subchild = child = fork();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   203
		if (child < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   204
			perror("fork");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   205
			fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   206
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   207
		if (child)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   208
			dooutput();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   209
		else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   210
			doshell();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   211
	} else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   212
		(void) signal(SIGWINCH, resize);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   213
	doinput();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   214
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   215
	return 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   216
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   217
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   218
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   219
doinput() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   220
	register int cc;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   221
	char ibuf[BUFSIZ];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   222
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   223
	(void) fclose(fscript);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   224
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   225
	while ((cc = read(0, ibuf, BUFSIZ)) > 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   226
		(void) write(master, ibuf, cc);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   227
	done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   228
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   229
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   230
#include <sys/wait.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   231
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   232
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   233
finish(int dummy) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   234
	int status;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   235
	register int pid;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   236
	register int die = 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   237
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   238
	while ((pid = wait3(&status, WNOHANG, 0)) > 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   239
		if (pid == child)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   240
			die = 1;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   241
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   242
	if (die)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   243
		done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   244
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   245
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   246
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   247
resize(int dummy) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   248
	/* transmit window change information to the child */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   249
	(void) ioctl(0, TIOCGWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   250
	(void) ioctl(slave, TIOCSWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   251
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   252
	kill(child, SIGWINCH);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   253
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   254
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   255
/*
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   256
 * Stop extremely silly gcc complaint on %c:
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   257
 *  warning: `%c' yields only last 2 digits of year in some locales
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   258
 */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   259
static void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   260
my_strftime(char *buf, size_t len, const char *fmt, const struct tm *tm) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   261
	strftime(buf, len, fmt, tm);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   262
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   263
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   264
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   265
dooutput() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   266
	register int cc;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   267
	time_t tvec;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   268
	char obuf[BUFSIZ];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   269
	struct timeval tv;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   270
	double oldtime=time(NULL), newtime;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   271
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   272
	(void) close(0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   273
#ifdef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   274
	(void) close(slave);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   275
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   276
	tvec = time((time_t *)NULL);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   277
	my_strftime(obuf, sizeof obuf, "%c\n", localtime(&tvec));
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   278
	fprintf(fscript, _("Script started on %s"), obuf);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   279
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   280
	for (;;) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   281
		if (tflg)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   282
			gettimeofday(&tv, NULL);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   283
		cc = read(master, obuf, sizeof (obuf));
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   284
		if (cc <= 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   285
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   286
		if (tflg) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   287
			newtime = tv.tv_sec + (double) tv.tv_usec / 1000000;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   288
			fprintf(stderr, "%f %i\n", newtime - oldtime, cc);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   289
			oldtime = newtime;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   290
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   291
		(void) write(1, obuf, cc);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   292
		(void) fwrite(obuf, 1, cc, fscript);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   293
		if (fflg)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   294
			(void) fflush(fscript);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   295
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   296
	done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   297
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   298
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   299
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   300
doshell() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   301
	char *shname;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   302
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   303
#if 0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   304
	int t;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   305
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   306
	t = open(_PATH_TTY, O_RDWR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   307
	if (t >= 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   308
		(void) ioctl(t, TIOCNOTTY, (char *)0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   309
		(void) close(t);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   310
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   311
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   312
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   313
	getslave();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   314
	(void) close(master);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   315
	(void) fclose(fscript);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   316
	(void) dup2(slave, 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   317
	(void) dup2(slave, 1);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   318
	(void) dup2(slave, 2);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   319
	(void) close(slave);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   320
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   321
	shname = strrchr(shell, '/');
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   322
	if (shname)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   323
		shname++;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   324
	else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   325
		shname = shell;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   326
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   327
	if (cflg)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   328
		execl(shell, shname, "-c", cflg, 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   329
	else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   330
		execl(shell, shname, "-i", 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   331
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   332
	perror(shell);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   333
	fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   334
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   335
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   336
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   337
fixtty() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   338
	struct termios rtt;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   339
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   340
	rtt = tt;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   341
	cfmakeraw(&rtt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   342
	rtt.c_lflag &= ~ECHO;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   343
	(void) tcsetattr(0, TCSAFLUSH, &rtt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   344
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   345
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   346
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   347
fail() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   348
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   349
	(void) kill(0, SIGTERM);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   350
	done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   351
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   352
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   353
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   354
done() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   355
	time_t tvec;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   356
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   357
	if (subchild) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   358
		if (!qflg) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   359
			char buf[BUFSIZ];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   360
			tvec = time((time_t *)NULL);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   361
			my_strftime(buf, sizeof buf, "%c\n", localtime(&tvec));
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   362
			fprintf(fscript, _("\nScript done on %s"), buf);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   363
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   364
		(void) fclose(fscript);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   365
		(void) close(master);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   366
	} else {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   367
		(void) tcsetattr(0, TCSAFLUSH, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   368
		if (!qflg)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   369
			printf(_("Script done, file is %s\n"), fname);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   370
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   371
	exit(0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   372
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   373
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   374
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   375
getmaster() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   376
#ifdef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   377
	(void) tcgetattr(0, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   378
	(void) ioctl(0, TIOCGWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   379
	if (openpty(&master, &slave, NULL, &tt, &win) < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   380
		fprintf(stderr, _("openpty failed\n"));
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   381
		fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   382
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   383
#else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   384
	char *pty, *bank, *cp;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   385
	struct stat stb;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   386
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   387
	pty = &line[strlen("/dev/ptyp")];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   388
	for (bank = "pqrs"; *bank; bank++) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   389
		line[strlen("/dev/pty")] = *bank;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   390
		*pty = '0';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   391
		if (stat(line, &stb) < 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   392
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   393
		for (cp = "0123456789abcdef"; *cp; cp++) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   394
			*pty = *cp;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   395
			master = open(line, O_RDWR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   396
			if (master >= 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   397
				char *tp = &line[strlen("/dev/")];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   398
				int ok;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   399
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   400
				/* verify slave side is usable */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   401
				*tp = 't';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   402
				ok = access(line, R_OK|W_OK) == 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   403
				*tp = 'p';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   404
				if (ok) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   405
					(void) tcgetattr(0, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   406
				    	(void) ioctl(0, TIOCGWINSZ, 
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   407
						(char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   408
					return;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   409
				}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   410
				(void) close(master);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   411
			}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   412
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   413
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   414
	fprintf(stderr, _("Out of pty's\n"));
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   415
	fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   416
#endif /* not HAVE_openpty */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   417
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   418
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   419
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   420
getslave() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   421
#ifndef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   422
	line[strlen("/dev/")] = 't';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   423
	slave = open(line, O_RDWR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   424
	if (slave < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   425
		perror(line);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   426
		fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   427
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   428
	(void) tcsetattr(slave, TCSAFLUSH, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   429
	(void) ioctl(slave, TIOCSWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   430
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   431
	(void) setsid();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   432
	(void) ioctl(slave, TIOCSCTTY, 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   433
}