xatonum.h: add comment
[oweals/busybox.git] / networking / telnetd.c
index 7b799dcf836ed3c92a7f4a4b162b05853d3b8313..cccf03dfd54944bd88ff059eab52392117511db5 100644 (file)
@@ -228,10 +228,11 @@ make_new_session(
 #if ENABLE_FEATURE_TELNETD_STANDALONE
        ts->sockfd_read = sock;
        ndelay_on(sock);
-       if (!sock) /* We are called with fd 0 - we are in inetd mode */
-               sock++;
+       if (!sock) { /* We are called with fd 0 - we are in inetd mode */
+               sock++; /* so use fd 1 for output */
+               ndelay_on(sock);
+       }
        ts->sockfd_write = sock;
-       ndelay_on(sock);
        if (sock > maxfd)
                maxfd = sock;
 #else
@@ -313,6 +314,14 @@ make_new_session(
        _exit(1); /*bb_perror_msg_and_die("execv %s", loginpath);*/
 }
 
+/* Must match getopt32 string */
+enum {
+       OPT_WATCHCHILD = (1 << 2), /* -K */
+       OPT_INETD      = (1 << 3) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -i */
+       OPT_PORT       = (1 << 4) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -p */
+       OPT_FOREGROUND = (1 << 6) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -F */
+};
+
 #if ENABLE_FEATURE_TELNETD_STANDALONE
 
 static void
@@ -320,6 +329,9 @@ free_session(struct tsession *ts)
 {
        struct tsession *t = sessions;
 
+       if (option_mask32 & OPT_INETD)
+               exit(0);
+
        /* Unlink this telnet session from the session list */
        if (t == ts)
                sessions = ts->next;
@@ -340,7 +352,7 @@ free_session(struct tsession *ts)
        close(ts->sockfd_read);
        /* We do not need to close(ts->sockfd_write), it's the same
         * as sockfd_read unless we are in inetd mode. But in inetd mode
-        * we do not free_session(), ever */
+        * we do not reach this */
        free(ts);
 
        /* Scan all sessions and find new maxfd */
@@ -362,8 +374,8 @@ free_session(struct tsession *ts)
 
 #else /* !FEATURE_TELNETD_STANDALONE */
 
-/* Never actually called */
-void free_session(struct tsession *ts);
+/* Used in main() only, thus exits. */
+#define free_session(ts) return 0
 
 #endif
 
@@ -406,13 +418,6 @@ int telnetd_main(int argc, char **argv)
                portnbr = 23,
        };
 #endif
-       enum {
-               OPT_WATCHCHILD = (1 << 2), /* -K */
-               OPT_INETD      = (1 << 3) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -i */
-               OPT_PORT       = (1 << 4) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -p */
-               OPT_FOREGROUND = (1 << 6) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -F */
-       };
-
        /* Even if !STANDALONE, we accept (and ignore) -i, thus people
         * don't need to guess whether it's ok to pass -i to us */
        opt = getopt32(argv, "f:l:Ki" USE_FEATURE_TELNETD_STANDALONE("p:b:F"),
@@ -492,11 +497,8 @@ int telnetd_main(int argc, char **argv)
        while (ts) {
                struct tsession *next = ts->next; /* in case we free ts. */
                if (ts->shell_pid == -1) {
-#if !ENABLE_FEATURE_TELNETD_STANDALONE
-                       return 0;
-#else
+                       /* Child died ad we detected that */
                        free_session(ts);
-#endif
                } else {
                        if (ts->size1 > 0)       /* can write to pty */
                                FD_SET(ts->ptyfd, &wrfdset);
@@ -631,14 +633,8 @@ int telnetd_main(int argc, char **argv)
                ts = next;
                continue;
  kill_session:
-#if !ENABLE_FEATURE_TELNETD_STANDALONE
-               return 0;
-#else
-               if (IS_INETD)
-                       return 0;
                free_session(ts);
                ts = next;
-#endif
        }
 
        goto again;