- Timestamp:
- Aug 3, 2023 1:02:17 PM (19 months ago)
- svn:sync-xref-src-repo-rev:
- 158669
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxManage/VBoxManageUSB.cpp
r100772 r100785 185 185 USBFilterCmd cmd; 186 186 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 191 187 /* which command? */ 192 188 cmd.mAction = USBFilterCmd::Invalid; 193 if 189 if (!strcmp(a->argv[0], "add")) 194 190 { 195 191 cmd.mAction = USBFilterCmd::Add; … … 208 204 209 205 if (cmd.mAction == USBFilterCmd::Invalid) 210 return error Syntax(Usb::tr("Invalid parameter '%s'"),a->argv[0]);206 return errorUnknownSubcommand(a->argv[0]); 211 207 212 208 /* which index? */ 213 if (VINF_SUCCESS != 209 if (VINF_SUCCESS != RTStrToUInt32Full(a->argv[1], 10, &cmd.mIndex)) 214 210 return errorSyntax(Usb::tr("Invalid index '%s'"), a->argv[1]); 215 211 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")) 245 248 cmd.mGlobal = true; 246 249 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(), 250 251 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")) 268 258 cmd.mFilter.mActive = true; 269 else if (!strcmp( a->argv[i], "no"))259 else if (!strcmp(ValueUnion.psz, "no")) 270 260 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")) 357 293 cmd.mFilter.mAction = USBDeviceFilterAction_Ignore; 358 else if (!strcmp( a->argv[i], "hold"))294 else if (!strcmp(ValueUnion.psz, "hold")) 359 295 cmd.mFilter.mAction = USBDeviceFilterAction_Hold; 360 296 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")) 402 337 cmd.mGlobal = true; 403 338 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(), 406 340 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")); 419 349 } 420 350
Note:
See TracChangeset
for help on using the changeset viewer.