VirtualBox

Changeset 100785 in vbox for trunk


Ignore:
Timestamp:
Aug 3, 2023 1:02:17 PM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158669
Message:

Frontends/VBoxManage: Update 'VBoxManage usbfilter ...' to utilize
RTGetOpt() for command option parsing. bugref:10452

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageUSB.cpp

    r100772 r100785  
    185185    USBFilterCmd cmd;
    186186
    187     /* at least: 0: command, 1: index, 2: --target, 3: <target value> */
    188     if (a->argc < 4)
    189         return errorSyntax(Usb::tr("Not enough parameters"));
    190 
    191187    /* which command? */
    192188    cmd.mAction = USBFilterCmd::Invalid;
    193     if      (!strcmp(a->argv[0], "add"))
     189    if (!strcmp(a->argv[0], "add"))
    194190    {
    195191        cmd.mAction = USBFilterCmd::Add;
     
    208204
    209205    if (cmd.mAction == USBFilterCmd::Invalid)
    210         return errorSyntax(Usb::tr("Invalid parameter '%s'"), a->argv[0]);
     206        return errorUnknownSubcommand(a->argv[0]);
    211207
    212208    /* which index? */
    213     if (VINF_SUCCESS !=  RTStrToUInt32Full(a->argv[1], 10, &cmd.mIndex))
     209    if (VINF_SUCCESS != RTStrToUInt32Full(a->argv[1], 10, &cmd.mIndex))
    214210        return errorSyntax(Usb::tr("Invalid index '%s'"), a->argv[1]);
    215211
    216     switch (cmd.mAction)
    217     {
    218         case USBFilterCmd::Add:
    219         case USBFilterCmd::Modify:
    220         {
    221             /* at least: 0: command, 1: index, 2: --target, 3: <target value>, 4: --name, 5: <name value> */
    222             if (a->argc < 6)
    223             {
    224                 if (cmd.mAction == USBFilterCmd::Add)
    225                     return errorSyntax(Usb::tr("Not enough parameters"));
    226 
    227                 return errorSyntax(Usb::tr("Not enough parameters"));
    228             }
    229 
    230             // set Active to true by default
    231             // (assuming that the user sets up all necessary attributes
    232             // at once and wants the filter to be active immediately)
    233             if (cmd.mAction == USBFilterCmd::Add)
    234                 cmd.mFilter.mActive = true;
    235 
    236             for (int i = 2; i < a->argc; i++)
    237             {
    238                 if (   !strcmp(a->argv[i], "--target")
    239                     || !strcmp(a->argv[i], "-target"))
    240                 {
    241                     if (a->argc <= i + 1 || !*a->argv[i+1])
    242                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    243                     i++;
    244                     if (!strcmp(a->argv[i], "global"))
     212    if (cmd.mAction == USBFilterCmd::Add || cmd.mAction == USBFilterCmd::Modify)
     213    {
     214        // set Active to true by default
     215        // (assuming that the user sets up all necessary attributes
     216        // at once and wants the filter to be active immediately)
     217        if (cmd.mAction == USBFilterCmd::Add)
     218            cmd.mFilter.mActive = true;
     219
     220        RTGETOPTSTATE               GetState;
     221        RTGETOPTUNION               ValueUnion;
     222        static const RTGETOPTDEF    s_aOptions[] =
     223        {
     224            { "--target",               't',    RTGETOPT_REQ_STRING },
     225            { "--name",                 'n',    RTGETOPT_REQ_STRING },
     226            { "--active",               'a',    RTGETOPT_REQ_STRING },
     227            { "--vendorid",             'v',    RTGETOPT_REQ_STRING },
     228            { "--productid",            'p',    RTGETOPT_REQ_STRING },
     229            { "--revision",             'r',    RTGETOPT_REQ_STRING },
     230            { "--manufacturer",         'm',    RTGETOPT_REQ_STRING },
     231            { "--product",              'P',    RTGETOPT_REQ_STRING },
     232            { "--serialnumber",         's',    RTGETOPT_REQ_STRING },
     233            { "--port",                 'o',    RTGETOPT_REQ_STRING },
     234            { "--remote",               'R',    RTGETOPT_REQ_STRING },
     235            { "--maskedinterfaces",     'M',    RTGETOPT_REQ_UINT32 },
     236            { "--action",               'A',    RTGETOPT_REQ_STRING }
     237        };
     238
     239        int vrc = RTGetOptInit(&GetState, a->argc, a->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, 0 /*fFlags*/);
     240        AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     241
     242        while ((vrc = RTGetOpt(&GetState, &ValueUnion)) != 0)
     243        {
     244            switch (vrc)
     245            {
     246                case 't':   // --target
     247                    if (!strcmp(ValueUnion.psz, "global"))
    245248                        cmd.mGlobal = true;
    246249                    else
    247                     {
    248                         /* assume it's a UUID of a machine */
    249                         CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[i]).raw(),
     250                        CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(ValueUnion.psz).raw(),
    250251                                                                   cmd.mMachine.asOutParam()), RTEXITCODE_FAILURE);
    251                     }
    252                 }
    253                 else if (   !strcmp(a->argv[i], "--name")
    254                          || !strcmp(a->argv[i], "-name"))
    255                 {
    256                     if (a->argc <= i + 1 || !*a->argv[i+1])
    257                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    258                     i++;
    259                     cmd.mFilter.mName = a->argv[i];
    260                 }
    261                 else if (   !strcmp(a->argv[i], "--active")
    262                          || !strcmp(a->argv[i], "-active"))
    263                 {
    264                     if (a->argc <= i + 1)
    265                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    266                     i++;
    267                     if (!strcmp(a->argv[i], "yes"))
     252                    break;
     253                case 'n':   // --name
     254                    cmd.mFilter.mName = ValueUnion.psz;
     255                    break;
     256                case 'a':   // --active
     257                    if (!strcmp(ValueUnion.psz, "yes"))
    268258                        cmd.mFilter.mActive = true;
    269                     else if (!strcmp(a->argv[i], "no"))
     259                    else if (!strcmp(ValueUnion.psz, "no"))
    270260                        cmd.mFilter.mActive = false;
    271                     else
    272                         return errorArgument(Usb::tr("Invalid --active argument '%s'"), a->argv[i]);
    273                 }
    274                 else if (   !strcmp(a->argv[i], "--vendorid")
    275                          || !strcmp(a->argv[i], "-vendorid"))
    276                 {
    277                     if (a->argc <= i + 1)
    278                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    279                     i++;
    280                     cmd.mFilter.mVendorId = a->argv[i];
    281                 }
    282                 else if (   !strcmp(a->argv[i], "--productid")
    283                          || !strcmp(a->argv[i], "-productid"))
    284                 {
    285                     if (a->argc <= i + 1)
    286                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    287                     i++;
    288                     cmd.mFilter.mProductId = a->argv[i];
    289                 }
    290                 else if (   !strcmp(a->argv[i], "--revision")
    291                          || !strcmp(a->argv[i], "-revision"))
    292                 {
    293                     if (a->argc <= i + 1)
    294                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    295                     i++;
    296                     cmd.mFilter.mRevision = a->argv[i];
    297                 }
    298                 else if (   !strcmp(a->argv[i], "--manufacturer")
    299                          || !strcmp(a->argv[i], "-manufacturer"))
    300                 {
    301                     if (a->argc <= i + 1)
    302                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    303                     i++;
    304                     cmd.mFilter.mManufacturer = a->argv[i];
    305                 }
    306                 else if (!strcmp(a->argv[i], "--port"))
    307                 {
    308                     if (a->argc <= i + 1)
    309                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    310                     i++;
    311                     cmd.mFilter.mPort = a->argv[i];
    312                 }
    313                 else if (   !strcmp(a->argv[i], "--product")
    314                          || !strcmp(a->argv[i], "-product"))
    315                 {
    316                     if (a->argc <= i + 1)
    317                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    318                     i++;
    319                     cmd.mFilter.mProduct = a->argv[i];
    320                 }
    321                 else if (   !strcmp(a->argv[i], "--remote")
    322                          || !strcmp(a->argv[i], "-remote"))
    323                 {
    324                     if (a->argc <= i + 1)
    325                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    326                     i++;
    327                     cmd.mFilter.mRemote = a->argv[i];
    328                 }
    329                 else if (   !strcmp(a->argv[i], "--serialnumber")
    330                          || !strcmp(a->argv[i], "-serialnumber"))
    331                 {
    332                     if (a->argc <= i + 1)
    333                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    334                     i++;
    335                     cmd.mFilter.mSerialNumber = a->argv[i];
    336                 }
    337                 else if (   !strcmp(a->argv[i], "--maskedinterfaces")
    338                          || !strcmp(a->argv[i], "-maskedinterfaces"))
    339                 {
    340                     if (a->argc <= i + 1)
    341                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    342                     i++;
    343                     uint32_t u32;
    344                     int vrc = RTStrToUInt32Full(a->argv[i], 0, &u32);
    345                     if (RT_FAILURE(vrc))
    346                         return errorArgument(Usb::tr("Failed to convert the --maskedinterfaces value '%s' to a number, vrc=%Rrc"),
    347                                              a->argv[i], vrc);
    348                     cmd.mFilter.mMaskedInterfaces = u32;
    349                 }
    350                 else if (   !strcmp(a->argv[i], "--action")
    351                          || !strcmp(a->argv[i], "-action"))
    352                 {
    353                     if (a->argc <= i + 1)
    354                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    355                     i++;
    356                     if (!strcmp(a->argv[i], "ignore"))
     261                   else
     262                        return errorArgument(Usb::tr("Invalid --active argument '%s'"), ValueUnion.psz);
     263                    break;
     264                case 'v':   // --vendorid
     265                    cmd.mFilter.mVendorId = ValueUnion.psz;
     266                    break;
     267                case 'p':   // --productid
     268                    cmd.mFilter.mProductId = ValueUnion.psz;
     269                    break;
     270                case 'r':   // --revision
     271                    cmd.mFilter.mRevision = ValueUnion.psz;
     272                    break;
     273                case 'm':   // --manufacturer
     274                    cmd.mFilter.mManufacturer = ValueUnion.psz;
     275                    break;
     276                case 'P':   // --product
     277                    cmd.mFilter.mProduct = ValueUnion.psz;
     278                    break;
     279                case 's':   // --serialnumber
     280                    cmd.mFilter.mSerialNumber = ValueUnion.psz;
     281                    break;
     282                case 'o':   // --port
     283                    cmd.mFilter.mPort = ValueUnion.psz;
     284                    break;
     285                case 'R':   // --remote
     286                    cmd.mFilter.mRemote = ValueUnion.psz;
     287                    break;
     288                case 'M':   // --maskedinterfaces
     289                    cmd.mFilter.mMaskedInterfaces = ValueUnion.u32;
     290                    break;
     291                case 'A':   // --action
     292                    if (!strcmp(ValueUnion.psz, "ignore"))
    357293                        cmd.mFilter.mAction = USBDeviceFilterAction_Ignore;
    358                     else if (!strcmp(a->argv[i], "hold"))
     294                    else if (!strcmp(ValueUnion.psz, "hold"))
    359295                        cmd.mFilter.mAction = USBDeviceFilterAction_Hold;
    360296                    else
    361                         return errorArgument(Usb::tr("Invalid USB filter action '%s'"), a->argv[i]);
    362                 }
    363                 else
    364                     return errorSyntax(Usb::tr("Unknown option '%s'"), a->argv[i]);
    365             }
    366 
    367             if (cmd.mAction == USBFilterCmd::Add)
    368             {
    369                 // mandatory/forbidden options
    370                 if (   cmd.mFilter.mName.isEmpty()
    371                     ||
    372                        (   cmd.mGlobal
    373                         && cmd.mFilter.mAction == USBDeviceFilterAction_Null
    374                        )
    375                     || (   !cmd.mGlobal
    376                         && !cmd.mMachine)
    377                     || (   cmd.mGlobal
    378                         && !cmd.mFilter.mRemote.isEmpty())
    379                    )
    380                 {
    381                     return errorSyntax(Usb::tr("Mandatory options not supplied"));
    382                 }
    383             }
    384             break;
    385         }
    386 
    387         case USBFilterCmd::Remove:
    388         {
    389             /* at least: 0: command, 1: index, 2: --target, 3: <target value> */
    390             if (a->argc < 4)
    391                 return errorSyntax(Usb::tr("Not enough parameters"));
    392 
    393             for (int i = 2; i < a->argc; i++)
    394             {
    395                 if (   !strcmp(a->argv[i], "--target")
    396                     || !strcmp(a->argv[i], "-target"))
    397                 {
    398                     if (a->argc <= i + 1 || !*a->argv[i+1])
    399                         return errorArgument(Usb::tr("Missing argument to '%s'"), a->argv[i]);
    400                     i++;
    401                     if (!strcmp(a->argv[i], "global"))
     297                        return errorArgument(Usb::tr("Invalid USB filter action '%s'"), ValueUnion.psz);
     298                    break;
     299                default:
     300                    return errorGetOpt(vrc, &ValueUnion);
     301            }
     302        }
     303
     304        // mandatory/forbidden options
     305        if (!cmd.mGlobal && !cmd.mMachine)
     306            return errorSyntax(Usb::tr("Missing required option: --target"));
     307
     308        if (cmd.mAction == USBFilterCmd::Add)
     309        {
     310            if (cmd.mFilter.mName.isEmpty())
     311                return errorSyntax(Usb::tr("Missing required option: --name"));
     312
     313            if (cmd.mGlobal && cmd.mFilter.mAction == USBDeviceFilterAction_Null)
     314                return errorSyntax(Usb::tr("Missing required option: --action"));
     315
     316            if (cmd.mGlobal && !cmd.mFilter.mRemote.isEmpty())
     317                return errorSyntax(Usb::tr("Option --remote applies to VM filters only (--target=<uuid|vmname>)"));
     318        }
     319    }
     320    else if (cmd.mAction == USBFilterCmd::Remove)
     321    {
     322        RTGETOPTSTATE               GetState;
     323        RTGETOPTUNION               ValueUnion;
     324        static const RTGETOPTDEF    s_aOptions[] =
     325        {
     326                { "--target",    't',    RTGETOPT_REQ_STRING }
     327        };
     328        int vrc = RTGetOptInit(&GetState, a->argc, a->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, 0 /*fFlags*/);
     329        AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     330
     331        while ((vrc = RTGetOpt(&GetState, &ValueUnion)) != 0)
     332        {
     333            switch (vrc)
     334            {
     335                case 't':   // --target
     336                    if (!strcmp(ValueUnion.psz, "global"))
    402337                        cmd.mGlobal = true;
    403338                    else
    404                     {
    405                         CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[i]).raw(),
     339                        CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(ValueUnion.psz).raw(),
    406340                                                                   cmd.mMachine.asOutParam()), RTEXITCODE_FAILURE);
    407                     }
    408                 }
    409             }
    410 
    411             // mandatory options
    412             if (!cmd.mGlobal && !cmd.mMachine)
    413                 return errorSyntax(Usb::tr("Mandatory options not supplied"));
    414 
    415             break;
    416         }
    417 
    418         default: break;
     341                    break;
     342                default:
     343                    return errorGetOpt(vrc, &ValueUnion);
     344            }
     345        }
     346        // mandatory options
     347        if (!cmd.mGlobal && !cmd.mMachine)
     348            return errorSyntax(Usb::tr("Missing required option: --target"));
    419349    }
    420350
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette