tcpscript.c
author lbatlle@npdl268.bpo.hp.com
Thu, 09 Aug 2007 16:32:38 +0200
changeset 13 e282978c28b9
parent 12 dc26a5985758
child 14 9d33b442d12c
permissions -rw-r--r--
Added tag v0.2 for changeset dc26a5985758f6817abbfa35c0b34e4a39f4728c
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
/*
6
07f184944f3f Version 0.1
viric@llimona
parents: 5
diff changeset
    42
 * tcpscript - Modified from 'script' - 2007 Lluis Batlle i Rossell
0
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 <sys/types.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    47
#include <sys/stat.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    48
#include <termios.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    49
#include <sys/ioctl.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    50
#include <sys/time.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    51
#include <sys/signal.h>
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    52
#include <sys/socket.h>
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    53
#include <netinet/in.h>
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    54
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    55
#ifdef __linux__
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    56
#include <unistd.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    57
#include <string.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    58
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    59
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    60
#define HAVE_openpty
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    61
#define _PATH_BSHELL "/bin/sh"
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    62
#ifdef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    63
#include <pty.h>
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    64
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    65
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    66
void finish(int);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    67
void done(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    68
void fail(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    69
void resize(int);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    70
void fixtty(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    71
void getmaster(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    72
void getslave(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    73
void doinput(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    74
void dooutput(void);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    75
void doshell(void);
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
    76
void resize_clients(void);
0
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
int	master;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    80
int	slave;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    81
int	child;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    82
int	subchild;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    83
char	*fname;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    84
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    85
struct	termios tt;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    86
struct	winsize win;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    87
int	lb;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    88
int	l;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    89
#ifndef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    90
char	line[] = "/dev/ptyXX";
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    91
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    92
char	*cflg = NULL;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
    93
int	qflg = 0;
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    94
int	tcp_port = 4000;
3
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
    95
int	limit_conns = 1;
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    96
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    97
enum {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    98
    MAXCONNS = 10
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
    99
};
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   100
static int accept_socket;
12
dc26a5985758 Changed version number
lbatlle@npdl268.bpo.hp.com
parents: 11
diff changeset
   101
const char version[] = "0.2";
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   102
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   103
int conns[MAXCONNS];
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   104
int nconns = 0;
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   105
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   106
static char *progname;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   107
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   108
static void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   109
die_if_link(char *fn) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   110
	struct stat s;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   111
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   112
	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
   113
		fprintf(stderr,
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   114
			"Warning: `%s' is a link.\n"
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   115
			  "Use `%s [options] %s' if you really "
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   116
			  "want to use it.\n"
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   117
			  "Script not started.\n",
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   118
			fn, progname, fn);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   119
		exit(1);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   120
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   121
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   122
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
 * 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
   125
 * 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
   126
 * 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
   127
 * 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
   128
 * 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
   129
 * easiest to set LC_NUMERIC here.
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
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   132
int
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   133
main(int argc, char **argv) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   134
	extern int optind;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   135
	char *p;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   136
	int ch;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   137
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   138
	progname = argv[0];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   139
	if ((p = strrchr(progname, '/')) != NULL)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   140
		progname = p+1;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   141
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   142
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   143
	if (argc == 2) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   144
		if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) {
6
07f184944f3f Version 0.1
viric@llimona
parents: 5
diff changeset
   145
			printf("%s %s, modification of 'script' by %s\n",
07f184944f3f Version 0.1
viric@llimona
parents: 5
diff changeset
   146
			       progname, version,
07f184944f3f Version 0.1
viric@llimona
parents: 5
diff changeset
   147
                   "Lluis Batlle i Rossell 2007");
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   148
			return 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   149
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   150
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   151
3
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   152
	while ((ch = getopt(argc, argv, "c:qp:l:")) != -1)
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   153
		switch((char)ch) {
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;
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   157
		case 'p':
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   158
			tcp_port = atoi(optarg);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   159
			break;
3
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   160
		case 'l':
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   161
			limit_conns = atoi(optarg);
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   162
			break;
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   163
		case 'q':
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   164
			qflg++;
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,
9
3be85141e3eb Changed the command name in -h
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   169
				"usage: tcpscript [-l nconns] [-p port] [-q] [-t] \n");
0
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
	shell = getenv("SHELL");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   176
	if (shell == NULL)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   177
		shell = _PATH_BSHELL;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   178
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   179
	getmaster();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   180
	fixtty();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   181
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   182
    accept_socket = listen_tcp();
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   183
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   184
	(void) signal(SIGCHLD, finish);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   185
	child = fork();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   186
	if (child < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   187
		perror("fork");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   188
		fail();
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
	if (child == 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   191
		subchild = child = fork();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   192
		if (child < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   193
			perror("fork");
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   194
			fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   195
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   196
		if (child)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   197
			dooutput();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   198
		else
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   199
        {
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   200
            close(accept_socket);
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   201
			doshell();
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   202
        }
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   203
	} else
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   204
    {
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   205
        close(accept_socket);
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   206
		(void) signal(SIGWINCH, resize);
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   207
    }
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   208
	doinput();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   209
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   210
	return 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   211
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   212
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   213
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   214
doinput() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   215
	register int cc;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   216
	char ibuf[BUFSIZ];
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
	while ((cc = read(0, ibuf, BUFSIZ)) > 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   219
		(void) write(master, ibuf, cc);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   220
	done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   221
}
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
#include <sys/wait.h>
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
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   226
finish(int dummy) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   227
	int status;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   228
	register int pid;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   229
	register int die = 0;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   230
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   231
	while ((pid = wait3(&status, WNOHANG, 0)) > 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   232
		if (pid == child)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   233
			die = 1;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   234
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   235
	if (die)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   236
		done();
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
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   239
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   240
resize(int dummy) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   241
	/* transmit window change information to the child */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   242
	(void) ioctl(0, TIOCGWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   243
	(void) ioctl(slave, TIOCSWINSZ, (char *)&win);
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
	kill(child, SIGWINCH);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   246
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   247
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   248
void fatal()
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   249
{
5
470463cba5cf Better handling of listen_tcp errors.
viric@llimona
parents: 3
diff changeset
   250
    done();
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   251
    exit(-1);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   252
}
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   253
3
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   254
int set_reusable(int s)
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   255
{
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   256
    int boolean = 1;
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   257
    int res;
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   258
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   259
    res = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &boolean, sizeof(boolean));
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   260
    if (res != 0)
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   261
        perror("Setsockopt REUSE failed"), fatal();
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   262
}
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   263
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   264
void sig_resize_clients(int x)
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   265
{
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   266
  resize_clients();
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   267
}
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   268
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   269
void resize_clients()
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   270
{
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   271
  int rows, cols;
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   272
  char tmp[100];
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   273
  int i;
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   274
  int len;
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   275
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   276
  /* Get rows and cols from our connection to the terminal: fd 1 */
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   277
	(void) ioctl(0, TIOCGWINSZ, (char *)&win);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   278
  rows = win.ws_row;
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   279
  cols = win.ws_col;
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   280
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   281
  /* Prepare the xterm resize string */
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   282
  snprintf(tmp, 100, "\033[8;%i;%it\n", rows, cols, rows, cols);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   283
  len = strlen(tmp);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   284
  for (i = 0; i < nconns; ++i)
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   285
  {
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   286
    send(conns[i], tmp, len, 0);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   287
  }
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   288
}
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   289
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   290
void send_noecho(int fd)
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   291
{
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   292
  char seq[] = { 255 /*IAC*/, 251 /*WILL*/, 1 /*ECHO*/ };
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   293
  send(fd, seq, sizeof seq, 0);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   294
}
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   295
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   296
int listen_tcp()
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   297
{
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   298
    int s;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   299
    struct sockaddr_in addr;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   300
    int res;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   301
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   302
    s = socket(PF_INET, SOCK_STREAM, 0);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   303
    if (s == -1)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   304
        perror("Failed socket()"), fatal();
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   305
3
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   306
    set_reusable(s);
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   307
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   308
    addr.sin_family = AF_INET;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   309
    addr.sin_port = htons(tcp_port);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   310
    addr.sin_addr.s_addr = INADDR_ANY;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   311
    res = bind(s, (struct sockaddr *) &addr, sizeof(addr));
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   312
    if (res != 0)
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   313
        perror("Failed bind()"), fatal();
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   314
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   315
    res = listen(s, 1);
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   316
    if (res != 0)
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   317
        perror("Failed listen()"), fatal();
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   318
2
f08014d5d89f Fixed 'help' and opts.
viric@llimona
parents: 1
diff changeset
   319
    if (!qflg)
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   320
        printf("Listening on port %i\r\n", tcp_port);
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   321
    return s;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   322
}
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   323
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   324
void remove_element(int index, int *array, int total)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   325
{
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   326
    int i;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   327
    for (i = index; i < (total - 1); ++i)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   328
        array[i] = array[i+1];
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   329
}
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   330
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   331
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   332
dooutput() {
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   333
	int cc;
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   334
	char obuf[BUFSIZ];
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   335
    int accept_socket;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   336
    int i;
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   337
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   338
/*	(void) close(0); lets use it in resize*/
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   339
#ifdef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   340
	(void) close(slave);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   341
#endif
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   342
    fd_set read_set;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   343
    fd_set should_read_set;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   344
    fd_set tcp_set;
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   345
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   346
    FD_ZERO(&should_read_set);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   347
    FD_SET(accept_socket, &should_read_set);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   348
    FD_SET(master, &should_read_set);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   349
    nconns = 0;
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   350
		(void) signal(SIGWINCH, sig_resize_clients);
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   351
	for (;;) {
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   352
        int max;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   353
        read_set = should_read_set;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   354
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   355
        /* Calculate max fd */
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   356
        max = accept_socket;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   357
        if (master > max)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   358
            max = master;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   359
        for (i = 0; i < nconns; ++i)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   360
            if (conns[i] > max)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   361
                max = conns[i];
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   362
        
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   363
        i = select(max + 1, &read_set, 0, 0, 0);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   364
        if (i == -1)
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   365
          continue;
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   366
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   367
        if (FD_ISSET(master, &read_set))
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   368
        {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   369
            cc = read(master, obuf, sizeof (obuf));
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   370
            if (cc <= 0)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   371
                break;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   372
            /* Write to the terminal output */
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   373
            (void) write(1, obuf, cc);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   374
            /* Broadcast messages */
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   375
            for (i = 0; i < nconns; ++i)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   376
                (void) write(conns[i], obuf, cc);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   377
        }
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   378
        for (i = 0; i < nconns; ++i)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   379
        {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   380
            if (FD_ISSET(conns[i], &read_set))
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   381
            {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   382
                int size;
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   383
                size = recv(conns[i], obuf, sizeof(obuf), 0);
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   384
                if (size == 0)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   385
                {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   386
                    close(conns[i]);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   387
                    FD_CLR(conns[i], &should_read_set);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   388
                    remove_element(i, conns, nconns);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   389
                    nconns--;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   390
                }
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   391
            }
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   392
        }
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   393
        if (FD_ISSET(accept_socket, &read_set))
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   394
        {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   395
            int s;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   396
            s = accept(accept_socket, 0, 0);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   397
            if (s == -1)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   398
            {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   399
                perror("accept() failed");
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   400
                break;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   401
            }
3
01ec0b3b1135 Adding socket reusability.
viric@llimona
parents: 2
diff changeset
   402
            if (nconns < (MAXCONNS - 1) && nconns < limit_conns)
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   403
            {
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   404
                FD_SET(s, &should_read_set);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   405
                conns[nconns] = s;
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   406
                nconns++;
10
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   407
                send_noecho(s);
c3156fd18d14 Added xterm resize strings and nulifies echo on telnet clients.
lbatlle@npdl268.bpo.hp.com
parents: 9
diff changeset
   408
                resize_clients();
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   409
            } else
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   410
                close(s);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   411
        }
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   412
	}
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   413
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   414
    close(accept_socket);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   415
    for (i = 0; i < nconns; ++i)
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   416
        close(conns[i]);
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   417
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   418
	done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   419
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   420
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   421
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   422
doshell() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   423
	char *shname;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   424
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   425
#if 0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   426
	int t;
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
	t = open(_PATH_TTY, O_RDWR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   429
	if (t >= 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   430
		(void) ioctl(t, TIOCNOTTY, (char *)0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   431
		(void) close(t);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   432
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   433
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   434
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   435
	getslave();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   436
	(void) close(master);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   437
	(void) dup2(slave, 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   438
	(void) dup2(slave, 1);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   439
	(void) dup2(slave, 2);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   440
	(void) close(slave);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   441
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   442
	shname = strrchr(shell, '/');
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   443
	if (shname)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   444
		shname++;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   445
	else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   446
		shname = shell;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   447
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   448
	if (cflg)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   449
		execl(shell, shname, "-c", cflg, 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   450
	else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   451
		execl(shell, shname, "-i", 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   452
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   453
	perror(shell);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   454
	fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   455
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   456
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   457
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   458
fixtty() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   459
	struct termios rtt;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   460
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   461
	rtt = tt;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   462
	cfmakeraw(&rtt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   463
	rtt.c_lflag &= ~ECHO;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   464
	(void) tcsetattr(0, TCSAFLUSH, &rtt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   465
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   466
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   467
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   468
fail() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   469
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   470
	(void) kill(0, SIGTERM);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   471
	done();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   472
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   473
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   474
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   475
done() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   476
	time_t tvec;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   477
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   478
	if (subchild) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   479
		(void) close(master);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   480
	} else {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   481
		(void) tcsetattr(0, TCSAFLUSH, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   482
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   483
	exit(0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   484
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   485
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   486
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   487
getmaster() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   488
#ifdef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   489
	(void) tcgetattr(0, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   490
	(void) ioctl(0, TIOCGWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   491
	if (openpty(&master, &slave, NULL, &tt, &win) < 0) {
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   492
		fprintf(stderr, "openpty failed\n");
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   493
		fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   494
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   495
#else
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   496
	char *pty, *bank, *cp;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   497
	struct stat stb;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   498
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   499
	pty = &line[strlen("/dev/ptyp")];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   500
	for (bank = "pqrs"; *bank; bank++) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   501
		line[strlen("/dev/pty")] = *bank;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   502
		*pty = '0';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   503
		if (stat(line, &stb) < 0)
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   504
			break;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   505
		for (cp = "0123456789abcdef"; *cp; cp++) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   506
			*pty = *cp;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   507
			master = open(line, O_RDWR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   508
			if (master >= 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   509
				char *tp = &line[strlen("/dev/")];
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   510
				int ok;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   511
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   512
				/* verify slave side is usable */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   513
				*tp = 't';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   514
				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
   515
				*tp = 'p';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   516
				if (ok) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   517
					(void) tcgetattr(0, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   518
				    	(void) ioctl(0, TIOCGWINSZ, 
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   519
						(char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   520
					return;
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   521
				}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   522
				(void) close(master);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   523
			}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   524
		}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   525
	}
1
942500ee5032 Added IPv4 tcp server
viric@llimona
parents: 0
diff changeset
   526
	fprintf(stderr, "Out of pty's\n");
0
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   527
	fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   528
#endif /* not HAVE_openpty */
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   529
}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   530
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   531
void
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   532
getslave() {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   533
#ifndef HAVE_openpty
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   534
	line[strlen("/dev/")] = 't';
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   535
	slave = open(line, O_RDWR);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   536
	if (slave < 0) {
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   537
		perror(line);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   538
		fail();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   539
	}
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   540
	(void) tcsetattr(slave, TCSAFLUSH, &tt);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   541
	(void) ioctl(slave, TIOCSWINSZ, (char *)&win);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   542
#endif
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   543
	(void) setsid();
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   544
	(void) ioctl(slave, TIOCSCTTY, 0);
f7f7567e7bef Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff changeset
   545
}