author | viric@llimona |
Wed, 04 Jul 2007 21:16:53 +0200 | |
changeset 7 | 6102b11bac49 |
parent 6 | 07f184944f3f |
child 11 | 53b2466f1c2f |
permissions | -rw-r--r-- |
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 | 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 | 52 |
#include <sys/socket.h> |
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 | 60 |
#define HAVE_openpty |
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); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
76 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
77 |
char *shell; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
78 |
int master; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
79 |
int slave; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
80 |
int child; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
81 |
int subchild; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
82 |
char *fname; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
83 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
84 |
struct termios tt; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
85 |
struct winsize win; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
86 |
int lb; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
87 |
int l; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
88 |
#ifndef HAVE_openpty |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
89 |
char line[] = "/dev/ptyXX"; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
90 |
#endif |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
91 |
char *cflg = NULL; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
92 |
int qflg = 0; |
1 | 93 |
int tcp_port = 4000; |
3 | 94 |
int limit_conns = 1; |
1 | 95 |
|
96 |
enum { |
|
97 |
MAXCONNS = 10 |
|
98 |
}; |
|
5 | 99 |
static int accept_socket; |
6 | 100 |
const char version[] = "0.1"; |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
101 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
102 |
static char *progname; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
103 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
104 |
static void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
105 |
die_if_link(char *fn) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
106 |
struct stat s; |
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 |
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
|
109 |
fprintf(stderr, |
1 | 110 |
"Warning: `%s' is a link.\n" |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
111 |
"Use `%s [options] %s' if you really " |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
112 |
"want to use it.\n" |
1 | 113 |
"Script not started.\n", |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
114 |
fn, progname, fn); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
115 |
exit(1); |
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 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
118 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
119 |
/* |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
120 |
* 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
|
121 |
* 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
|
122 |
* 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
|
123 |
* 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
|
124 |
* 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
|
125 |
* easiest to set LC_NUMERIC here. |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
126 |
*/ |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
127 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
128 |
int |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
129 |
main(int argc, char **argv) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
130 |
extern int optind; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
131 |
char *p; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
132 |
int ch; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
133 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
134 |
progname = argv[0]; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
135 |
if ((p = strrchr(progname, '/')) != NULL) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
136 |
progname = p+1; |
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 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
139 |
if (argc == 2) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
140 |
if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) { |
6 | 141 |
printf("%s %s, modification of 'script' by %s\n", |
142 |
progname, version, |
|
143 |
"Lluis Batlle i Rossell 2007"); |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
144 |
return 0; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
145 |
} |
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 |
|
3 | 148 |
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
|
149 |
switch((char)ch) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
150 |
case 'c': |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
151 |
cflg = optarg; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
152 |
break; |
1 | 153 |
case 'p': |
154 |
tcp_port = atoi(optarg); |
|
155 |
break; |
|
3 | 156 |
case 'l': |
157 |
limit_conns = atoi(optarg); |
|
158 |
break; |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
159 |
case 'q': |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
160 |
qflg++; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
161 |
break; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
162 |
case '?': |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
163 |
default: |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
164 |
fprintf(stderr, |
7 | 165 |
"usage: script [-l maxconns] [-p port] [-q] [-t] \n"); |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
166 |
exit(1); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
167 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
168 |
argc -= optind; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
169 |
argv += optind; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
170 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
171 |
shell = getenv("SHELL"); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
172 |
if (shell == NULL) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
173 |
shell = _PATH_BSHELL; |
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 |
getmaster(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
176 |
fixtty(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
177 |
|
5 | 178 |
accept_socket = listen_tcp(); |
179 |
||
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
180 |
(void) signal(SIGCHLD, finish); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
181 |
child = fork(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
182 |
if (child < 0) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
183 |
perror("fork"); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
184 |
fail(); |
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 |
if (child == 0) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
187 |
subchild = child = fork(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
188 |
if (child < 0) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
189 |
perror("fork"); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
190 |
fail(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
191 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
192 |
if (child) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
193 |
dooutput(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
194 |
else |
5 | 195 |
{ |
196 |
close(accept_socket); |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
197 |
doshell(); |
5 | 198 |
} |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
199 |
} else |
5 | 200 |
{ |
201 |
close(accept_socket); |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
202 |
(void) signal(SIGWINCH, resize); |
5 | 203 |
} |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
204 |
doinput(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
205 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
206 |
return 0; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
207 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
208 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
209 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
210 |
doinput() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
211 |
register int cc; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
212 |
char ibuf[BUFSIZ]; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
213 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
214 |
while ((cc = read(0, ibuf, BUFSIZ)) > 0) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
215 |
(void) write(master, ibuf, cc); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
216 |
done(); |
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 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
219 |
#include <sys/wait.h> |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
220 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
221 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
222 |
finish(int dummy) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
223 |
int status; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
224 |
register int pid; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
225 |
register int die = 0; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
226 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
227 |
while ((pid = wait3(&status, WNOHANG, 0)) > 0) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
228 |
if (pid == child) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
229 |
die = 1; |
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 |
if (die) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
232 |
done(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
233 |
} |
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 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
236 |
resize(int dummy) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
237 |
/* transmit window change information to the child */ |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
238 |
(void) ioctl(0, TIOCGWINSZ, (char *)&win); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
239 |
(void) ioctl(slave, TIOCSWINSZ, (char *)&win); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
240 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
241 |
kill(child, SIGWINCH); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
242 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
243 |
|
1 | 244 |
void fatal() |
245 |
{ |
|
5 | 246 |
done(); |
1 | 247 |
exit(-1); |
248 |
} |
|
249 |
||
3 | 250 |
int set_reusable(int s) |
251 |
{ |
|
252 |
int boolean = 1; |
|
253 |
int res; |
|
254 |
||
255 |
res = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &boolean, sizeof(boolean)); |
|
256 |
if (res != 0) |
|
257 |
perror("Setsockopt REUSE failed"), fatal(); |
|
258 |
} |
|
259 |
||
1 | 260 |
int listen_tcp() |
261 |
{ |
|
262 |
int s; |
|
263 |
struct sockaddr_in addr; |
|
264 |
int res; |
|
265 |
||
266 |
s = socket(PF_INET, SOCK_STREAM, 0); |
|
267 |
if (s == -1) |
|
268 |
perror("Failed socket()"), fatal(); |
|
269 |
||
3 | 270 |
set_reusable(s); |
271 |
||
1 | 272 |
addr.sin_family = AF_INET; |
273 |
addr.sin_port = htons(tcp_port); |
|
274 |
addr.sin_addr.s_addr = INADDR_ANY; |
|
275 |
res = bind(s, (struct sockaddr *) &addr, sizeof(addr)); |
|
276 |
if (s != 0) |
|
277 |
perror("Failed bind()"), fatal(); |
|
278 |
||
279 |
res = listen(s, 1); |
|
280 |
if (s != 0) |
|
281 |
perror("Failed listen()"), fatal(); |
|
282 |
||
2 | 283 |
if (!qflg) |
284 |
printf("Listening on port %i\n", tcp_port); |
|
1 | 285 |
return s; |
286 |
} |
|
287 |
||
288 |
void remove_element(int index, int *array, int total) |
|
289 |
{ |
|
290 |
int i; |
|
291 |
for (i = index; i < (total - 1); ++i) |
|
292 |
array[i] = array[i+1]; |
|
293 |
} |
|
294 |
||
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
295 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
296 |
dooutput() { |
1 | 297 |
int cc; |
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
298 |
char obuf[BUFSIZ]; |
1 | 299 |
int conns[MAXCONNS]; |
300 |
int nconns; |
|
301 |
int i; |
|
0
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 |
(void) close(0); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
304 |
#ifdef HAVE_openpty |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
305 |
(void) close(slave); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
306 |
#endif |
1 | 307 |
fd_set read_set; |
308 |
fd_set should_read_set; |
|
309 |
fd_set tcp_set; |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
310 |
|
1 | 311 |
FD_ZERO(&should_read_set); |
312 |
FD_SET(accept_socket, &should_read_set); |
|
313 |
FD_SET(master, &should_read_set); |
|
314 |
||
315 |
nconns = 0; |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
316 |
for (;;) { |
1 | 317 |
int max; |
318 |
read_set = should_read_set; |
|
319 |
||
320 |
/* Calculate max fd */ |
|
321 |
max = accept_socket; |
|
322 |
if (master > max) |
|
323 |
max = master; |
|
324 |
for (i = 0; i < nconns; ++i) |
|
325 |
if (conns[i] > max) |
|
326 |
max = conns[i]; |
|
327 |
||
328 |
select(max + 1, &read_set, 0, 0, 0); |
|
329 |
||
330 |
if (FD_ISSET(master, &read_set)) |
|
331 |
{ |
|
332 |
cc = read(master, obuf, sizeof (obuf)); |
|
333 |
if (cc <= 0) |
|
334 |
break; |
|
335 |
/* Write to the terminal output */ |
|
336 |
(void) write(1, obuf, cc); |
|
337 |
/* Broadcast messages */ |
|
338 |
for (i = 0; i < nconns; ++i) |
|
339 |
(void) write(conns[i], obuf, cc); |
|
340 |
} |
|
341 |
for (i = 0; i < nconns; ++i) |
|
342 |
{ |
|
343 |
if (FD_ISSET(conns[i], &read_set)) |
|
344 |
{ |
|
345 |
int size; |
|
346 |
size = read(conns[i], obuf, sizeof(obuf)); |
|
347 |
if (size == 0) |
|
348 |
{ |
|
349 |
close(conns[i]); |
|
350 |
FD_CLR(conns[i], &should_read_set); |
|
351 |
remove_element(i, conns, nconns); |
|
352 |
nconns--; |
|
353 |
} |
|
354 |
} |
|
355 |
} |
|
356 |
if (FD_ISSET(accept_socket, &read_set)) |
|
357 |
{ |
|
358 |
int s; |
|
359 |
s = accept(accept_socket, 0, 0); |
|
360 |
if (s == -1) |
|
361 |
{ |
|
362 |
perror("accept() failed"); |
|
363 |
break; |
|
364 |
} |
|
3 | 365 |
if (nconns < (MAXCONNS - 1) && nconns < limit_conns) |
1 | 366 |
{ |
367 |
FD_SET(s, &should_read_set); |
|
368 |
conns[nconns] = s; |
|
369 |
nconns++; |
|
370 |
} else |
|
371 |
close(s); |
|
372 |
} |
|
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
373 |
} |
1 | 374 |
|
375 |
close(accept_socket); |
|
376 |
for (i = 0; i < nconns; ++i) |
|
377 |
close(conns[i]); |
|
378 |
||
0
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
379 |
done(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
380 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
381 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
382 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
383 |
doshell() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
384 |
char *shname; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
385 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
386 |
#if 0 |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
387 |
int t; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
388 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
389 |
t = open(_PATH_TTY, O_RDWR); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
390 |
if (t >= 0) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
391 |
(void) ioctl(t, TIOCNOTTY, (char *)0); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
392 |
(void) close(t); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
393 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
394 |
#endif |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
395 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
396 |
getslave(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
397 |
(void) close(master); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
398 |
(void) dup2(slave, 0); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
399 |
(void) dup2(slave, 1); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
400 |
(void) dup2(slave, 2); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
401 |
(void) close(slave); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
402 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
403 |
shname = strrchr(shell, '/'); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
404 |
if (shname) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
405 |
shname++; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
406 |
else |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
407 |
shname = shell; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
408 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
409 |
if (cflg) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
410 |
execl(shell, shname, "-c", cflg, 0); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
411 |
else |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
412 |
execl(shell, shname, "-i", 0); |
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 |
perror(shell); |
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 |
} |
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 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
419 |
fixtty() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
420 |
struct termios rtt; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
421 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
422 |
rtt = tt; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
423 |
cfmakeraw(&rtt); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
424 |
rtt.c_lflag &= ~ECHO; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
425 |
(void) tcsetattr(0, TCSAFLUSH, &rtt); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
426 |
} |
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 |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
429 |
fail() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
430 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
431 |
(void) kill(0, SIGTERM); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
432 |
done(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
433 |
} |
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 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
436 |
done() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
437 |
time_t tvec; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
438 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
439 |
if (subchild) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
440 |
(void) close(master); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
441 |
} else { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
442 |
(void) tcsetattr(0, TCSAFLUSH, &tt); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
443 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
444 |
exit(0); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
445 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
446 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
447 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
448 |
getmaster() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
449 |
#ifdef HAVE_openpty |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
450 |
(void) tcgetattr(0, &tt); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
451 |
(void) ioctl(0, TIOCGWINSZ, (char *)&win); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
452 |
if (openpty(&master, &slave, NULL, &tt, &win) < 0) { |
1 | 453 |
fprintf(stderr, "openpty failed\n"); |
0
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 |
#else |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
457 |
char *pty, *bank, *cp; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
458 |
struct stat stb; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
459 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
460 |
pty = &line[strlen("/dev/ptyp")]; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
461 |
for (bank = "pqrs"; *bank; bank++) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
462 |
line[strlen("/dev/pty")] = *bank; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
463 |
*pty = '0'; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
464 |
if (stat(line, &stb) < 0) |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
465 |
break; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
466 |
for (cp = "0123456789abcdef"; *cp; cp++) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
467 |
*pty = *cp; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
468 |
master = open(line, O_RDWR); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
469 |
if (master >= 0) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
470 |
char *tp = &line[strlen("/dev/")]; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
471 |
int ok; |
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 |
/* verify slave side is usable */ |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
474 |
*tp = 't'; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
475 |
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
|
476 |
*tp = 'p'; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
477 |
if (ok) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
478 |
(void) tcgetattr(0, &tt); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
479 |
(void) ioctl(0, TIOCGWINSZ, |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
480 |
(char *)&win); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
481 |
return; |
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 |
(void) close(master); |
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 |
} |
1 | 487 |
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
|
488 |
fail(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
489 |
#endif /* not HAVE_openpty */ |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
490 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
491 |
|
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
492 |
void |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
493 |
getslave() { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
494 |
#ifndef HAVE_openpty |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
495 |
line[strlen("/dev/")] = 't'; |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
496 |
slave = open(line, O_RDWR); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
497 |
if (slave < 0) { |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
498 |
perror(line); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
499 |
fail(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
500 |
} |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
501 |
(void) tcsetattr(slave, TCSAFLUSH, &tt); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
502 |
(void) ioctl(slave, TIOCSWINSZ, (char *)&win); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
503 |
#endif |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
504 |
(void) setsid(); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
505 |
(void) ioctl(slave, TIOCSCTTY, 0); |
f7f7567e7bef
Initial import of script.c from util-linux-2.12r (gentoo)
viric@llimona
parents:
diff
changeset
|
506 |
} |