*: add most of the required setup_common_bufsiz() calls
[oweals/busybox.git] / networking / inetd.c
index 1308d74c7436110af84736bde60d23be77d2a02d..8d44b5198add30342d857ce7da4efc67125aefe3 100644 (file)
 //usage:     "\n               (default: 0 - disabled)"
 
 #include <syslog.h>
+#include <sys/resource.h> /* setrlimit */
 #include <sys/socket.h> /* un.h may need this */
 #include <sys/un.h>
 
 #include "libbb.h"
+#include "common_bufsiz.h"
 
 #if ENABLE_FEATURE_INETD_RPC
 # if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__)
 #define ENABLE_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN 0
 #endif
 
-#define _PATH_INETDPID  "/var/run/inetd.pid"
-
 #define CNT_INTERVAL    60      /* servers in CNT_INTERVAL sec. */
 #define RETRYTIME       60      /* retry after bind or server fail */
 
@@ -328,11 +328,8 @@ struct globals {
        /* Used in next_line(), and as scratch read buffer */
        char line[256];          /* _at least_ 256, see LINE_SIZE */
 } FIX_ALIASING;
-#define G (*(struct globals*)&bb_common_bufsiz1)
+#define G (*(struct globals*)bb_common_bufsiz1)
 enum { LINE_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line) };
-struct BUG_G_too_big {
-       char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
-};
 #define rlim_ofile_cur  (G.rlim_ofile_cur )
 #define rlim_ofile      (G.rlim_ofile     )
 #define serv_list       (G.serv_list      )
@@ -353,6 +350,8 @@ struct BUG_G_too_big {
 #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; \
        config_filename = "/etc/inetd.conf"; \
@@ -646,7 +645,7 @@ static servtab_t *dup_servtab(servtab_t *sep)
 }
 
 /* gcc generates much more code if this is inlined */
-static servtab_t *parse_one_line(void)
+static NOINLINE servtab_t *parse_one_line(void)
 {
        int argc;
        char *token[6+MAXARGV];
@@ -676,6 +675,8 @@ static servtab_t *parse_one_line(void)
                         * default host for the following lines. */
                        free(default_local_hostname);
                        default_local_hostname = sep->se_local_hostname;
+                       /*sep->se_local_hostname = NULL; - redundant */
+                       /* (we'll overwrite this field anyway) */
                        goto more;
                }
        } else
@@ -689,10 +690,10 @@ static servtab_t *parse_one_line(void)
  parse_err:
                bb_error_msg("parse error on line %u, line is ignored",
                                parser->lineno);
-               free_servtab_strings(sep);
                /* Just "goto more" can make sep to carry over e.g.
                 * "rpc"-ness (by having se_rpcver_lo != 0).
                 * We will be more paranoid: */
+               free_servtab_strings(sep);
                free(sep);
                goto new;
        }
@@ -726,7 +727,7 @@ static servtab_t *parse_one_line(void)
                        goto parse_err;
 #endif
                }
-               if (strncmp(arg, "rpc/", 4) == 0) {
+               if (is_prefixed_with(arg, "rpc/")) {
 #if ENABLE_FEATURE_INETD_RPC
                        unsigned n;
                        arg += 4;
@@ -816,7 +817,7 @@ static servtab_t *parse_one_line(void)
        }
 #endif
        argc = 0;
-       while ((arg = token[6+argc]) != NULL && argc < MAXARGV)
+       while (argc < MAXARGV && (arg = token[6+argc]) != NULL)
                sep->se_argv[argc++] = xstrdup(arg);
        /* Some inetd.conf files have no argv's, not even argv[0].
         * Fix them up.
@@ -835,10 +836,10 @@ static servtab_t *parse_one_line(void)
                        goto parse_err;
        }
 
-//     bb_info_msg(
-//             "ENTRY[%s][%s][%s][%d][%d][%d][%d][%d][%s][%s][%s]",
-//             sep->se_local_hostname, sep->se_service, sep->se_proto, sep->se_wait, sep->se_proto_no,
-//             sep->se_max, sep->se_count, sep->se_time, sep->se_user, sep->se_group, sep->se_program);
+       //bb_error_msg(
+       //      "ENTRY[%s][%s][%s][%d][%d][%d][%d][%d][%s][%s][%s]",
+       //      sep->se_local_hostname, sep->se_service, sep->se_proto, sep->se_wait, sep->se_proto_no,
+       //      sep->se_max, sep->se_count, sep->se_time, sep->se_user, sep->se_group, sep->se_program);
 
        /* check if the hostname specifier is a comma separated list
         * of hostnames. we'll make new entries for each address. */
@@ -1131,7 +1132,7 @@ static void clean_up_and_exit(int sig UNUSED_PARAM)
                if (ENABLE_FEATURE_CLEAN_UP)
                        close(sep->se_fd);
        }
-       remove_pidfile(_PATH_INETDPID);
+       remove_pidfile(CONFIG_PID_FILE_PATH "/inetd.pid");
        exit(EXIT_SUCCESS);
 }
 
@@ -1180,7 +1181,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
                setgroups(1, &gid);
        }
 
-       write_pidfile(_PATH_INETDPID);
+       write_pidfile(CONFIG_PID_FILE_PATH "/inetd.pid");
 
        /* never fails under Linux (except if you pass it bad arguments) */
        getrlimit(RLIMIT_NOFILE, &rlim_ofile);
@@ -1655,7 +1656,7 @@ static void FAST_FUNC daytime_stream(int s, servtab_t *sep UNUSED_PARAM)
 {
        time_t t;
 
-       t = time(NULL);
+       time(&t);
        fdprintf(s, "%.24s\r\n", ctime(&t));
 }
 static void FAST_FUNC daytime_dg(int s, servtab_t *sep)