eal: rework long options parsing
authorDavid Marchand <david.marchand@6wind.com>
Mon, 22 Sep 2014 08:38:00 +0000 (10:38 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 23 Sep 2014 13:33:00 +0000 (15:33 +0200)
Identify all options through the getopt_long return value.
This way, we only need a big switch/case.

Indentation is broken to ease commit review (fixed in next commit).

Suggested-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David Marchand <david.marchand@6wind.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
lib/librte_eal/bsdapp/eal/eal.c
lib/librte_eal/common/eal_common_options.c
lib/librte_eal/common/include/eal_options.h
lib/librte_eal/linuxapp/eal/eal.c

index 58f00fd..c4b75a4 100644 (file)
@@ -354,8 +354,7 @@ eal_parse_args(int argc, char **argv)
                if (opt == '?')
                        return -1;
 
-               ret = eal_parse_common_option(opt, optarg, option_index,
-                                             &internal_config);
+               ret = eal_parse_common_option(opt, optarg, &internal_config);
                /* common parser is not happy */
                if (ret < 0) {
                        eal_usage(prgname);
@@ -371,21 +370,15 @@ eal_parse_args(int argc, char **argv)
                }
 
                switch (opt) {
-               /* long options */
-               case 0:
-                       {
-                               RTE_LOG(ERR, EAL, "Option %s is not supported "
-                                       "on FreeBSD\n",
-                                       eal_long_options[option_index].name);
-                               eal_usage(prgname);
-                               return -1;
-                       }
-                       break;
-
                default:
-                       if (isprint(opt)) {
+                       if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
                                RTE_LOG(ERR, EAL, "Option %c is not supported "
                                        "on FreeBSD\n", opt);
+                       } else if (opt >= OPT_LONG_MIN_NUM &&
+                                  opt < OPT_LONG_MAX_NUM) {
+                               RTE_LOG(ERR, EAL, "Option %s is not supported "
+                                       "on FreeBSD\n",
+                                       eal_long_options[option_index].name);
                        } else {
                                RTE_LOG(ERR, EAL, "Option %d is not supported "
                                        "on FreeBSD\n", opt);
index ead4300..4009f02 100644 (file)
@@ -63,24 +63,24 @@ eal_short_options[] =
 
 const struct option
 eal_long_options[] = {
-       {OPT_HUGE_DIR, 1, 0, 0},
-       {OPT_PROC_TYPE, 1, 0, 0},
-       {OPT_NO_SHCONF, 0, 0, 0},
-       {OPT_NO_HPET, 0, 0, 0},
-       {OPT_VMWARE_TSC_MAP, 0, 0, 0},
-       {OPT_NO_PCI, 0, 0, 0},
-       {OPT_NO_HUGE, 0, 0, 0},
-       {OPT_FILE_PREFIX, 1, 0, 0},
-       {OPT_SOCKET_MEM, 1, 0, 0},
-       {OPT_PCI_WHITELIST, 1, 0, 'w'},
-       {OPT_PCI_BLACKLIST, 1, 0, 'b'},
-       {OPT_VDEV, 1, 0, 0},
-       {OPT_SYSLOG, 1, NULL, 0},
-       {OPT_LOG_LEVEL, 1, NULL, 0},
-       {OPT_BASE_VIRTADDR, 1, 0, 0},
-       {OPT_XEN_DOM0, 0, 0, 0},
-       {OPT_CREATE_UIO_DEV, 1, NULL, 0},
-       {OPT_VFIO_INTR, 1, NULL, 0},
+       {OPT_HUGE_DIR, 1, 0, OPT_HUGE_DIR_NUM},
+       {OPT_PROC_TYPE, 1, 0, OPT_PROC_TYPE_NUM},
+       {OPT_NO_SHCONF, 0, 0, OPT_NO_SHCONF_NUM},
+       {OPT_NO_HPET, 0, 0, OPT_NO_HPET_NUM},
+       {OPT_VMWARE_TSC_MAP, 0, 0, OPT_VMWARE_TSC_MAP_NUM},
+       {OPT_NO_PCI, 0, 0, OPT_NO_PCI_NUM},
+       {OPT_NO_HUGE, 0, 0, OPT_NO_HUGE_NUM},
+       {OPT_FILE_PREFIX, 1, 0, OPT_FILE_PREFIX_NUM},
+       {OPT_SOCKET_MEM, 1, 0, OPT_SOCKET_MEM_NUM},
+       {OPT_PCI_WHITELIST, 1, 0, OPT_PCI_WHITELIST_NUM},
+       {OPT_PCI_BLACKLIST, 1, 0, OPT_PCI_BLACKLIST_NUM},
+       {OPT_VDEV, 1, 0, OPT_VDEV_NUM},
+       {OPT_SYSLOG, 1, NULL, OPT_SYSLOG_NUM},
+       {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM},
+       {OPT_BASE_VIRTADDR, 1, 0, OPT_BASE_VIRTADDR_NUM},
+       {OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},
+       {OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},
+       {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},
        {0, 0, 0, 0}
 };
 
@@ -238,7 +238,7 @@ eal_parse_proc_type(const char *arg)
 }
 
 int
-eal_parse_common_option(int opt, const char *optarg, int longindex,
+eal_parse_common_option(int opt, const char *optarg,
                        struct internal_config *conf)
 {
        switch (opt) {
@@ -296,32 +296,46 @@ eal_parse_common_option(int opt, const char *optarg, int longindex,
                break;
 
        /* long options */
-       case 0:
-               if (!strcmp(eal_long_options[longindex].name, OPT_NO_HUGE)) {
+       case OPT_NO_HUGE_NUM:
                        conf->no_hugetlbfs = 1;
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_NO_PCI)) {
+               break;
+
+       case OPT_NO_PCI_NUM:
                        conf->no_pci = 1;
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_NO_HPET)) {
+               break;
+
+       case OPT_NO_HPET_NUM:
                        conf->no_hpet = 1;
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_VMWARE_TSC_MAP)) {
+               break;
+
+       case OPT_VMWARE_TSC_MAP_NUM:
                        conf->vmware_tsc_map = 1;
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_NO_SHCONF)) {
+               break;
+
+       case OPT_NO_SHCONF_NUM:
                        conf->no_shconf = 1;
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_PROC_TYPE)) {
+               break;
+
+       case OPT_PROC_TYPE_NUM:
                        conf->process_type = eal_parse_proc_type(optarg);
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_VDEV)) {
+               break;
+
+       case OPT_VDEV_NUM:
                        if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
                                        optarg) < 0) {
                                return -1;
                        }
-               } else if (!strcmp(eal_long_options[longindex].name, OPT_SYSLOG)) {
+               break;
+
+       case OPT_SYSLOG_NUM:
                        if (eal_parse_syslog(optarg, conf) < 0) {
                                RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                OPT_SYSLOG "\n");
                                return -1;
                        }
-               } else if (!strcmp(eal_long_options[longindex].name,
-                                OPT_LOG_LEVEL)) {
+               break;
+
+       case OPT_LOG_LEVEL_NUM: {
                        uint32_t log;
 
                        if (eal_parse_log_level(optarg, &log) < 0) {
@@ -331,9 +345,8 @@ eal_parse_common_option(int opt, const char *optarg, int longindex,
                                return -1;
                        }
                        conf->log_level = log;
-               }
-
                break;
+               }
 
        /* don't know what to do, leave this to caller */
        default:
index 4e6b90d..22819ec 100644 (file)
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+
+enum {
+       /* long options mapped to a short option */
 #define OPT_PCI_WHITELIST "pci-whitelist"
+       OPT_PCI_WHITELIST_NUM = 'w',
 #define OPT_PCI_BLACKLIST "pci-blacklist"
+       OPT_PCI_BLACKLIST_NUM = 'b',
 
+       /* first long only option value must be >= 256, so that we won't
+        * conflict with short options */
+       OPT_LONG_MIN_NUM = 256,
 #define OPT_HUGE_DIR    "huge-dir"
+       OPT_HUGE_DIR_NUM = OPT_LONG_MIN_NUM,
 #define OPT_PROC_TYPE   "proc-type"
+       OPT_PROC_TYPE_NUM,
 #define OPT_NO_SHCONF   "no-shconf"
+       OPT_NO_SHCONF_NUM,
 #define OPT_NO_HPET     "no-hpet"
+       OPT_NO_HPET_NUM,
 #define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
+       OPT_VMWARE_TSC_MAP_NUM,
 #define OPT_NO_PCI      "no-pci"
+       OPT_NO_PCI_NUM,
 #define OPT_NO_HUGE     "no-huge"
+       OPT_NO_HUGE_NUM,
 #define OPT_FILE_PREFIX "file-prefix"
+       OPT_FILE_PREFIX_NUM,
 #define OPT_SOCKET_MEM  "socket-mem"
+       OPT_SOCKET_MEM_NUM,
 #define OPT_VDEV        "vdev"
+       OPT_VDEV_NUM,
 #define OPT_SYSLOG      "syslog"
+       OPT_SYSLOG_NUM,
 #define OPT_LOG_LEVEL   "log-level"
+       OPT_LOG_LEVEL_NUM,
 #define OPT_BASE_VIRTADDR   "base-virtaddr"
+       OPT_BASE_VIRTADDR_NUM,
 #define OPT_XEN_DOM0    "xen-dom0"
+       OPT_XEN_DOM0_NUM,
 #define OPT_CREATE_UIO_DEV "create-uio-dev"
+       OPT_CREATE_UIO_DEV_NUM,
 #define OPT_VFIO_INTR    "vfio-intr"
+       OPT_VFIO_INTR_NUM,
+       OPT_LONG_MAX_NUM
+};
 
 extern const char eal_short_options[];
 extern const struct option eal_long_options[];
 
-int eal_parse_common_option(int opt, const char *argv, int longindex,
+int eal_parse_common_option(int opt, const char *argv,
                            struct internal_config *conf);
 void eal_common_usage(void);
index d82debf..1d468dd 100644 (file)
@@ -553,8 +553,7 @@ eal_parse_args(int argc, char **argv)
                if (opt == '?')
                        return -1;
 
-               ret = eal_parse_common_option(opt, optarg, option_index,
-                                             &internal_config);
+               ret = eal_parse_common_option(opt, optarg, &internal_config);
                /* common parser is not happy */
                if (ret < 0) {
                        eal_usage(prgname);
@@ -584,8 +583,7 @@ eal_parse_args(int argc, char **argv)
                        break;
 
                /* long options */
-               case 0:
-                       if (!strcmp(eal_long_options[option_index].name, OPT_XEN_DOM0)) {
+               case OPT_XEN_DOM0_NUM:
                #ifdef RTE_LIBRTE_XEN_DOM0
                                internal_config.xen_dom0_support = 1;
                #else
@@ -594,46 +592,56 @@ eal_parse_args(int argc, char **argv)
                                        " RTE_LIBRTE_XEN_DOM0=y\n");
                                return -1;
                #endif
-                       } else if (!strcmp(eal_long_options[option_index].name, OPT_HUGE_DIR)) {
+                       break;
+
+               case OPT_HUGE_DIR_NUM:
                                internal_config.hugepage_dir = optarg;
-                       } else if (!strcmp(eal_long_options[option_index].name, OPT_FILE_PREFIX)) {
+                       break;
+
+               case OPT_FILE_PREFIX_NUM:
                                internal_config.hugefile_prefix = optarg;
-                       } else if (!strcmp(eal_long_options[option_index].name, OPT_SOCKET_MEM)) {
+                       break;
+
+               case OPT_SOCKET_MEM_NUM:
                                if (eal_parse_socket_mem(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                        OPT_SOCKET_MEM "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       } else if (!strcmp(eal_long_options[option_index].name, OPT_BASE_VIRTADDR)) {
+                       break;
+
+               case OPT_BASE_VIRTADDR_NUM:
                                if (eal_parse_base_virtaddr(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameter for --"
                                                        OPT_BASE_VIRTADDR "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       } else if (!strcmp(eal_long_options[option_index].name, OPT_VFIO_INTR)) {
+                       break;
+
+               case OPT_VFIO_INTR_NUM:
                                if (eal_parse_vfio_intr(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                        OPT_VFIO_INTR "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       } else if (!strcmp(eal_long_options[option_index].name, OPT_CREATE_UIO_DEV)) {
+                       break;
+
+               case OPT_CREATE_UIO_DEV_NUM:
                                internal_config.create_uio_dev = 1;
-                       } else {
-                               RTE_LOG(ERR, EAL, "Option %s is not supported "
-                                       "on Linux\n",
-                                       eal_long_options[option_index].name);
-                               eal_usage(prgname);
-                               return -1;
-                       }
                        break;
 
                default:
-                       if (isprint(opt)) {
+                       if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
                                RTE_LOG(ERR, EAL, "Option %c is not supported "
                                        "on Linux\n", opt);
+                       } else if (opt >= OPT_LONG_MIN_NUM &&
+                                  opt < OPT_LONG_MAX_NUM) {
+                               RTE_LOG(ERR, EAL, "Option %s is not supported "
+                                       "on Linux\n",
+                                       eal_long_options[option_index].name);
                        } else {
                                RTE_LOG(ERR, EAL, "Option %d is not supported "
                                        "on Linux\n", opt);