Someone mentioned zonecfg was the cause of some similar awkwardness...

So here's a patch attached for that.

Darren

------- usr/src/cmd/zonecfg/zonecfg.c -------

Index: usr/src/cmd/zonecfg/zonecfg.c
*** /biscuit/onnv/usr/src/cmd/zonecfg/zonecfg.c Mon Mar 24 17:30:38 2008
--- /biscuit/onnv_20080608/usr/src/cmd/zonecfg/zonecfg.c        Mon Jun  9 
11:47:41 2008
***************
*** 1071,1076 ****
--- 1071,1077 ----
                    execname, cmd_to_str(CMD_HELP));
                (void) fprintf(fp, "\t%s -z <zone>\t\t\t(%s)\n",
                    execname, gettext("interactive"));
+               (void) fprintf(fp, "\t%s <command> <zone>\n", execname);
                (void) fprintf(fp, "\t%s -z <zone> <command>\n", execname);
                (void) fprintf(fp, "\t%s -z <zone> -f <command-file>\n",
                    execname);
***************
*** 6653,6689 ****
        return (execbasename);
  }
  
! int
! main(int argc, char *argv[])
  {
!       int err, arg;
!       struct stat st;
! 
!       /* This must be before anything goes to stdout. */
!       setbuf(stdout, NULL);
! 
!       saw_error = B_FALSE;
!       cmd_file_mode = B_FALSE;
!       execname = get_execbasename(argv[0]);
! 
!       (void) setlocale(LC_ALL, "");
!       (void) textdomain(TEXT_DOMAIN);
! 
!       if (getzoneid() != GLOBAL_ZONEID) {
!               zerr(gettext("%s can only be run from the global zone."),
!                   execname);
!               exit(Z_ERR);
!       }
! 
!       if (argc < 2) {
!               usage(B_FALSE, HELP_USAGE | HELP_SUBCMDS);
                exit(Z_USAGE);
        }
!       if (strcmp(argv[1], cmd_to_str(CMD_HELP)) == 0) {
!               (void) one_command_at_a_time(argc - 1, &(argv[1]));
!               exit(Z_OK);
!       }
  
        while ((arg = getopt(argc, argv, "?f:R:z:")) != EOF) {
                switch (arg) {
                case '?':
--- 6654,6679 ----
        return (execbasename);
  }
  
! static void
! set_zonename(char *zonename)
  {
!       if (strcmp(zonename, GLOBAL_ZONENAME) == 0) {
!               global_zone = B_TRUE;
!       } else if (zonecfg_validate_zonename(zonename) != Z_OK) {
!               zone_perror(zonename, Z_BOGUS_ZONE_NAME, B_TRUE);
!               usage(B_FALSE, HELP_SYNTAX);
                exit(Z_USAGE);
        }
!       (void) strlcpy(zone, zonename, sizeof (zone));
!       (void) strlcpy(revert_zone, zonename, sizeof (zone));
! }
  
+ static void
+ get_clioptions(int argc, char *argv[])
+ {
+       struct stat st;
+       int arg;
+ 
        while ((arg = getopt(argc, argv, "?f:R:z:")) != EOF) {
                switch (arg) {
                case '?':
***************
*** 6712,6726 ****
                        zonecfg_set_root(optarg);
                        break;
                case 'z':
!                       if (strcmp(optarg, GLOBAL_ZONENAME) == 0) {
!                               global_zone = B_TRUE;
!                       } else if (zonecfg_validate_zonename(optarg) != Z_OK) {
!                               zone_perror(optarg, Z_BOGUS_ZONE_NAME, B_TRUE);
!                               usage(B_FALSE, HELP_SYNTAX);
!                               exit(Z_USAGE);
!                       }
!                       (void) strlcpy(zone, optarg, sizeof (zone));
!                       (void) strlcpy(revert_zone, optarg, sizeof (zone));
                        break;
                default:
                        usage(B_FALSE, HELP_USAGE);
--- 6702,6708 ----
                        zonecfg_set_root(optarg);
                        break;
                case 'z':
!                       set_zonename(optarg);
                        break;
                default:
                        usage(B_FALSE, HELP_USAGE);
***************
*** 6727,6733 ****
--- 6709,6761 ----
                        exit(Z_USAGE);
                }
        }
+ }
  
+ int
+ main(int argc, char *argv[])
+ {
+       int err;
+ 
+       /* This must be before anything goes to stdout. */
+       setbuf(stdout, NULL);
+ 
+       saw_error = B_FALSE;
+       cmd_file_mode = B_FALSE;
+       execname = get_execbasename(argv[0]);
+ 
+       (void) setlocale(LC_ALL, "");
+       (void) textdomain(TEXT_DOMAIN);
+ 
+       if (getzoneid() != GLOBAL_ZONEID) {
+               zerr(gettext("%s can only be run from the global zone."),
+                   execname);
+               exit(Z_ERR);
+       }
+ 
+       if (argc < 2) {
+               usage(B_FALSE, HELP_USAGE | HELP_SUBCMDS);
+               exit(Z_USAGE);
+       }
+       if (strcmp(argv[1], cmd_to_str(CMD_HELP)) == 0) {
+               (void) one_command_at_a_time(argc - 1, &(argv[1]));
+               exit(Z_OK);
+       }
+ 
+       if (argc >= 3 && *argv[1] != '-' && *argv[2] != '-') {
+               /*
+                * We're assuming that the command line has been written
+                * as "zonecfg subcmd zonename" but the parser for the CLI
+                * assumes "zonecfg -z zone subcmd".  If we move the
+                * subcommand and adjust optind, we can fake having parsed
+                * the "-z zonename"...
+                */
+               set_zonename(argv[2]);
+               argv[2] = argv[1];
+               optind++;
+       } else {
+               get_clioptions(argc, argv);
+       }
+ 
        if (optind > argc || strcmp(zone, "") == 0) {
                usage(B_FALSE, HELP_USAGE);
                exit(Z_USAGE);
_______________________________________________
zones-discuss mailing list
zones-discuss@opensolaris.org

Reply via email to