+# ifdef NEWINIT
+ if (argc > 0 && !strncmp(*argv, "-I", 2)) {
+ extern char *gen_id;
+
+ *argv += 2;
+ if (**argv == '\0') {
+ if (argc < 2) {
+ usage();
+ /* NOT REACHED */
+ }
+ argv++, argc--;
+ if (**argv == '\0') {
+ usage();
+ /* NOT REACHED */
+ }
+ }
+ gen_id = *argv;
+ goto top;
+ }
+# endif /* NEWINIT */
+#endif /* CRAY */
+
+#ifdef DIAGNOSTICS
+ /*
+ * Check for desired diagnostics capabilities.
+ */
+ if (argc > 0 && !strncmp(*argv, "-D", 2)) {
+ *argv += 2;
+ if (**argv == '\0') {
+ if (argc < 2) {
+ usage();
+ /* NOT REACHED */
+ }
+ argv++, argc--;
+ if (**argv == '\0') {
+ usage();
+ /* NOT REACHED */
+ }
+ }
+ if (!strcmp(*argv, "report")) {
+ diagnostic |= TD_REPORT|TD_OPTIONS;
+ } else if (!strcmp(*argv, "exercise")) {
+ diagnostic |= TD_EXERCISE;
+ } else if (!strcmp(*argv, "netdata")) {
+ diagnostic |= TD_NETDATA;
+ } else if (!strcmp(*argv, "ptydata")) {
+ diagnostic |= TD_PTYDATA;
+ } else if (!strcmp(*argv, "options")) {
+ diagnostic |= TD_OPTIONS;
+ } else {
+ usage();
+ /* NOT REACHED */
+ }
+ goto top;
+ }
+#endif /* DIAGNOSTICS */
+
+#ifdef BFTPDAEMON
+ /*
+ * Check for bftp daemon
+ */
+ if (argc > 0 && !strncmp(*argv, "-B", 2)) {
+ bftpd++;
+ goto top;
+ }
+#endif /* BFTPDAEMON */
+
+ if (argc > 0 && **argv == '-') {
+ fprintf(stderr, "telnetd: %s: unknown option\n", *argv+1);
+ usage();
+ /* NOT REACHED */
+ }
+
+ if (debug) {
+ int s, ns, foo;
+ struct servent *sp;
+ static struct sockaddr_in sin = { AF_INET };
+
+ if (argc > 1) {
+ usage();
+ /* NOT REACHED */
+ } else if (argc == 1) {
+ if (sp = getservbyname(*argv, "tcp")) {
+ sin.sin_port = sp->s_port;
+ } else {
+ sin.sin_port = atoi(*argv);
+ if ((int)sin.sin_port <= 0) {
+ fprintf(stderr, "telnetd: %s: bad port #\n", *argv);
+ usage();
+ /* NOT REACHED */
+ }
+ sin.sin_port = htons((u_short)sin.sin_port);
+ }
+ } else {
+ sp = getservbyname("telnet", "tcp");
+ if (sp == 0) {
+ fprintf(stderr, "telnetd: tcp/telnet: unknown service\n");
+ exit(1);
+ }
+ sin.sin_port = sp->s_port;
+ }
+
+ s = socket(AF_INET, SOCK_STREAM, 0);
+ if (s < 0) {
+ perror("telnetd: socket");;
+ exit(1);
+ }
+ (void) setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+ if (bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
+ perror("bind");
+ exit(1);
+ }
+ if (listen(s, 1) < 0) {
+ perror("listen");
+ exit(1);
+ }
+ foo = sizeof sin;
+ ns = accept(s, (struct sockaddr *)&sin, &foo);
+ if (ns < 0) {
+ perror("accept");
+ exit(1);
+ }
+ (void) dup2(ns, 0);
+ (void) close(ns);
+ (void) close(s);
+ } else if (argc > 0) {
+ usage();
+ /* NOT REACHED */
+ }
+
+ openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
+ fromlen = sizeof (from);
+ if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0) {
+ fprintf(stderr, "%s: ", progname);
+ perror("getpeername");
+ _exit(1);
+ }
+ if (setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
+ syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m");
+ }
+
+#if defined(HAS_IP_TOS) || defined(NEED_GETTOS)
+ if ((tp = gettosbyname("telnet", "tcp")) &&
+ (setsockopt(0, IPPROTO_IP, IP_TOS, &tp->t_tos, sizeof(int)) < 0))
+ syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
+#endif /* defined(HAS_IP_TOS) || defined(NEED_GETTOS) */
+ net = 0;
+ doit(&from);
+ /* NOTREACHED */
+} /* end of main */
+
+usage()
+{
+ fprintf(stderr, "Usage: telnetd [-debug] [-h]");
+#ifdef NEWINIT
+ fprintf(stderr, " [-Iinitid]");
+#endif /* NEWINIT */
+#ifdef DIAGNOSTICS
+ fprintf(stderr, " [-D (options|report|exercise|netdata|ptydata)]");
+#endif /* DIAGNOSTICS */
+#ifdef LINEMODE
+ fprintf(stderr, " [-l]");
+#endif
+#ifdef CRAY
+ fprintf(stderr, " [-r[lowpty]-[highpty]]");
+#endif
+#ifdef BFTPDAEMON
+ fprintf(stderr, " [-B]");
+#endif /* BFTPDAEMON */
+ fprintf(stderr, " [port]\n");
+ exit(1);