annotate toys/pending/telnet.c @ 1639:856b544f8fce draft

strncpy(optptr, hname, strlen(hname)) is really just strcpy().
author Rob Landley <rob@landley.net>
date Thu, 01 Jan 2015 16:49:55 -0600
parents 1c25b5119072
children
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 /* telnet.c - Telnet client.
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 2012 Madhur Verma <mad.flexi@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 * Modified by Ashwini Kumar <ak.ashwini1981@gmail.com>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 *
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 * Not in SUSv4.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 USE_TELNET(NEWTOY(telnet, "<1>2", TOYFLAG_BIN))
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
10
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 config TELNET
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 bool "telnet"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 default n
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 help
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 usage: telnet HOST [PORT]
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
16
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 Connect to telnet server
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
19
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 #define FOR_telnet
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 #include "toys.h"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 #include <arpa/telnet.h>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 #include <netinet/in.h>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 #include <sys/poll.h>
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
25
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 GLOBALS(
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 int port;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 int sfd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 char buff[128];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 int pbuff;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 char iac[256];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 int piac;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 char *ttype;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 struct termios def_term;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 struct termios raw_term;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 uint8_t term_ok;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 uint8_t term_mode;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 uint8_t flags;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 unsigned win_width;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 unsigned win_height;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 )
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
42
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 #define DATABUFSIZE 128
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 #define IACBUFSIZE 256
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 #define CM_TRY 0
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 #define CM_ON 1
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 #define CM_OFF 2
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 #define UF_ECHO 0x01
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 #define UF_SGA 0x02
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
50
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 /*
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 * creates a socket of family INET/INET6 and protocol TCP and connects
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 * it to HOST at PORT.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 * if successful then returns SOCK othrwise error
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 static int xconnect_inet_tcp(char *host, int port)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 int ret;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 struct addrinfo *info, *rp;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 char buf[32];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
61
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 rp = xzalloc(sizeof(struct addrinfo));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 rp->ai_family = AF_UNSPEC;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 rp->ai_socktype = SOCK_STREAM;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 rp->ai_protocol = IPPROTO_TCP;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 sprintf(buf, "%d", port);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
67
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 ret = getaddrinfo(host, buf, rp, &info);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 if(ret || !info) perror_exit("BAD ADDRESS: can't find : %s ", host);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 free(rp);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
71
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 for (rp = info; rp; rp = rp->ai_next)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 if ( (rp->ai_family == AF_INET) || (rp->ai_family == AF_INET6)) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
74
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 if (!rp) error_exit("Invalid IP %s", host);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
76
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 ret = xsocket(rp->ai_family, SOCK_STREAM, IPPROTO_TCP);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 if(connect(ret, rp->ai_addr, rp->ai_addrlen) == -1) perror_exit("connect");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
79
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 freeaddrinfo(info);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 return ret;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
83
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 // sets terminal mode: LINE or CHARACTER based om internal stat.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 static char const es[] = "\r\nEscape character is ";
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 static void set_mode(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 if (TT.flags & UF_ECHO) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 if (TT.term_mode == CM_TRY) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 TT.term_mode = CM_ON;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 printf("\r\nEntering character mode%s'^]'.\r\n", es);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 if (TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.raw_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 } else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 if (TT.term_mode != CM_OFF) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 TT.term_mode = CM_OFF;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 printf("\r\nEntering line mode%s'^C'.\r\n", es);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 if (TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.def_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 }
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 // flushes all data in IAC buff to server.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 static void flush_iac(void)
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 int wlen = write(TT.sfd, TT.iac, TT.piac);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
107
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 if(wlen <= 0) error_msg("IAC : send failed.");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
109 TT.piac = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 }
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 // puts DATA in iac buff of length LEN and updates iac buff pointer.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 static void put_iac(int len, ...)
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 va_list va;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
116
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
117 if(TT.piac + len >= IACBUFSIZE) flush_iac();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
118 va_start(va, len);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
119 for(;len > 0; TT.iac[TT.piac++] = (uint8_t)va_arg(va, int), len--);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
120 va_end(va);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
121 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
122
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
123 // puts string STR in iac buff and updates iac buff pointer.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
124 static void str_iac(char *str)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
125 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
126 int len = strlen(str);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
127
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
128 if(TT.piac + len + 1 >= IACBUFSIZE) flush_iac();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
129 strcpy(&TT.iac[TT.piac], str);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
130 TT.piac += len+1;
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
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
133 static void handle_esc(void)
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 char input;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
136
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
137 if(toys.signal && TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.raw_term);
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
138 write(1,"\r\nConsole escape. Commands are:\r\n\n"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
139 " l go to line mode\r\n"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
140 " c go to character mode\r\n"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 " z suspend telnet\r\n"
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 " e exit telnet\r\n", 114);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
143
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
144 if (read(STDIN_FILENO, &input, 1) <= 0) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
145 if(TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.def_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
146 exit(0);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
147 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
148
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
149 switch (input) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
150 case 'l':
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
151 if (!toys.signal) {
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
152 TT.term_mode = CM_TRY;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
153 TT.flags &= ~(UF_ECHO | UF_SGA);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
154 set_mode();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
155 put_iac(6, IAC,DONT,TELOPT_ECHO,IAC,DONT, TELOPT_SGA);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
156 flush_iac();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
157 goto ret;
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 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
160 case 'c':
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
161 if (toys.signal) {
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
162 TT.term_mode = CM_TRY;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
163 TT.flags |= (UF_ECHO | UF_SGA);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 set_mode();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
165 put_iac(6, IAC,DO,TELOPT_ECHO,IAC,DO,TELOPT_SGA);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
166 flush_iac();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 goto ret;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
169 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
170 case 'z':
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
171 if(TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.def_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
172 kill(0, SIGTSTP);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
173 if(TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.raw_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
174 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
175 case 'e':
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
176 if(TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.def_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
177 exit(0);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
178 default: break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
179 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
180
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
181 write(1, "continuing...\r\n", 15);
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
182 if (toys.signal && TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.def_term);
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
183
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
184 ret:
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
185 toys.signal = 0;
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
186 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
187
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
188 /*
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
189 * handles telnet SUB NEGOTIATIONS
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
190 * only terminal type is supported.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
191 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
192 static void handle_negotiations(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
193 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
194 char opt = TT.buff[TT.pbuff++];
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 switch(opt) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
197 case TELOPT_TTYPE:
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
198 opt = TT.buff[TT.pbuff++];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
199 if(opt == TELQUAL_SEND) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
200 put_iac(4, IAC,SB,TELOPT_TTYPE,TELQUAL_IS);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
201 str_iac(TT.ttype);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
202 put_iac(2, IAC,SE);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
203 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
204 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
205 default: break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
206 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
207 }
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 * handles server's DO DONT WILL WONT requests.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
211 * supports ECHO, SGA, TTYPE, NAWS
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
212 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
213 static void handle_ddww(char ddww)
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 char opt = TT.buff[TT.pbuff++];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
216
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
217 switch (opt) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
218 case TELOPT_ECHO: /* ECHO */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
219 if (ddww == DO) put_iac(3, IAC,WONT,TELOPT_ECHO);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
220 if(ddww == DONT) break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
221 if (TT.flags & UF_ECHO) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
222 if (ddww == WILL) return;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
223 } else if (ddww == WONT) return;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
224 if (TT.term_mode != CM_OFF) TT.flags ^= UF_ECHO;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
225 (TT.flags & UF_ECHO)? put_iac(3, IAC,DO,TELOPT_ECHO) :
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
226 put_iac(3, IAC,DONT,TELOPT_ECHO);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
227 set_mode();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
228 printf("\r\n");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
229 break;
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 case TELOPT_SGA: /* Supress GO Ahead */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
232 if (TT.flags & UF_SGA){ if (ddww == WILL) return;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
233 } else if (ddww == WONT) return;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
234
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
235 TT.flags ^= UF_SGA;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
236 (TT.flags & UF_SGA)? put_iac(3, IAC,DO,TELOPT_SGA) :
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
237 put_iac(3, IAC,DONT,TELOPT_SGA);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
238 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
239
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
240 case TELOPT_TTYPE: /* Terminal Type */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
241 (TT.ttype)? put_iac(3, IAC,WILL,TELOPT_TTYPE):
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
242 put_iac(3, IAC,WONT,TELOPT_TTYPE);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
243 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
244
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
245 case TELOPT_NAWS: /* Window Size */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
246 put_iac(3, IAC,WILL,TELOPT_NAWS);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
247 put_iac(9, IAC,SB,TELOPT_NAWS,(TT.win_width >> 8) & 0xff,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
248 TT.win_width & 0xff,(TT.win_height >> 8) & 0xff,
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
249 TT.win_height & 0xff,IAC,SE);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
250 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
251
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
252 default: /* Default behaviour is to say NO */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
253 if(ddww == WILL) put_iac(3, IAC,DONT,opt);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
254 if(ddww == DO) put_iac(3, IAC,WONT,opt);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
255 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
256 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
257 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
258
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
259 /*
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
260 * parses data which is read from server of length LEN.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
261 * and passes it to console.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
262 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
263 static int read_server(int len)
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 int i = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
266 char curr;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
267 TT.pbuff = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
268
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
269 do {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
270 curr = TT.buff[TT.pbuff++];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
271 if (curr == IAC) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
272 curr = TT.buff[TT.pbuff++];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
273 switch (curr) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
274 case DO: /* FALLTHROUGH */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
275 case DONT: /* FALLTHROUGH */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
276 case WILL: /* FALLTHROUGH */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
277 case WONT:
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
278 handle_ddww(curr);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
279 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
280 case SB:
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
281 handle_negotiations();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
282 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
283 case SE:
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
284 break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
285 default: break;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
286 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
287 } else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
288 toybuf[i++] = curr;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
289 if (curr == '\r') { curr = TT.buff[TT.pbuff++];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
290 if (curr != '\0') TT.pbuff--;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
291 }
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 } while (TT.pbuff < len);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
294
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
295 if (i) write(STDIN_FILENO, toybuf, i);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
296 return 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
297 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
298
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
299 /*
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
300 * parses data which is read from console of length LEN
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
301 * and passes it to server.
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
302 */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
303 static void write_server(int len)
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 char *c = (char*)TT.buff;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
306 int i = 0;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
307
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
308 for (; len > 0; len--, c++) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
309 if (*c == 0x1d) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
310 handle_esc();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
311 return;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
312 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
313 toybuf[i++] = *c;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
314 if (*c == IAC) toybuf[i++] = *c; /* IAC -> IAC IAC */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
315 else if (*c == '\r') toybuf[i++] = '\0'; /* CR -> CR NUL */
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
316 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
317 if(i) write(TT.sfd, toybuf, i);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
318 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
319
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
320 void telnet_main(void)
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
321 {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
322 int set = 1, len;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
323 struct pollfd pfds[2];
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
324
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
325 TT.port = 23; //TELNET_PORT
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
326 TT.win_width = 80; //columns
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
327 TT.win_height = 24; //rows
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 if(toys.optc == 2) TT.port = atoi(toys.optargs[1]);
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
330 if(TT.port <= 0 || TT.port > 65535) error_exit("bad PORT (1-65535)");
1162
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.ttype = getenv("TERM");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
333 if(!TT.ttype) TT.ttype = "";
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
334 if(strlen(TT.ttype) > IACBUFSIZE-1) TT.ttype[IACBUFSIZE - 1] = '\0';
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
335
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
336 if (!tcgetattr(0, &TT.def_term)) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
337 TT.term_ok = 1;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
338 TT.raw_term = TT.def_term;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
339 cfmakeraw(&TT.raw_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
340 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
341 terminal_size(&TT.win_width, &TT.win_height);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
342
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
343 TT.sfd = xconnect_inet_tcp(toys.optargs[0], TT.port);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
344 setsockopt(TT.sfd, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(set));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
345 setsockopt(TT.sfd, SOL_SOCKET, SO_KEEPALIVE, &set, sizeof(set));
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
346
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
347 pfds[0].fd = STDIN_FILENO;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
348 pfds[0].events = POLLIN;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
349 pfds[1].fd = TT.sfd;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
350 pfds[1].events = POLLIN;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
351
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
352 signal(SIGINT, generic_signal);
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
353 while(1) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
354 if(TT.piac) flush_iac();
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
355 if(poll(pfds, 2, -1) < 0) {
1301
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
356 if (toys.signal) handle_esc();
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
357 else sleep(1);
1c25b5119072 Make telnet use generic_signal(), minor in-passing cleanups.
Rob Landley <rob@landley.net>
parents: 1162
diff changeset
358
1162
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
359 continue;
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
360 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
361 if(pfds[0].revents) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
362 len = read(STDIN_FILENO, TT.buff, DATABUFSIZE);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
363 if(len > 0) write_server(len);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
364 else return;
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(pfds[1].revents) {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
367 len = read(TT.sfd, TT.buff, DATABUFSIZE);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
368 if(len > 0) read_server(len);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
369 else {
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
370 printf("Connection closed by foreign host\r\n");
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
371 if(TT.term_ok) tcsetattr(0, TCSADRAIN, &TT.def_term);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
372 exit(1);
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
373 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
374 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
375 }
213c00e7978e telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff changeset
376 }