annotate toys/pending/telnetd.c @ 1183:0752b2d58909 draft

Rename xmsprintf() to just xmprintf(). Partly because there's no supplied target string ala sprintf, and partly because I can never remember what order the m and s go in.
author Rob Landley <rob@landley.net>
date Thu, 16 Jan 2014 09:26:50 -0600
parents 213c00e7978e
children 04d754570e50
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* telnetd.c - Telnet Server
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 *
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 USE_TELNETD(NEWTOY(telnetd, "w#<0b:p#<0>65535=23f:l:FSKi[!wi]", TOYFLAG_USR|TOYFLAG_BIN))
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 config TELNETD
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 bool "telnetd"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 default n
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 help
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 Handle incoming telnet connections
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
13
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 -l LOGIN Exec LOGIN on connect
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 -f ISSUE_FILE Display ISSUE_FILE instead of /etc/issue
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 -K Close connection as soon as login exits
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 -p PORT Port to listen on
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -b ADDR[:PORT] Address to bind to
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -F Run in foreground
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -i Inetd mode
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 -w SEC Inetd 'wait' mode, linger time SEC
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 -S Log to syslog (implied by -i or without -F and -w)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
24
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 #define FOR_telnetd
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 #include "toys.h"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 #include <utmp.h>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 GLOBALS(
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 char *login_path;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 char *issue_path;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 int port;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 char *host_addr;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 long w_sec;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
34
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 int gmax_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 int sig;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 pid_t fork_pid;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 )
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
39
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
40
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 # define IAC 255 /* interpret as command: */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 # define DONT 254 /* you are not to use option */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 # define DO 253 /* please, you use option */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 # define WONT 252 /* I won't use option */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 # define WILL 251 /* I will use option */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 # define SB 250 /* interpret as subnegotiation */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 # define SE 240 /* end sub negotiation */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 # define NOP 241 /* No Operation */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 # define TELOPT_ECHO 1 /* echo */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 # define TELOPT_SGA 3 /* suppress go ahead */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 # define TELOPT_TTYPE 24 /* terminal type */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 # define TELOPT_NAWS 31 /* window size */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
53
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 #define BUFSIZE 4*1024
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 struct term_session {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 int new_fd, pty_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 pid_t child_pid;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 int buff1_avail, buff2_avail;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 int buff1_written, buff2_written;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 int rem; //unprocessed data from socket
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 char buff1[BUFSIZE], buff2[BUFSIZE];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 struct term_session *next;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 };
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
64
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 struct term_session *session_list = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
66
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 static void get_sockaddr(char *host, void *buf)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 in_port_t port_num = htons(TT.port);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 struct addrinfo hints, *result;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 int status, af = AF_UNSPEC;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 char *s;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
73
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 // [ipv6]:port or exactly one :
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 if (*host == '[') {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 host++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 s = strchr(host, ']');
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 if (s) *s++ = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 else error_exit("bad address '%s'", host-1);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 af = AF_INET6;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 } else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 s = strrchr(host, ':');
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 if (s && strchr(host, ':') == s) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 *s = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 af = AF_INET;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 } else if (s && strchr(host, ':') != s) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 af = AF_INET6;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 s = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
91
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 if (s++) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 char *ss;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 unsigned long p = strtoul(s, &ss, 0);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 if (!*s || *ss || p > 65535) error_exit("bad port '%s'", s);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 port_num = htons(p);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
98
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 memset(&hints, 0 , sizeof(struct addrinfo));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 hints.ai_family = af;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 hints.ai_socktype = SOCK_STREAM;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
102
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 status = getaddrinfo(host, NULL, &hints, &result);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 if (status) error_exit("bad address '%s' : %s", host, gai_strerror(status));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
105
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 memcpy(buf, result->ai_addr, result->ai_addrlen);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
107 freeaddrinfo(result);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
108
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
109 if (af == AF_INET) ((struct sockaddr_in*)buf)->sin_port = port_num;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 else ((struct sockaddr_in6*)buf)->sin6_port = port_num;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
112
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 static void utmp_entry(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
114 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
115 struct utmp entry;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
116 struct utmp *utp_ptr;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
117 pid_t pid = getpid();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
118
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
119 utmpname(_PATH_UTMP);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
120 setutent(); //start from start
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
121 while ((utp_ptr = getutent()) != NULL) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
122 if (utp_ptr->ut_pid == pid && utp_ptr->ut_type >= INIT_PROCESS) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
123 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
124 if (!utp_ptr) entry.ut_type = DEAD_PROCESS;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
125 time(&entry.ut_time);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
126 setutent();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
127 pututline(&entry);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
128 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
129
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
130 static int listen_socket(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
131 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
132 int s, af = AF_INET, yes = 1;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
133 char buf[sizeof(struct sockaddr_storage)];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
134
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
135 memset(buf, 0, sizeof(buf));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
136 if (toys.optflags & FLAG_b) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
137 get_sockaddr(TT.host_addr, buf);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
138 af = ((struct sockaddr *)buf)->sa_family;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
139 } else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
140 ((struct sockaddr_in*)buf)->sin_port = htons(TT.port);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 ((struct sockaddr_in*)buf)->sin_family = af;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
143 s = xsocket(af, SOCK_STREAM, 0);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
144 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) == -1)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
145 perror_exit("setsockopt");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
146
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
147 if (bind(s, (struct sockaddr *)buf, ((af == AF_INET)?
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
148 (sizeof(struct sockaddr_in)):(sizeof(struct sockaddr_in6)))) == -1) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
149 close(s);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
150 perror_exit("bind");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
151 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
152
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
153 if (listen(s, 1) < 0) perror_exit("listen");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
154 return s;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
155 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
156
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
157 static void write_issue(char *tty)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
158 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
159 int size;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
160 char ch = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
161 struct utsname u;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
162 int fd = open(TT.issue_path, O_RDONLY);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
163
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 if (fd < 0) return ;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
165 uname(&u);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
166 while ((size = readall(fd, &ch, 1)) > 0) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 if (ch == '\\' || ch == '%') {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 if (readall(fd, &ch, 1) <= 0) perror_exit("readall!");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
169 if (ch == 's') fputs(u.sysname, stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
170 if (ch == 'n'|| ch == 'h') fputs(u.nodename, stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
171 if (ch == 'r') fputs(u.release, stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
172 if (ch == 'm') fputs(u.machine, stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
173 if (ch == 'l') fputs(tty, stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
174 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
175 else if (ch == '\n') {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
176 fputs("\n\r\0", stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
177 } else fputc(ch, stdout);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
178 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
179 fflush(NULL);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
180 close(fd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
181 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
182
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
183 static int new_session(int sockfd)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
184 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
185 char *argv_login[2]; //arguments for execvp cmd, NULL
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
186 char tty_name[30]; //tty name length.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
187 int fd, flags, i = 1;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
188 char intial_iacs[] = {IAC, DO, TELOPT_ECHO, IAC, DO, TELOPT_NAWS,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
189 IAC, WILL, TELOPT_ECHO, IAC, WILL, TELOPT_SGA };
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
190
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
191 setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &i, sizeof(i));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
192 flags = fcntl(sockfd, F_GETFL);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
193 fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
194 if (toys.optflags & FLAG_i) fcntl((sockfd + 1), F_SETFL, flags | O_NONBLOCK);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
195
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
196 writeall((toys.optflags & FLAG_i)?1:sockfd, intial_iacs, sizeof(intial_iacs));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
197 if ((TT.fork_pid = forkpty(&fd, tty_name, NULL, NULL)) > 0) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
198 flags = fcntl(fd, F_GETFL);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
199 fcntl(fd, F_SETFL, flags | O_NONBLOCK);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
200 return fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
201 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
202 if (TT.fork_pid < 0) perror_exit("fork");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
203 write_issue(tty_name);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
204 argv_login[0] = strdup(TT.login_path);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
205 argv_login[1] = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
206 execvp(argv_login[0], argv_login);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
207 exit(EXIT_FAILURE);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
208 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
209
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
210 static int handle_iacs(struct term_session *tm, int c, int fd)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
211 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
212 char *curr ,*start,*end;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
213 int i = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
214
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
215 curr = start = tm->buff2+tm->buff2_avail;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
216 end = tm->buff2 + c -1;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
217 tm->rem = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
218 while (curr <= end) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
219 if (*curr != IAC){
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
220
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
221 if (*curr != '\r') {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
222 toybuf[i++] = *curr++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
223 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
224 } else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
225 toybuf[i++] = *curr++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
226 curr++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
227 if (curr < end && (*curr == '\n' || *curr == '\0'))
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
228 curr++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
229 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
230 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
231 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
232
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
233 if ((curr + 1) > end) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
234 tm->rem = 1;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
235 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
236 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
237 if (*(curr+1) == IAC) { //IAC as data --> IAC IAC
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
238 toybuf[i++] = *(curr+1);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
239 curr += 2; //IAC IAC --> 2 bytes
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
240 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
241 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
242 if (*(curr + 1) == NOP || *(curr + 1) == SE) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
243 curr += 2;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
244 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
245 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
246
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
247 if (*(curr + 1) == SB ) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
248 if (*(curr+2) == TELOPT_NAWS) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
249 struct winsize ws;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
250 if ((curr+8) >= end) { //ensure we have data to process.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
251 tm->rem = end - curr;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
252 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
253 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
254 ws.ws_col = (curr[3] << 8) | curr[4];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
255 ws.ws_row = (curr[5] << 8) | curr[6];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
256 ioctl(fd, TIOCSWINSZ, (char *)&ws);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
257 curr += 9;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
258 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
259 } else { //eat non-supported sub neg. options.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
260 curr++, tm->rem++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
261 while (*curr != IAC && curr <= end) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
262 curr++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
263 tm->rem++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
264 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
265 if (*curr == IAC) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
266 tm->rem = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
267 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
268 } else break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
269 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
270 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
271 curr += 3; //skip non-supported 3 bytes.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
272 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
273 memcpy(start, toybuf, i);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
274 memcpy(start + i, end - tm->rem, tm->rem); //put remaining if we break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
275 return i;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
276 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
277
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
278 static int dup_iacs(char *start, int fd, int len)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
279 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
280 char arr[] = {IAC, IAC};
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
281 char *needle = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
282 int ret = 0, c, count = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
283
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
284 while (len) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
285 if (*start == IAC) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
286 count = writeall(fd, arr, sizeof(arr));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
287 if (count != 2) break; //short write
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
288 start++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
289 ret++;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
290 len--;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
291 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
292 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
293 needle = memchr(start, IAC, len);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
294 if (needle) c = needle - start;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
295 else c = len;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
296 count = writeall(fd, start, c);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
297 if (count < 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
298 len -= count;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
299 ret += count;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
300 start += count;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
301 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
302 return ret;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
303 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
304
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
305 static void kill_session(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
306 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
307 int status;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
308 struct term_session *tm, *prev = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
309 pid_t pid = wait(&status);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
310 TT.sig = 0; //ASAP
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
311
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
312 tm = session_list;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
313 if (toys.optflags & FLAG_i) exit(EXIT_SUCCESS);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
314
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
315 if (pid < 0) return;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
316 while (tm) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
317 if (tm->child_pid == pid) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
318 prev = tm;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
319 tm = tm->next;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
320 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
321 if (!tm) return; //paranoia
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
322 if (!prev) session_list = session_list->next;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
323 else prev->next = tm->next;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
324 utmp_entry();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
325 xclose(tm->pty_fd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
326 xclose(tm->new_fd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
327 free(tm);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
328 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
329
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
330 static void session_handler(int sig)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
331 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
332 TT.sig = sig;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
333 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
334
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
335 void telnetd_main(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
336 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
337 errno = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
338 fd_set rd, wr;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
339 struct term_session *tm = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
340 struct timeval tv, *tv_ptr = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
341 int pty_fd, new_fd, c = 0, w, master_fd = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
342 int inetd_m = (toys.optflags & FLAG_i);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
343
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
344 TT.sig = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
345 if (!(toys.optflags & FLAG_l)) TT.login_path = "/bin/login";
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
346 if (!(toys.optflags & FLAG_f)) TT.issue_path = "/etc/issue.net";
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
347 if (toys.optflags & FLAG_w) toys.optflags |= FLAG_F;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
348 if (!inetd_m) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
349 master_fd = listen_socket();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
350 fcntl(master_fd, F_SETFD, FD_CLOEXEC);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
351 if (master_fd > TT.gmax_fd) TT.gmax_fd = master_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
352 if (!(toys.optflags & FLAG_F)) daemonize();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
353 } else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
354 pty_fd = new_session(master_fd); //master_fd = 0
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
355 if (pty_fd > TT.gmax_fd) TT.gmax_fd = pty_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
356 tm = xzalloc(sizeof(struct term_session));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
357 tm->child_pid = TT.fork_pid;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
358 tm->new_fd = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
359 tm->pty_fd = pty_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
360 if (session_list) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
361 tm->next = session_list;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
362 session_list = tm;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
363 } else session_list = tm;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
364 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
365
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
366 if ((toys.optflags & FLAG_w) && !session_list) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
367 tv.tv_sec = TT.w_sec;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
368 tv.tv_usec = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
369 tv_ptr = &tv;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
370 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
371 signal(SIGCHLD, session_handler);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
372
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
373 for (;;) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
374 FD_ZERO(&rd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
375 FD_ZERO(&wr);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
376 if (!inetd_m) FD_SET(master_fd, &rd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
377
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
378 tm = session_list;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
379 while (tm) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
380
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
381 if (tm->pty_fd > 0 && tm->buff1_avail < BUFSIZE) FD_SET(tm->pty_fd, &rd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
382 if (tm->new_fd >= 0 && tm->buff2_avail < BUFSIZE) FD_SET(tm->new_fd, &rd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
383 if (tm->pty_fd > 0 && (tm->buff2_avail - tm->buff2_written) > 0)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
384 FD_SET(tm->pty_fd, &wr);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
385 if (tm->new_fd >= 0 && (tm->buff1_avail - tm->buff1_written) > 0)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
386 FD_SET(tm->new_fd, &wr);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
387 tm = tm->next;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
388 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
389
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
390
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
391 int r = select(TT.gmax_fd + 1, &rd, &wr, NULL, tv_ptr);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
392 if (!r) return; //timeout
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
393 if (r < -1) continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
394
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
395 if (!inetd_m && FD_ISSET(master_fd, &rd)) { //accept new connection
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
396 new_fd = accept(master_fd, NULL, NULL);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
397 if (new_fd < 0) continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
398 tv_ptr = NULL;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
399 fcntl(new_fd, F_SETFD, FD_CLOEXEC);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
400 if (new_fd > TT.gmax_fd) TT.gmax_fd = new_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
401 pty_fd = new_session(new_fd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
402 if (pty_fd > TT.gmax_fd) TT.gmax_fd = pty_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
403
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
404 tm = xzalloc(sizeof(struct term_session));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
405 tm->child_pid = TT.fork_pid;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
406 tm->new_fd = new_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
407 tm->pty_fd = pty_fd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
408 if (session_list) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
409 tm->next = session_list;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
410 session_list = tm;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
411 } else session_list = tm;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
412 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
413
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
414 tm = session_list;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
415 for (;tm;tm=tm->next) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
416 if (FD_ISSET(tm->pty_fd, &rd)) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
417 if ((c = read(tm->pty_fd, tm->buff1 + tm->buff1_avail,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
418 BUFSIZE-tm->buff1_avail)) <= 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
419 tm->buff1_avail += c;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
420 if ((w = dup_iacs(tm->buff1 + tm->buff1_written, tm->new_fd + inetd_m,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
421 tm->buff1_avail - tm->buff1_written)) < 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
422 tm->buff1_written += w;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
423 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
424 if (FD_ISSET(tm->new_fd, &rd)) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
425 if ((c = read(tm->new_fd, tm->buff2+tm->buff2_avail,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
426 BUFSIZE-tm->buff2_avail)) <= 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
427 c = handle_iacs(tm, c, tm->pty_fd);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
428 tm->buff2_avail += c;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
429 if ((w = write(tm->pty_fd, tm->buff2+ tm->buff2_written,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
430 tm->buff2_avail - tm->buff2_written)) < 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
431 tm->buff2_written += w;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
432 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
433 if (FD_ISSET(tm->pty_fd, &wr)) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
434 if ((w = write(tm->pty_fd, tm->buff2 + tm->buff2_written,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
435 tm->buff2_avail - tm->buff2_written)) < 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
436 tm->buff2_written += w;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
437 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
438 if (FD_ISSET(tm->new_fd, &wr)) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
439 if ((w = dup_iacs(tm->buff1 + tm->buff1_written, tm->new_fd + inetd_m,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
440 tm->buff1_avail - tm->buff1_written)) < 0) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
441 tm->buff1_written += w;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
442 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
443 if (tm->buff1_written == tm->buff1_avail)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
444 tm->buff1_written = tm->buff1_avail = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
445 if (tm->buff2_written == tm->buff2_avail)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
446 tm->buff2_written = tm->buff2_avail = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
447 fflush(NULL);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
448 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
449 if (TT.sig) kill_session();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
450 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
451 }