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 */
45 int main(int argc
, char *argv
[]);
46 void wtmp(int type
, int linenr
, char *line
, pid_t pid
, char *host
);
50 fprintf(stderr
, "Usage: telnetd [-dv]\n");
67 nwio_tcpconf_t tcpconf
;
68 struct hostent
*hostent
;
72 while ((c
= getopt(argc
, argv
, "dv")) != EOF
) switch(c
) {
81 /* No more arguments allowed. */
82 if (optind
!= argc
) usage();
84 /* Obtain the name of the remote host. */
85 if (ioctl(0, NWIOGTCPCONF
, &tcpconf
) < 0) {
86 sprintf(buff
, "Unable to obtain your IP address\r\n");
87 (void) write(1, buff
, strlen(buff
));
90 if ((hostent
= gethostbyaddr((char *) &tcpconf
.nwtc_remaddr
,
91 sizeof(tcpconf
.nwtc_remaddr
), AF_INET
)) != NULL
) {
92 hostname
= hostent
->h_name
;
94 hostname
= inet_ntoa(tcpconf
.nwtc_remaddr
);
97 /* Try allocating a PTY. */
98 if (get_pty(&pty_fd
, &tty_name
) < 0) {
99 sprintf(buff
, "I am sorry, but there is no free PTY left!\r\n");
100 (void) write(1, buff
, strlen(buff
));
104 /* Find the tty in the tty table. */
107 if ((ttyp
= getttyent()) == NULL
) {
108 sprintf(buff
, "Can't find %s in the tty table\r\n");
109 (void) write(1, buff
, strlen(buff
));
111 if (strcmp(ttyp
->ty_name
, tty_name
+5) == 0) break;
116 /* Initialize the connection to an 8 bit clean channel. */
119 /* Fork off a child process and have it execute a getty(8). */
120 if ((pid
= fork()) == 0) {
121 /* Set up a new session. */
123 if ((tty_fd
= open(tty_name
, O_RDWR
)) < 0) {
124 sprintf(buff
, "Can't open %s\r\n", tty_name
);
125 (void) write(1, buff
, strlen(buff
));
134 (void) execl("/usr/sbin/getty", "getty", (char *)NULL
);
135 (void) execl("/usr/bin/getty", "getty", (char *)NULL
);
136 (void) execl("/usr/bin/login", "login", (char *)NULL
);
137 (void) write(1, "EXEC failed!\r\n", 14);
138 } else if (pid
< 0) {
139 sprintf(buff
, "I am sorry, but the fork(2) call failed!\r\n");
140 (void) write(1, buff
, strlen(buff
));
141 (void) close(pty_fd
);
145 wtmp(LOGIN_PROCESS
, lineno
, tty_name
+5, pid
, hostname
);
149 (void) close(pty_fd
);
151 wtmp(DEAD_PROCESS
, lineno
, tty_name
+5, pid
, hostname
);
153 chown(tty_name
, 0, 0);
154 chmod(tty_name
, 0666);