*: add most of the required setup_common_bufsiz() calls
[oweals/busybox.git] / networking / inetd.c
index b3f2e9fbcca1335c22c28dd7441c548671ed9a5f..8d44b5198add30342d857ce7da4efc67125aefe3 100644 (file)
 #include <sys/un.h>
 
 #include "libbb.h"
+#include "common_bufsiz.h"
 
 #if ENABLE_FEATURE_INETD_RPC
 # if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__)
@@ -327,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      )
@@ -352,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"; \
@@ -645,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];
@@ -675,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
@@ -688,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;
        }
@@ -725,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;
@@ -815,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.
@@ -834,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. */