Mercurial > hg > toybox
annotate toys/pending/telnet.c @ 1276:d48bdc1cb017 draft
Switch human_readable() to just outputing decimal kilo/mega/gigabytes, make du use it, move it from lib/pending.c to lib.c.
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 06 May 2014 06:31:28 -0500 |
parents | 213c00e7978e |
children | 1c25b5119072 |
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] |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 Connect to telnet server |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 */ |
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 #define FOR_telnet |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 #include "toys.h" |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 #include <arpa/telnet.h> |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 #include <netinet/in.h> |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 #include <sys/poll.h> |
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 GLOBALS( |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 int port; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 int sfd; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 char buff[128]; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 int pbuff; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 char iac[256]; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 int piac; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 char *ttype; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 struct termios def_term; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 struct termios raw_term; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 uint8_t term_ok; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 uint8_t term_mode; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 uint8_t flags; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 unsigned win_width; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 unsigned win_height; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 unsigned signalno; |
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 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 if(TT.signalno && 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
|
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': |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 if (!TT.signalno) { |
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': |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 if (TT.signalno) { |
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); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 if (TT.signalno && 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
|
183 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 ret: |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 TT.signalno = 0; |
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 /* |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 * SIGINT signal handling. |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 * only sets signalno which get handle in main loop. |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 */ |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 static void handle_sigint(int signo) |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 TT.signalno = signo; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 } |
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 void telnet_main(void) |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 int set = 1, len; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 struct pollfd pfds[2]; |
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 TT.port = 23; //TELNET_PORT |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 TT.win_width = 80; //columns |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 TT.win_height = 24; //rows |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 if(toys.optc == 2) TT.port = atoi(toys.optargs[1]); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 if(TT.port <= 0 || TT.port > 65535) |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 error_exit("PORT can be non-zero upto 65535."); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 TT.ttype = getenv("TERM"); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 if(!TT.ttype) TT.ttype = ""; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 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
|
345 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 if (!tcgetattr(0, &TT.def_term)) { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 TT.term_ok = 1; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 TT.raw_term = TT.def_term; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 cfmakeraw(&TT.raw_term); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 } |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 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
|
352 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 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
|
354 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
|
355 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
|
356 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 pfds[0].fd = STDIN_FILENO; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 pfds[0].events = POLLIN; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 pfds[1].fd = TT.sfd; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 pfds[1].events = POLLIN; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 TT.piac = TT.pbuff = 0; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 TT.signalno = 0; |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 signal(SIGINT, handle_sigint); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 while(1) { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 if(TT.piac) flush_iac(); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 if(poll(pfds, 2, -1) < 0) { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 (TT.signalno)?handle_esc():sleep(1); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 continue; |
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 if(pfds[0].revents) { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 len = read(STDIN_FILENO, TT.buff, DATABUFSIZE); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 if(len > 0) write_server(len); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 else return; |
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 if(pfds[1].revents) { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 len = read(TT.sfd, TT.buff, DATABUFSIZE); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 if(len > 0) read_server(len); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 else { |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 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
|
381 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
|
382 exit(1); |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 } |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 } |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 } |
213c00e7978e
telnet and telnetd from Ashwini Sharma's guys.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 } |