SCCS-vsn: usr.bin/telnet/telnet.c 4.27
-static char sccsid[] = "@(#)telnet.c 4.26 (Berkeley) %G%";
+static char sccsid[] = "@(#)telnet.c 4.27 (Berkeley) %G%";
int tn(), quit(), suspend(), bye(), help();
int setescape(), status(), toggle(), setoptions();
int tn(), quit(), suspend(), bye(), help();
int setescape(), status(), toggle(), setoptions();
-int setcrmod(), setdebug();
+int setcrmod(), setdebug(), sendesc(), ayt(), intp();
#define HELPINDENT (sizeof ("connect"))
#define HELPINDENT (sizeof ("connect"))
char helphelp[] = "print help information";
char optionshelp[] = "toggle viewing of options processing";
char crmodhelp[] = "toggle mapping of received carriage returns";
char helphelp[] = "print help information";
char optionshelp[] = "toggle viewing of options processing";
char crmodhelp[] = "toggle mapping of received carriage returns";
+char sendeschelp[] = "send escape character";
+char aythelp[] = "send Are You There";
+char intphelp[] = "send Interrupt Process";
struct cmd cmdtab[] = {
{ "open", openhelp, tn },
struct cmd cmdtab[] = {
{ "open", openhelp, tn },
{ "options", optionshelp, setoptions },
{ "crmod", crmodhelp, setcrmod },
{ "debug", debughelp, setdebug },
{ "options", optionshelp, setoptions },
{ "crmod", crmodhelp, setcrmod },
{ "debug", debughelp, setdebug },
+ { "ayt", aythelp, ayt },
+ { "interrupt", intphelp, intp },
+ { "passthru", sendeschelp, sendesc },
{ "?", helphelp, help },
0
};
{ "?", helphelp, help },
0
};
}
sin.sin_port = htons(sin.sin_port);
}
}
sin.sin_port = htons(sin.sin_port);
}
- net = socket(AF_INET, SOCK_STREAM, 0, 0);
+ net = socket(AF_INET, SOCK_STREAM, 0);
if (net < 0) {
perror("telnet: socket");
return;
if (net < 0) {
perror("telnet: socket");
return;
signal(SIGINT, intr);
signal(SIGPIPE, deadpeer);
printf("Trying...\n");
signal(SIGINT, intr);
signal(SIGPIPE, deadpeer);
printf("Trying...\n");
- if (connect(net, (caddr_t)&sin, sizeof (sin), 0) < 0) {
+ if (connect(net, (caddr_t)&sin, sizeof (sin)) < 0) {
perror("telnet: connect");
signal(SIGINT, SIG_DFL);
return;
perror("telnet: connect");
signal(SIGINT, SIG_DFL);
return;
(void) mode(2);
ioctl(s, FIONBIO, &on);
(void) mode(2);
ioctl(s, FIONBIO, &on);
+ if (!hisopts[TELOPT_SGA])
+ willoption(TELOPT_SGA);
for (;;) {
int ibits = 0, obits = 0;
for (;;) {
int ibits = 0, obits = 0;
- if (c == IAC)
- *nfrontp++ = c;
- *nfrontp++ = c;
- if (c == '\r')
+ switch (c) {
+ case '\n':
+ if (!hisopts[TELOPT_ECHO])
+ *nfrontp++ = '\r';
+ break;
+ case '\r':
+ *nfrontp++ = '\r';
+ if (hisopts[TELOPT_ECHO])
+ *nfrontp++ = '\n';
+ else
+ *nfrontp++ = '\0';
+ break;
+ case IAC:
+ *nfrontp++ = IAC;
+ /* fall into ... */
+ default:
+ *nfrontp++ = c;
+ break;
+ }
}
if ((obits & (1 << s)) && (nfrontp - nbackp) > 0)
netflush(s);
}
if ((obits & (1 << s)) && (nfrontp - nbackp) > 0)
netflush(s);
perror("setsockopt (SO_DEBUG)");
}
perror("setsockopt (SO_DEBUG)");
}
+sendesc()
+{
+ *nfrontp++ = escape;
+}
+
+ayt()
+{
+ *nfrontp++ = IAC;
+ *nfrontp++ = AYT;
+}
+
+intp()
+{
+ *nfrontp++ = IAC;
+ *nfrontp++ = IP;
+}
+
/*
* Construct a control character sequence
* for a special character.
/*
* Construct a control character sequence
* for a special character.