hexedit: position in correct column on "goto" command
[oweals/busybox.git] / networking / inetd.c
index aa35ffa2b879414634bb145a246ac10168b68ac5..67984accb56f297babb293b43af66cf8cd5cdc0c 100644 (file)
  *                      setgid(specified group)
  *                      setuid()
  */
+//config:config INETD
+//config:      bool "inetd (18 kb)"
+//config:      default y
+//config:      select FEATURE_SYSLOG
+//config:      help
+//config:      Internet superserver daemon
+//config:
+//config:config FEATURE_INETD_SUPPORT_BUILTIN_ECHO
+//config:      bool "Support echo service on port 7"
+//config:      default y
+//config:      depends on INETD
+//config:      help
+//config:      Internal service which echoes data back.
+//config:      Activated by configuration lines like these:
+//config:              echo stream tcp nowait root internal
+//config:              echo dgram  udp wait   root internal
+//config:
+//config:config FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
+//config:      bool "Support discard service on port 8"
+//config:      default y
+//config:      depends on INETD
+//config:      help
+//config:      Internal service which discards all input.
+//config:      Activated by configuration lines like these:
+//config:              discard stream tcp nowait root internal
+//config:              discard dgram  udp wait   root internal
+//config:
+//config:config FEATURE_INETD_SUPPORT_BUILTIN_TIME
+//config:      bool "Support time service on port 37"
+//config:      default y
+//config:      depends on INETD
+//config:      help
+//config:      Internal service which returns big-endian 32-bit number
+//config:      of seconds passed since 1900-01-01. The number wraps around
+//config:      on overflow.
+//config:      Activated by configuration lines like these:
+//config:              time stream tcp nowait root internal
+//config:              time dgram  udp wait   root internal
+//config:
+//config:config FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME
+//config:      bool "Support daytime service on port 13"
+//config:      default y
+//config:      depends on INETD
+//config:      help
+//config:      Internal service which returns human-readable time.
+//config:      Activated by configuration lines like these:
+//config:              daytime stream tcp nowait root internal
+//config:              daytime dgram  udp wait   root internal
+//config:
+//config:config FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
+//config:      bool "Support chargen service on port 19"
+//config:      default y
+//config:      depends on INETD
+//config:      help
+//config:      Internal service which generates endless stream
+//config:      of all ASCII chars beetween space and char 126.
+//config:      Activated by configuration lines like these:
+//config:              chargen stream tcp nowait root internal
+//config:              chargen dgram  udp wait   root internal
+//config:
+//config:config FEATURE_INETD_RPC
+//config:      bool "Support RPC services"
+//config:      default n  # very rarely used, and needs Sun RPC support in libc
+//config:      depends on INETD
+//config:      help
+//config:      Support Sun-RPC based services
+
+//applet:IF_INETD(APPLET(inetd, BB_DIR_USR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_INETD) += inetd.o
 
 //usage:#define inetd_trivial_usage
 //usage:       "[-fe] [-q N] [-R N] [CONFFILE]"
 //usage:       "Listen for network connections and launch programs\n"
 //usage:     "\n       -f      Run in foreground"
 //usage:     "\n       -e      Log to stderr"
-//usage:     "\n       -q N    Socket listen queue (default: 128)"
+//usage:     "\n       -q N    Socket listen queue (default 128)"
 //usage:     "\n       -R N    Pause services after N connects/min"
-//usage:     "\n               (default: 0 - disabled)"
+//usage:     "\n               (default 0 - disabled)"
+//usage:     "\n       Default CONFFILE is /etc/inetd.conf"
 
 #include <syslog.h>
 #include <sys/resource.h> /* setrlimit */
 
 #if ENABLE_FEATURE_INETD_RPC
 # if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__)
-#  error "You need to build uClibc with UCLIBC_HAS_RPC for NFS support"
+#  warning "You probably need to build uClibc with UCLIBC_HAS_RPC for NFS support"
+   /* not #error, since user may be using e.g. libtirpc instead */
 # endif
 # include <rpc/rpc.h>
 # include <rpc/pmap_clnt.h>
@@ -350,6 +422,7 @@ enum { LINE_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line) };
 #define allsock         (G.allsock        )
 #define line            (G.line           )
 #define INIT_G() do { \
+       setup_common_bufsiz(); \
        BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
        rlim_ofile_cur = OPEN_MAX; \
        global_queuelen = 128; \
@@ -1152,8 +1225,8 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
        if (real_uid != 0) /* run by non-root user */
                config_filename = NULL;
 
-       opt_complementary = "R+:q+"; /* -q N, -R N */
-       opt = getopt32(argv, "R:feq:", &max_concurrency, &global_queuelen);
+       /* -q N, -R N */
+       opt = getopt32(argv, "R:+feq:+", &max_concurrency, &global_queuelen);
        argv += optind;
        //argc -= optind;
        if (argv[0])
@@ -1459,8 +1532,11 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
        } /* for (;;) */
 }
 
-#if !BB_MMU
+#if ENABLE_FEATURE_INETD_SUPPORT_BUILTIN_ECHO \
+ || ENABLE_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
+# if !BB_MMU
 static const char *const cat_args[] = { "cat", NULL };
+# endif
 #endif
 
 /*
@@ -1471,14 +1547,14 @@ static const char *const cat_args[] = { "cat", NULL };
 /* ARGSUSED */
 static void FAST_FUNC echo_stream(int s, servtab_t *sep UNUSED_PARAM)
 {
-#if BB_MMU
+# if BB_MMU
        while (1) {
                ssize_t sz = safe_read(s, line, LINE_SIZE);
                if (sz <= 0)
                        break;
                xwrite(s, line, sz);
        }
-#else
+# else
        /* We are after vfork here! */
        /* move network socket to stdin/stdout */
        xmove_fd(s, STDIN_FILENO);
@@ -1488,7 +1564,7 @@ static void FAST_FUNC echo_stream(int s, servtab_t *sep UNUSED_PARAM)
        xopen(bb_dev_null, O_WRONLY);
        BB_EXECVP("cat", (char**)cat_args);
        /* on failure we return to main, which does exit(EXIT_FAILURE) */
-#endif
+# endif
 }
 static void FAST_FUNC echo_dg(int s, servtab_t *sep)
 {
@@ -1512,10 +1588,10 @@ static void FAST_FUNC echo_dg(int s, servtab_t *sep)
 /* ARGSUSED */
 static void FAST_FUNC discard_stream(int s, servtab_t *sep UNUSED_PARAM)
 {
-#if BB_MMU
+# if BB_MMU
        while (safe_read(s, line, LINE_SIZE) > 0)
                continue;
-#else
+# else
        /* We are after vfork here! */
        /* move network socket to stdin */
        xmove_fd(s, STDIN_FILENO);
@@ -1526,7 +1602,7 @@ static void FAST_FUNC discard_stream(int s, servtab_t *sep UNUSED_PARAM)
        xdup2(STDOUT_FILENO, STDERR_FILENO);
        BB_EXECVP("cat", (char**)cat_args);
        /* on failure we return to main, which does exit(EXIT_FAILURE) */
-#endif
+# endif
 }
 /* ARGSUSED */
 static void FAST_FUNC discard_dg(int s, servtab_t *sep UNUSED_PARAM)
@@ -1623,7 +1699,7 @@ static uint32_t machtime(void)
        struct timeval tv;
 
        gettimeofday(&tv, NULL);
-       return htonl((uint32_t)(tv.tv_sec + 2208988800));
+       return htonl((uint32_t)(tv.tv_sec + 2208988800U));
 }
 /* ARGSUSED */
 static void FAST_FUNC machtime_stream(int s, servtab_t *sep UNUSED_PARAM)