Index: /trunk/include/iprt/getopt.h
===================================================================
--- /trunk/include/iprt/getopt.h	(revision 24139)
+++ /trunk/include/iprt/getopt.h	(revision 24140)
@@ -84,6 +84,8 @@
 /** The value must be a valid UUID. */
 #define RTGETOPT_REQ_UUID                       15
+/** The value must be a string with value as "on" or "off". */
+#define RTGETOPT_REQ_BOOL_ONOFF                 16
 /** The mask of the valid required types. */
-#define RTGETOPT_REQ_MASK                       15
+#define RTGETOPT_REQ_MASK                       31
 /** Treat the value as hexadecimal - only applicable with the RTGETOPT_REQ_*INT*. */
 #define RTGETOPT_FLAG_HEX                       RT_BIT(16)
@@ -172,4 +174,6 @@
     /** An unsigned integer value. */
     uint64_t        u;
+    /** A boolean flag. */
+    bool            f;
 } RTGETOPTUNION;
 /** Pointer to an option argument union. */
Index: /trunk/src/VBox/Runtime/common/misc/getopt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/misc/getopt.cpp	(revision 24139)
+++ /trunk/src/VBox/Runtime/common/misc/getopt.cpp	(revision 24140)
@@ -280,4 +280,16 @@
         case RTGETOPT_REQ_STRING:
             pValueUnion->psz = pszValue;
+            break;
+
+        case RTGETOPT_REQ_BOOL_ONOFF:
+            if (!RTStrICmp(pszValue, "on"))
+                pValueUnion->f = true;
+            else if (!RTStrICmp(pszValue, "off"))
+                pValueUnion->f = false;
+            else
+            {
+                pValueUnion->psz = pszValue;
+                return VERR_GETOPT_UNKNOWN_OPTION;
+            }
             break;
 
Index: /trunk/src/VBox/Runtime/testcase/tstGetOpt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstGetOpt.cpp	(revision 24139)
+++ /trunk/src/VBox/Runtime/testcase/tstGetOpt.cpp	(revision 24140)
@@ -97,4 +97,6 @@
         { "--twovaluesindex",   406, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
         { "--threevalues",      407, RTGETOPT_REQ_UINT32 },
+        { "--boolean",          408, RTGETOPT_REQ_BOOL_ONOFF },
+        { "--booleanindex",     409, RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX },
     };
 
@@ -154,4 +156,11 @@
         "--twovaluesindex5=2",             "0xB",
         "--threevalues",     "1",          "0xC",          "thirdvalue",
+
+        "--boolean",         "on",
+        "--boolean",         "off",
+        "--boolean",         "invalid",
+        "--booleanindex2",   "on",
+        "--booleanindex7",   "off",
+        "--booleanindex9",   "invalid",
 
         NULL
@@ -333,4 +342,22 @@
     CHECK(GetState.uIndex == UINT64_MAX);
 
+    /* bool on/off tests */
+    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 408, 2);
+    CHECK(Val.f);
+    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 408, 2);
+    CHECK(!Val.f);
+    CHECK_GETOPT(RTGetOpt(&GetState, &Val), VERR_GETOPT_UNKNOWN_OPTION, 2);
+    CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "invalid"));
+
+    /* bool on/off with indexed argument */
+    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 409, 2);
+    CHECK(Val.f);
+    CHECK(GetState.uIndex == 2);
+    CHECK_GETOPT(RTGetOpt(&GetState, &Val), 409, 2);
+    CHECK(!Val.f);
+    CHECK(GetState.uIndex == 7);
+    CHECK_GETOPT(RTGetOpt(&GetState, &Val), VERR_GETOPT_UNKNOWN_OPTION, 2);
+    CHECK(VALID_PTR(Val.psz) && !strcmp(Val.psz, "invalid"));
+
     /* the end */
     CHECK_GETOPT(RTGetOpt(&GetState, &Val), 0, 0);
