2 * TNET A server program for MINIX which implements the TCP/IP
3 * suite of networking protocols. It is based on the
4 * TCP/IP code written by Phil Karn et al, as found in
5 * his NET package for Packet Radio communications.
7 * This file contains an implementation of the "server"
8 * for the TELNET protocol. This protocol can be used to
9 * remote-login on other systems, just like a normal TTY
12 * Usage: telnetd [-dv]
14 * Version: @(#)telnetd.c 1.00 07/26/92
16 * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
17 * Michael Temari, <temari@temari.ae.ge.com>
19 #include <sys/types.h>
22 #include <sys/ioctl.h>
32 #include <net/gen/in.h>
33 #include <net/gen/tcp.h>
34 #include <net/gen/tcp_io.h>
35 #include <net/gen/socket.h>
36 #include <net/gen/netdb.h>
37 #include <net/gen/inet.h>
40 static char *Version
= "@(#) telnetd 1.00 (07/26/92)";
42 int opt_d
= 0; /* debugging output flag */
44 _PROTOTYPE(void usage
, (void));
45 _PROTOTYPE(int main
, (int argc
, char *argv
[]));
46 _PROTOTYPE(void wtmp
, (int type
, int linenr
, char *line
, pid_t pid
,
51 fprintf(stderr
, "Usage: telnetd [-dv]\n");
68 nwio_tcpconf_t tcpconf
;
69 struct hostent
*hostent
;
73 while ((c
= getopt(argc
, argv
, "dv")) != EOF
) switch(c
) {
82 /* No more arguments allowed. */
83 if (optind
!= argc
) usage();
85 /* Obtain the name of the remote host. */
86 if (ioctl(0, NWIOGTCPCONF
, &tcpconf
) < 0) {
87 sprintf(buff
, "Unable to obtain your IP address\r\n");
88 (void) write(1, buff
, strlen(buff
));
91 if ((hostent
= gethostbyaddr((char *) &tcpconf
.nwtc_remaddr
,
92 sizeof(tcpconf
.nwtc_remaddr
), AF_INET
)) != NULL
) {
93 hostname
= hostent
->h_name
;
95 hostname
= inet_ntoa(tcpconf
.nwtc_remaddr
);
98 /* Try allocating a PTY. */
99 if (get_pty(&pty_fd
, &tty_name
) < 0) {
100 sprintf(buff
, "I am sorry, but there is no free PTY left!\r\n");
101 (void) write(1, buff
, strlen(buff
));
105 /* Find the tty in the tty table. */
108 if ((ttyp
= getttyent()) == NULL
) {
109 sprintf(buff
, "Can't find %s in the tty table\r\n");
110 (void) write(1, buff
, strlen(buff
));
112 if (strcmp(ttyp
->ty_name
, tty_name
+5) == 0) break;
117 /* Initialize the connection to an 8 bit clean channel. */
120 /* Fork off a child process and have it execute a getty(8). */
121 if ((pid
= fork()) == 0) {
122 /* Set up a new session. */
124 if ((tty_fd
= open(tty_name
, O_RDWR
)) < 0) {
125 sprintf(buff
, "Can't open %s\r\n", tty_name
);
126 (void) write(1, buff
, strlen(buff
));
135 (void) execl("/usr/sbin/getty", "getty", (char *)NULL
);
136 (void) execl("/usr/bin/getty", "getty", (char *)NULL
);
137 (void) execl("/usr/bin/login", "login", (char *)NULL
);
138 (void) write(1, "EXEC failed!\r\n", 14);
139 } else if (pid
< 0) {
140 sprintf(buff
, "I am sorry, but the fork(2) call failed!\r\n");
141 (void) write(1, buff
, strlen(buff
));
142 (void) close(pty_fd
);
146 wtmp(LOGIN_PROCESS
, lineno
, tty_name
+5, pid
, hostname
);
150 (void) close(pty_fd
);
152 wtmp(DEAD_PROCESS
, lineno
, tty_name
+5, pid
, hostname
);
154 chown(tty_name
, 0, 0);
155 chmod(tty_name
, 0666);