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>
41 static char *Version
= "@(#) telnetd 1.00 (07/26/92)";
44 int opt_d
= 0; /* debugging output flag */
47 int main(int argc
, char *argv
[]);
48 void wtmp(int type
, int linenr
, char *line
, pid_t pid
, char *host
);
52 fprintf(stderr
, "Usage: telnetd [-dv]\n");
69 nwio_tcpconf_t tcpconf
;
70 struct hostent
*hostent
;
74 while ((c
= getopt(argc
, argv
, "dv")) != EOF
) switch(c
) {
83 /* No more arguments allowed. */
84 if (optind
!= argc
) usage();
86 /* Obtain the name of the remote host. */
87 if (ioctl(0, NWIOGTCPCONF
, &tcpconf
) < 0) {
88 sprintf(buff
, "Unable to obtain your IP address\r\n");
89 (void) write(1, buff
, strlen(buff
));
92 if ((hostent
= gethostbyaddr((char *) &tcpconf
.nwtc_remaddr
,
93 sizeof(tcpconf
.nwtc_remaddr
), AF_INET
)) != NULL
) {
94 hostname
= hostent
->h_name
;
96 hostname
= inet_ntoa(tcpconf
.nwtc_remaddr
);
99 /* Try allocating a PTY. */
100 if (get_pty(&pty_fd
, &tty_name
) < 0) {
101 sprintf(buff
, "I am sorry, but there is no free PTY left!\r\n");
102 (void) write(1, buff
, strlen(buff
));
106 /* Find the tty in the tty table. */
109 if ((ttyp
= getttyent()) == NULL
) {
110 sprintf(buff
, "Can't find the tty entry in the tty table\r\n");
111 (void) write(1, buff
, strlen(buff
));
113 if (strcmp(ttyp
->ty_name
, tty_name
+5) == 0) break;
118 /* Initialize the connection to an 8 bit clean channel. */
121 /* Fork off a child process and have it execute a getty(8). */
122 if ((pid
= fork()) == 0) {
123 /* Set up a new session. */
125 if ((tty_fd
= open(tty_name
, O_RDWR
)) < 0) {
126 sprintf(buff
, "Can't open %s\r\n", tty_name
);
127 (void) write(1, buff
, strlen(buff
));
136 (void) execl("/usr/sbin/getty", "getty", (char *)NULL
);
137 (void) execl("/usr/bin/getty", "getty", (char *)NULL
);
138 (void) execl("/usr/bin/login", "login", (char *)NULL
);
139 (void) write(1, "EXEC failed!\r\n", 14);
140 } else if (pid
< 0) {
141 sprintf(buff
, "I am sorry, but the fork(2) call failed!\r\n");
142 (void) write(1, buff
, strlen(buff
));
143 (void) close(pty_fd
);
147 wtmp(LOGIN_PROCESS
, lineno
, tty_name
+5, pid
, hostname
);
151 (void) close(pty_fd
);
153 wtmp(DEAD_PROCESS
, lineno
, tty_name
+5, pid
, hostname
);
155 chown(tty_name
, 0, 0);
156 chmod(tty_name
, 0666);