projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
start up cleanly
[unix-history]
/
usr
/
src
/
libexec
/
telnetd
/
telnetd.c
diff --git
a/usr/src/libexec/telnetd/telnetd.c
b/usr/src/libexec/telnetd/telnetd.c
index
45fb0dc
..
abc2ec1
100644
(file)
--- a/
usr/src/libexec/telnetd/telnetd.c
+++ b/
usr/src/libexec/telnetd/telnetd.c
@@
-1,5
+1,5
@@
#ifndef lint
#ifndef lint
-static char sccsid[] = "@(#)telnetd.c 4.
5 82/03/23
";
+static char sccsid[] = "@(#)telnetd.c 4.
9 82/10/10
";
#endif
/*
#endif
/*
@@
-13,6
+13,7
@@
static char sccsid[] = "@(#)telnetd.c 4.5 82/03/23";
#include <sys/types.h>
#include <sys/socket.h>
#include <net/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/in.h>
+#include <netdb.h>
#include "telnet.h"
#define INFINITY 10000000
#include "telnet.h"
#define INFINITY 10000000
@@
-32,9
+33,7
@@
char wont[] = { IAC, WONT, '%', 'c', 0 };
char ptyibuf[BUFSIZ], *ptyip = ptyibuf;
char ptyobuf[BUFSIZ], *pfrontp = ptyobuf, *pbackp = ptyobuf;
char netibuf[BUFSIZ], *netip = netibuf;
char ptyibuf[BUFSIZ], *ptyip = ptyibuf;
char ptyobuf[BUFSIZ], *pfrontp = ptyobuf, *pbackp = ptyobuf;
char netibuf[BUFSIZ], *netip = netibuf;
-char netobuf[BUFSIZ] =
- { IAC, DO, TELOPT_ECHO, '\r', '\n' },
- *nfrontp = netobuf + 5, *nbackp = netobuf;
+char netobuf[BUFSIZ], *nfrontp = netobuf, *nbackp = netobuf;
int pcc, ncc;
int pty, net;
int pcc, ncc;
int pty, net;
@@
-42,7
+41,7
@@
int inter;
extern int errno;
char line[] = "/dev/ptyp0";
extern int errno;
char line[] = "/dev/ptyp0";
-struct sockaddr_in sin = { AF_INET
, IPPORT_TELNET
};
+struct sockaddr_in sin = { AF_INET };
int options = SO_ACCEPTCONN|SO_KEEPALIVE;
main(argc, argv)
int options = SO_ACCEPTCONN|SO_KEEPALIVE;
main(argc, argv)
@@
-50,12
+49,39
@@
main(argc, argv)
{
int s, pid;
union wait status;
{
int s, pid;
union wait status;
+ struct servent *sp;
+ sp = getservbyname("telnet", "tcp");
+ if (sp == 0) {
+ fprintf(stderr, "telnetd: tcp/telnet: unknown service\n");
+ exit(1);
+ }
+ sin.sin_port = sp->s_port;
argc--, argv++;
if (argc > 0 && !strcmp(argv[0], "-d"))
argc--, argv++;
if (argc > 0 && !strcmp(argv[0], "-d"))
- options |= SO_DEBUG;
-#if vax || pdp11
+ options |= SO_DEBUG, argc--, argv++;
+ if (argc > 0) {
+ sin.sin_port = atoi(*argv);
+ if (sin.sin_port <= 0) {
+ fprintf(stderr, "telnetd: %s: bad port #\n", *argv);
+ exit(1);
+ }
+ }
sin.sin_port = htons(sin.sin_port);
sin.sin_port = htons(sin.sin_port);
+#ifndef DEBUG
+ if (fork())
+ exit(0);
+ for (s = 0; s < 10; s++)
+ (void) close(s);
+ (void) open("/", 0);
+ (void) dup2(0, 1);
+ (void) dup2(0, 2);
+ { int tt = open("/dev/tty", 2);
+ if (tt > 0) {
+ ioctl(tt, TIOCNOTTY, 0);
+ close(tt);
+ }
+ }
#endif
for (;;) {
errno = 0;
#endif
for (;;) {
errno = 0;
@@
-116,8
+142,11
@@
gotpty:
exit(1);
}
ioctl(t, TIOCGETP, &b);
exit(1);
}
ioctl(t, TIOCGETP, &b);
- b.sg_flags =
ECHO|
CRMOD|XTABS|ANYP;
+ b.sg_flags = CRMOD|XTABS|ANYP;
ioctl(t, TIOCSETP, &b);
ioctl(t, TIOCSETP, &b);
+ ioctl(p, TIOCGETP, &b);
+ b.sg_flags &= ~ECHO;
+ ioctl(p, TIOCSETP, &b);
if ((i = fork()) < 0) {
dup2(f, 2);
perror("fork");
if ((i = fork()) < 0) {
dup2(f, 2);
perror("fork");
@@
-150,6
+179,11
@@
telnet(f, p)
signal(SIGTSTP, SIG_IGN);
sigset(SIGCHLD, cleanup);
signal(SIGTSTP, SIG_IGN);
sigset(SIGCHLD, cleanup);
+ /*
+ * Request to do remote echo.
+ */
+ dooption(TELOPT_ECHO);
+ myopts[TELOPT_ECHO] = 1;
for (;;) {
int ibits = 0, obits = 0;
register int c;
for (;;) {
int ibits = 0, obits = 0;
register int c;
@@
-353,7
+387,7
@@
telrcv()
if (myopts[c]) {
myopts[c] = 0;
sprintf(nfrontp, wont, c);
if (myopts[c]) {
myopts[c] = 0;
sprintf(nfrontp, wont, c);
- nfrontp += sizeof(wont) - 2;
+ nfrontp += sizeof
(wont) - 2;
}
state = TS_DATA;
continue;
}
state = TS_DATA;
continue;
@@
-395,7
+429,7
@@
willoption(option)
break;
}
sprintf(nfrontp, fmt, option);
break;
}
sprintf(nfrontp, fmt, option);
- nfrontp += sizeof(dont) - 2;
+ nfrontp += sizeof
(dont) - 2;
}
wontoption(option)
}
wontoption(option)
@@
-423,7
+457,7
@@
wontoption(option)
fmt = dont;
}
sprintf(nfrontp, fmt, option);
fmt = dont;
}
sprintf(nfrontp, fmt, option);
- nfrontp += sizeof(doopt) - 2;
+ nfrontp += sizeof
(doopt) - 2;
}
dooption(option)
}
dooption(option)
@@
-455,7
+489,7
@@
dooption(option)
break;
}
sprintf(nfrontp, fmt, option);
break;
}
sprintf(nfrontp, fmt, option);
- nfrontp += sizeof(doopt) - 2;
+ nfrontp += sizeof
(doopt) - 2;
}
mode(on, off)
}
mode(on, off)
@@
-496,8
+530,8
@@
ptyflush()
if ((n = pfrontp - pbackp) > 0)
n = write(pty, pbackp, n);
if ((n = pfrontp - pbackp) > 0)
n = write(pty, pbackp, n);
- if (n < 0
&& errno == EWOULDBLOCK
)
-
n = 0
;
+ if (n < 0)
+
return
;
pbackp += n;
if (pbackp == pfrontp)
pbackp = pfrontp = ptyobuf;
pbackp += n;
if (pbackp == pfrontp)
pbackp = pfrontp = ptyobuf;
@@
-509,8
+543,12
@@
netflush()
if ((n = nfrontp - nbackp) > 0)
n = write(net, nbackp, n);
if ((n = nfrontp - nbackp) > 0)
n = write(net, nbackp, n);
- if (n < 0 && errno == EWOULDBLOCK)
- n = 0;
+ if (n < 0) {
+ if (errno == EWOULDBLOCK)
+ return;
+ /* should blow this guy away... */
+ return;
+ }
nbackp += n;
if (nbackp == nfrontp)
nbackp = nfrontp = netobuf;
nbackp += n;
if (nbackp == nfrontp)
nbackp = nfrontp = netobuf;
@@
-532,8
+570,8
@@
cleanup()
struct utmp wtmp;
char wtmpf[] = "/usr/adm/wtmp";
char utmp[] = "/etc/utmp";
struct utmp wtmp;
char wtmpf[] = "/usr/adm/wtmp";
char utmp[] = "/etc/utmp";
-#define SCPYN(a, b) strncpy(a, b, sizeof(a))
-#define SCMPN(a, b) strncmp(a, b, sizeof(a))
+#define SCPYN(a, b) strncpy(a, b, sizeof
(a))
+#define SCMPN(a, b) strncmp(a, b, sizeof
(a))
rmut()
{
rmut()
{
@@
-542,13
+580,13
@@
rmut()
f = open(utmp, 2);
if (f >= 0) {
f = open(utmp, 2);
if (f >= 0) {
- while(read(f, (char *)&wtmp, sizeof
(wtmp)) == sizeof
(wtmp)) {
+ while(read(f, (char *)&wtmp, sizeof
(wtmp)) == sizeof
(wtmp)) {
if (SCMPN(wtmp.ut_line, line+5) || wtmp.ut_name[0]==0)
continue;
if (SCMPN(wtmp.ut_line, line+5) || wtmp.ut_name[0]==0)
continue;
- lseek(f, -(long)sizeof(wtmp), 1);
+ lseek(f, -(long)sizeof
(wtmp), 1);
SCPYN(wtmp.ut_name, "");
time(&wtmp.ut_time);
SCPYN(wtmp.ut_name, "");
time(&wtmp.ut_time);
- write(f, (char *)&wtmp, sizeof(wtmp));
+ write(f, (char *)&wtmp, sizeof
(wtmp));
found++;
}
close(f);
found++;
}
close(f);
@@
-560,7
+598,7
@@
rmut()
SCPYN(wtmp.ut_name, "");
time(&wtmp.ut_time);
lseek(f, (long)0, 2);
SCPYN(wtmp.ut_name, "");
time(&wtmp.ut_time);
lseek(f, (long)0, 2);
- write(f, (char *)&wtmp, sizeof(wtmp));
+ write(f, (char *)&wtmp, sizeof
(wtmp));
close(f);
}
}
close(f);
}
}