From: Jan Zeleny <[email protected]>

This patch allows all types of options supported by getopt_long to
be also supported by fcoeadm.

Signed-off-by: Jan Zeleny <[email protected]>
---

 fcoeadm.c |  105 +++++++++++++++++++++++++++++++++----------------------------
 1 files changed, 57 insertions(+), 48 deletions(-)

diff --git a/fcoeadm.c b/fcoeadm.c
index 72cfcbb..8265fbd 100644
--- a/fcoeadm.c
+++ b/fcoeadm.c
@@ -38,19 +38,19 @@ Copyright (c) 2009, Intel Corporation.\n\
 #define FCOE_CREATE    SYSFS_FCOE "/create"
 #define FCOE_DESTROY   SYSFS_FCOE "/destroy"
 
-#define FCHOSTBUFLEN    64
+#define FCHOSTBUFLEN           64
 
 static struct option fcoeadm_opts[] = {
-    {"create", 1, 0, 'c'},
-    {"destroy", 1, 0, 'd'},
-    {"reset", 1, 0, 'r'},
-    {"interface", 1, 0, 'a'},
-    {"target", 1, 0, 't'},
-    {"lun", 1, 0, 'l'},
-    {"stats", 1, 0, 's'},
-    {"help", 0, 0, 'h'},
-    {"version", 0, 0, 'v'},
-    {0, 0, 0, 0}
+       {"create", 1, 0, 'c'},
+       {"destroy", 1, 0, 'd'},
+       {"reset", 1, 0, 'r'},
+       {"interface", 1, 0, 'i'},
+       {"target", 1, 0, 't'},
+       {"lun", 1, 0, 'l'},
+       {"stats", 1, 0, 's'},
+       {"help", 0, 0, 'h'},
+       {"version", 0, 0, 'v'},
+       {0, 0, 0, 0}
 };
 
 struct opt_info _opt_info, *opt_info = &_opt_info;
@@ -320,7 +320,7 @@ fcoeadm_reset(char *ifname)
 
 /*
  * Parse a user-entered hex field.
- * Format may be  xx-xx-xx OR xxxxxx OR xx:xx:xx for len bytes (up to 8).
+ * Format may be xx-xx-xx OR xxxxxx OR xx:xx:xx for len bytes (up to 8).
  * Leading zeros may be omitted.
  */
 static int
@@ -449,74 +449,83 @@ int main(int argc, char *argv[])
                case 'c':
                        if ((argc < 2 || argc > 3) ||
                            strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1) ||
-                           ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2))
+                           ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
+                            argv[1][1] != '-'))
                                goto error;
                        rc = fcoeadm_create(optarg);
                        goto done;
                case 'd':
                        if ((argc < 2 || argc > 3) ||
                            strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1) ||
-                           ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2))
+                           ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
+                            argv[1][1] != '-'))
                                goto error;
                        rc = fcoeadm_destroy(optarg);
                        goto done;
                case 'r':
                        if ((argc < 2 || argc > 3) ||
                            strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1) ||
-                           ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2))
+                           ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
+                            argv[1][1] != '-'))
                                goto error;
                        rc = fcoeadm_reset(optarg);
                        goto done;
                case 'i':
-                       if (argc < 2 || argc > 3)
+                       if (argc < 2 || argc > 3 ||
+                           (argc == 3 && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
+                            (argv[1][1] != '-' || strchr(argv[1], '=')
+                             != NULL)))
                                goto error;
                        s = NULL;
-                       if (argc == 2 && argv[optind]) {
-                               if (strnlen(argv[optind], MAX_ARG_LEN) >
-                                               (IFNAMSIZ - 1))
+                       if (argc == 2) {
+                               if (argv[1][1] == '-')
+                                       s = strchr(argv[1], '=')+1;
+                               else
+                                       s = argv[1]+2;
+                       } else
+                               s = argv[2];
+
+                       if (s) {
+                               if (strnlen(s, MAX_ARG_LEN) > (IFNAMSIZ - 1))
                                        goto error;
-                               if (strnlen(argv[optind], MAX_ARG_LEN) > 2)
-                                       s = argv[optind] + 2;
-                       }
-                       if (argc == 3) {
-                               if ((optind == 1) &&
-                                   strnlen(argv[1], MAX_ARG_LEN) > 2)
-                                       goto error;
-                               s = argv[optind];
-                       }
-                       if (s)
                                strncpy(opt_info->ifname, s,
                                        sizeof(opt_info->ifname));
+                       }
                        if (strnlen(opt_info->ifname, IFNAMSIZ - 1)) {
                                if (fcoeadm_validate_interface(
-                                       opt_info->ifname,
-                                       fchost, FCHOSTBUFLEN))
+                                           opt_info->ifname,
+                                           fchost, FCHOSTBUFLEN))
                                goto error;
                        }
                        opt_info->a_flag = 1;
                        rc = fcoeadm_display_adapter_info(opt_info);
                        goto done;
                case 't':
-                       if ((argc < 2 || argc > 3) ||
-                           (argv[1] &&
-                            strnlen(argv[1], MAX_ARG_LEN) > (IFNAMSIZ - 1)) ||
-                           (argv[2] &&
-                            strnlen(argv[2], MAX_ARG_LEN) > (IFNAMSIZ - 1)))
+                       if (argc < 2 || argc > 3 ||
+                           (argc == 3 && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
+                            (argv[1][1] != '-' || strchr(argv[1], '=')
+                             != NULL)))
                                goto error;
-                       if (strnlen(argv[1], MAX_ARG_LEN) > 2) {
-                               if (argc >= 3)
+                       s = NULL;
+                       if (argc == 2) {
+                               if (argv[1][1] == '-')
+                                       s = strchr(argv[1], '=')+1;
+                               else
+                                       s = argv[1]+2;
+                       } else {
+                               s = argv[2];
+                       }
+                       if (s) {
+                               if (strnlen(s, MAX_ARG_LEN) > (IFNAMSIZ - 1))
                                        goto error;
-                               strncpy(opt_info->ifname, argv[1] + 2,
+                               strncpy(opt_info->ifname, s,
                                        sizeof(opt_info->ifname));
                        }
-                       if (argv[2])
-                               strncpy(opt_info->ifname, argv[2],
-                                       sizeof(opt_info->ifname));
                        if (strnlen(opt_info->ifname, IFNAMSIZ - 1)) {
                                if (fcoeadm_validate_interface(
-                                       opt_info->ifname,
-                                       fchost, FCHOSTBUFLEN))
-                               goto error;
+                                           opt_info->ifname,
+                                           fchost, FCHOSTBUFLEN))
+                                       goto error;
                        }
                        opt_info->t_flag = 1;
                        rc = fcoeadm_display_target_info(opt_info);
@@ -545,9 +554,9 @@ int main(int argc, char *argv[])
                                        sizeof(opt_info->ifname));
                        if (strnlen(opt_info->ifname, IFNAMSIZ - 1)) {
                                if (fcoeadm_validate_interface(
-                                       opt_info->ifname,
-                                       fchost, FCHOSTBUFLEN))
-                               goto error;
+                                           opt_info->ifname,
+                                           fchost, FCHOSTBUFLEN))
+                                       goto error;
                        }
                        opt_info->s_flag = 1;
                        if (argv[optind] && !strncmp(argv[optind], "-n", 2))

_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to