- int s, pid, options;
- 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, "-d")) {
- 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((u_short)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
-again:
- s = socket(AF_INET, SOCK_STREAM, 0, 0);
- if (s < 0) {
- perror("telnetd: socket");;
- sleep(5);
- goto again;
- }
- if (options & SO_DEBUG)
- if (setsockopt(s, SOL_SOCKET, SO_DEBUG, 0, 0) < 0)
- perror("telnetd: setsockopt (SO_DEBUG)");
-#ifdef notdef
- if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0) < 0)
- perror("telnetd: setsockopt (SO_KEEPALIVE)");
-#endif
- while (bind(s, (caddr_t)&sin, sizeof (sin), 0) < 0) {
- perror("telnetd: bind");
- sleep(5);
+ struct sockaddr_in from;
+ int on = 1, fromlen;
+
+ fromlen = sizeof (from);
+ if (getpeername(0, &from, &fromlen) < 0) {
+ fprintf(stderr, "%s: ", argv[0]);
+ perror("getpeername");
+ _exit(1);