void showLogo(PRTSTREAM pStrm) { static bool s_fShown; /* show only once */ if (!s_fShown) { RTStrmPrintf(pStrm, VBOX_PRODUCT " Command Line Management Interface Version " VBOX_VERSION_STRING "\n" "(C) 2005-" VBOX_C_YEAR " " VBOX_VENDOR "\n" "All rights reserved.\n" "\n"); s_fShown = true; } }
/** * @interface_method_impl{FNDISREADBYTES} */ static DECLCALLBACK(int) MyDisasInstrRead(PDISSTATE pDis, uint8_t offInstr, uint8_t cbMinRead, uint8_t cbMaxRead) { PMYDISSTATE pState = (PMYDISSTATE)pDis; RTUINTPTR uSrcAddr = pState->Dis.uInstrAddr + offInstr; if (RT_LIKELY( pState->uNextAddr == uSrcAddr && pState->cbLeft >= cbMinRead)) { /* * Straight forward reading. */ //size_t cbToRead = cbMaxRead; size_t cbToRead = cbMinRead; memcpy(&pState->Dis.abInstr[offInstr], pState->pbNext, cbToRead); pState->Dis.cbCachedInstr = offInstr + cbToRead; pState->pbNext += cbToRead; pState->cbLeft -= cbToRead; pState->uNextAddr += cbToRead; return VINF_SUCCESS; } if (pState->uNextAddr == uSrcAddr) { /* * Reading too much. */ if (pState->cbLeft > 0) { memcpy(&pState->Dis.abInstr[offInstr], pState->pbNext, pState->cbLeft); offInstr += (uint8_t)pState->cbLeft; cbMinRead -= (uint8_t)pState->cbLeft; pState->pbNext += pState->cbLeft; pState->uNextAddr += pState->cbLeft; pState->cbLeft = 0; } memset(&pState->Dis.abInstr[offInstr], 0xcc, cbMinRead); pState->rc = VERR_EOF; } else { /* * Non-sequential read, that's an error. */ RTStrmPrintf(g_pStdErr, "Reading before current instruction!\n"); memset(&pState->Dis.abInstr[offInstr], 0x90, cbMinRead); pState->rc = VERR_INTERNAL_ERROR; } pState->Dis.cbCachedInstr = offInstr + cbMinRead; return pState->rc; }
/** * Print debug message depending on the m_cVerbosity level. * * @param iMinLevel The minimum m_cVerbosity level for this message. * @param fMsg Whether to dump parts for the current service message. * @param pszFmt The message format string. * @param va Optional arguments. */ void VBoxNetBaseService::debugPrintV(int iMinLevel, bool fMsg, const char *pszFmt, va_list va) const { RT_NOREF(fMsg); if (iMinLevel <= m->m_cVerbosity) { va_list vaCopy; /* This dude is *very* special, thus the copy. */ va_copy(vaCopy, va); RTStrmPrintf(g_pStdErr, "%s: %s: %N\n", RTProcShortName(), iMinLevel >= 2 ? "debug" : "info", pszFmt, &vaCopy); va_end(vaCopy); } }
/** * Print a usage synopsis and the syntax error message. * @returns RTEXITCODE_SYNTAX. */ RTEXITCODE errorSyntaxEx(USAGECATEGORY fCategory, uint32_t fSubCategory, const char *pszFormat, ...) { va_list args; showLogo(g_pStdErr); // show logo even if suppressed #ifndef VBOX_ONLY_DOCS if (g_fInternalMode) printUsageInternal(fCategory, g_pStdErr); else printUsage(fCategory, fSubCategory, g_pStdErr); #endif /* !VBOX_ONLY_DOCS */ va_start(args, pszFormat); RTStrmPrintf(g_pStdErr, "\nSyntax error: %N\n", pszFormat, &args); va_end(args); return RTEXITCODE_SYNTAX; }
static void logMessageV(const char *pszPrefix, const char *pszFormat, va_list va) { va_list vaCopy; if (RTR3InitIsInitialized()) { va_copy(vaCopy, va); LogRel(("%s%N\n", pszPrefix, pszFormat, &vaCopy)); va_end(vaCopy); } #ifdef IN_GUEST /** @todo Could be subject to pre-iprt-init issues, but hopefully not... */ va_copy(vaCopy, va); RTStrmPrintf(g_pStdErr, "%s%N\n", pszPrefix, pszFormat, &vaCopy); va_end(vaCopy); #endif }
static int tstRTCreateProcEx4Child(int argc, char **argv) { int rc = RTR3InitExeNoArguments(0); if (RT_FAILURE(rc)) return RTMsgInitFailure(rc); int cErrors = 0; for (int i = 0; i < argc; i++) if (strcmp(argv[i], g_apszArgs4[i])) { RTStrmPrintf(g_pStdErr, "child4: argv[%2u]='%s'\n" "child4: expected='%s'\n", i, argv[i], g_apszArgs4[i]); cErrors++; } return cErrors == 0 ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; }
/** * @interface_method_impl{TXSTRANSPORT,pfnUsage} */ DECLCALLBACK(void) txsTcpUsage(PRTSTREAM pStream) { RTStrmPrintf(pStream, " --tcp-mode <both|client|server>\n" " Selects the mode of operation.\n" " Default: both\n" " --tcp-bind-address <address>\n" " The address(es) to listen to TCP connection on. Empty string\n" " means any address, this is the default.\n" " --tcp-bind-port <port>\n" " The port to listen to TCP connections on.\n" " Default: %u\n" " --tcp-connect-address <address>\n" " The address of the server to try connect to in client mode.\n" " Default: " TXS_TCP_DEF_CONNECT_ADDRESS "\n" " --tcp-connect-port <port>\n" " The port on the server to connect to in client mode.\n" " Default: %u\n" , TXS_TCP_DEF_BIND_PORT, TXS_TCP_DEF_CONNECT_PORT); }
static int rtMsgWorker(PRTSTREAM pDst, const char *pszPrefix, const char *pszFormat, va_list va) { if ( !*pszFormat || !strcmp(pszFormat, "\n")) RTStrmPrintf(pDst, "\n"); else { const char *pszProgName = g_pszProgName; if (!pszProgName) g_pszProgName = pszProgName = &g_szrtProcExePath[g_offrtProcName]; char *pszMsg; ssize_t cch = RTStrAPrintfV(&pszMsg, pszFormat, va); if (cch >= 0) { /* print it line by line. */ char *psz = pszMsg; do { char *pszEnd = strchr(psz, '\n'); if (!pszEnd) { RTStrmPrintf(pDst, "%s: %s%s\n", pszProgName, pszPrefix, psz); break; } if (pszEnd == psz) RTStrmPrintf(pDst, "\n"); else { *pszEnd = '\0'; RTStrmPrintf(pDst, "%s: %s%s\n", pszProgName, pszPrefix, psz); } psz = pszEnd + 1; } while (*psz); RTStrFree(pszMsg); } else { /* Simple fallback for handling out-of-memory conditions. */ RTStrmPrintf(pDst, "%s: %s", pszProgName, pszPrefix); RTStrmPrintfV(pDst, pszFormat, va); if (!strchr(pszFormat, '\n')) RTStrmPrintf(pDst, "\n"); } } return VINF_SUCCESS; }
/** * Entry point. */ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv) { /* * Instantiate the DHCP server and hand it the options. */ VBoxNetDhcp *pDhcp = new VBoxNetDhcp(); if (!pDhcp) { RTStrmPrintf(g_pStdErr, "VBoxNetDHCP: new VBoxNetDhcp failed!\n"); return 1; } int rc = pDhcp->parseArgs(argc - 1, argv + 1); if (rc) return rc; pDhcp->init(); /* * Try connect the server to the network. */ rc = pDhcp->tryGoOnline(); if (RT_FAILURE(rc)) { delete pDhcp; return 1; } /* * Process requests. */ g_pDhcp = pDhcp; rc = pDhcp->run(); pDhcp->done(); g_pDhcp = NULL; delete pDhcp; return 0; }
static int tstRTCreateProcEx6Child(int argc, char **argv) { int rc = RTR3InitExeNoArguments(0); if (RT_FAILURE(rc)) return RTMsgInitFailure(rc); int cErrors = 0; char szValue[_16K]; /* * Check for the environment variable we've set in the parent process. */ if (argc >= 3 && strcmp(argv[2], "inherit") == 0) { if (!RTEnvExistEx(RTENV_DEFAULT, "testcase-child-6")) { RTStrmPrintf(g_pStdErr, "child6: Env.var. 'testcase-child-6' was not inherited from parent\n"); cErrors++; } } else if (argc >= 3 && strstr(argv[2], "change-record") != NULL) { rc = RTEnvGetEx(RTENV_DEFAULT, "testcase-child-6", szValue, sizeof(szValue), NULL); if (RT_SUCCESS(rc) && strcmp(szValue, "changed")) { RTStrmPrintf(g_pStdErr, "child6: Env.var. 'testcase-child-6'='%s', expected 'changed'.\n", szValue); cErrors++; } else if (RT_FAILURE(rc)) { RTStrmPrintf(g_pStdErr, "child6: RTEnvGetEx(,'testcase-child-6',,) -> %Rrc\n", rc); cErrors++; } } else { if (RTEnvExistEx(RTENV_DEFAULT, "testcase-child-6")) { RTStrmPrintf(g_pStdErr, "child6: Env.var. 'testcase-child-6' was inherited from parent\n"); cErrors++; } } /* * Check the user name if present we didn't inherit from parent. */ if ( argc >= 4 && argv[3][0] != '\0' && strstr(argv[2], "noinherit") != NULL) { static struct { const char *pszVarNm; bool fReq; } const s_aVars[] = { #ifdef RT_OS_WINDOWS { "USERNAME", true }, #else { "LOGNAME", true }, { "USER", false }, #endif }; for (unsigned i = 0; i < RT_ELEMENTS(s_aVars); i++) { rc = RTEnvGetEx(RTENV_DEFAULT, s_aVars[i].pszVarNm, szValue, sizeof(szValue), NULL); if (RT_SUCCESS(rc)) { if (strcmp(szValue, argv[3])) { RTStrmPrintf(g_pStdErr, "child6: env.var. '%s'='%s', expected '%s'\n", s_aVars[i].pszVarNm, szValue, argv[3]); cErrors++; } } else if (rc != VERR_ENV_VAR_NOT_FOUND || s_aVars[i].fReq) { RTStrmPrintf(g_pStdErr, "child6: RTGetEnv('%s') -> %Rrc\n", s_aVars[i].pszVarNm, rc); cErrors++; } } } #if 1 /* For manual testing. */ if (strcmp(argv[2],"noinherit") == 0) //if (strcmp(argv[2],"noinherit-change-record") == 0) { RTENV hEnv; rc = RTEnvClone(&hEnv, RTENV_DEFAULT); if (RT_SUCCESS(rc)) { uint32_t cVars = RTEnvCountEx(hEnv); for (uint32_t i = 0; i < cVars; i++) { char szVarNm[_1K]; rc = RTEnvGetByIndexEx(hEnv, i, szVarNm, sizeof(szVarNm), szValue, sizeof(szValue)); if (RT_SUCCESS(rc)) RTStrmPrintf(g_pStdErr, "child6: #%u: %s=%s\n", i, szVarNm, szValue); else { RTStrmPrintf(g_pStdErr, "child6: #%u: %Rrc\n", i, rc); cErrors++; } } RTEnvDestroy(hEnv); } else { RTStrmPrintf(g_pStdErr, "child6: RTEnvClone failed: %Rrc\n", rc); cErrors++; } } #endif return cErrors == 0 ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; }
/** * Checks if the head of the receive ring is a UDP packet matching the given * criteria. * * @returns Pointer to the data if it matches. * @param pBuf The IntNet buffers. * @param uDstPort The destination port to match. * @param pDstMac The destination address to match if * VBOXNETUDP_MATCH_UNICAST is specied. * @param fFlags Flags indicating what to match and some debug stuff. * See VBOXNETUDP_MATCH_*. * @param pHdrs Where to return the pointers to the headers. * Optional. * @param pcb Where to return the size of the data on success. */ void *VBoxNetUDPMatch(PINTNETBUF pBuf, unsigned uDstPort, PCRTMAC pDstMac, uint32_t fFlags, PVBOXNETUDPHDRS pHdrs, size_t *pcb) { /* * Clear return values so we can return easier on mismatch. */ *pcb = 0; if (pHdrs) { pHdrs->pEth = NULL; pHdrs->pIpv4 = NULL; pHdrs->pUdp = NULL; } /* * Valid IntNet Ethernet frame? */ PCINTNETHDR pHdr = IntNetRingGetNextFrameToRead(&pBuf->Recv); if ( !pHdr || ( pHdr->u16Type != INTNETHDR_TYPE_FRAME && pHdr->u16Type != INTNETHDR_TYPE_GSO)) return NULL; size_t cbFrame = pHdr->cbFrame; const void *pvFrame = IntNetHdrGetFramePtr(pHdr, pBuf); PCPDMNETWORKGSO pGso = NULL; if (pHdr->u16Type == INTNETHDR_TYPE_GSO) { pGso = (PCPDMNETWORKGSO)pvFrame; if (!PDMNetGsoIsValid(pGso, cbFrame, cbFrame - sizeof(*pGso))) return NULL; /** @todo IPv6 UDP support, goes for this entire function really. Not really * important yet since this is currently only used by the DHCP server. */ if (pGso->u8Type != PDMNETWORKGSOTYPE_IPV4_UDP) return NULL; pvFrame = pGso + 1; cbFrame -= sizeof(*pGso); } PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pvFrame; if (pHdrs) pHdrs->pEth = pEthHdr; #ifdef IN_RING3 /* Dump if to stderr/log if that's wanted. */ if (fFlags & VBOXNETUDP_MATCH_PRINT_STDERR) { RTStrmPrintf(g_pStdErr, "frame: cb=%04x dst=%.6Rhxs src=%.6Rhxs type=%04x%s\n", cbFrame, &pEthHdr->DstMac, &pEthHdr->SrcMac, RT_BE2H_U16(pEthHdr->EtherType), !memcmp(&pEthHdr->DstMac, pDstMac, sizeof(*pDstMac)) ? " Mine!" : ""); } #endif /* * Ethernet matching. */ /* Ethernet min frame size. */ if (cbFrame < 64) return NULL; /* Match Ethertype: IPV4? */ /** @todo VLAN tagging? */ if (pEthHdr->EtherType != RT_H2BE_U16_C(RTNET_ETHERTYPE_IPV4)) return NULL; /* Match destination address (ethernet) */ if ( ( !(fFlags & VBOXNETUDP_MATCH_UNICAST) || memcmp(&pEthHdr->DstMac, pDstMac, sizeof(pEthHdr->DstMac))) && ( !(fFlags & VBOXNETUDP_MATCH_BROADCAST) || pEthHdr->DstMac.au16[0] != 0xffff || pEthHdr->DstMac.au16[1] != 0xffff || pEthHdr->DstMac.au16[2] != 0xffff)) return NULL; /* * If we're working on a GSO frame, we need to make sure the length fields * are set correctly (they are usually set to 0). */ if (pGso) PDMNetGsoPrepForDirectUse(pGso, (void *)pvFrame, cbFrame, PDMNETCSUMTYPE_NONE); /* * IP validation and matching. */ PCRTNETIPV4 pIpHdr = (PCRTNETIPV4)(pEthHdr + 1); if (pHdrs) pHdrs->pIpv4 = pIpHdr; /* Protocol: UDP */ if (pIpHdr->ip_p != RTNETIPV4_PROT_UDP) return NULL; /* Valid IPv4 header? */ size_t const offIpHdr = (uintptr_t)pIpHdr - (uintptr_t)pEthHdr; if (!RTNetIPv4IsHdrValid(pIpHdr, cbFrame - offIpHdr, cbFrame - offIpHdr, !pGso /*fChecksum*/)) return NULL; /* * UDP matching and validation. */ PCRTNETUDP pUdpHdr = (PCRTNETUDP)((uint32_t *)pIpHdr + pIpHdr->ip_hl); if (pHdrs) pHdrs->pUdp = pUdpHdr; /* Destination port */ if (RT_BE2H_U16(pUdpHdr->uh_dport) != uDstPort) return NULL; if (!pGso) { /* Validate the UDP header according to flags. */ size_t offUdpHdr = (uintptr_t)pUdpHdr - (uintptr_t)pEthHdr; if (fFlags & (VBOXNETUDP_MATCH_CHECKSUM | VBOXNETUDP_MATCH_REQUIRE_CHECKSUM)) { if (!RTNetIPv4IsUDPValid(pIpHdr, pUdpHdr, pUdpHdr + 1, cbFrame - offUdpHdr, true /*fChecksum*/)) return NULL; if ( (fFlags & VBOXNETUDP_MATCH_REQUIRE_CHECKSUM) && !pUdpHdr->uh_sum) return NULL; } else { if (!RTNetIPv4IsUDPSizeValid(pIpHdr, pUdpHdr, cbFrame - offUdpHdr)) return NULL; } } /* * We've got a match! */ *pcb = pUdpHdr->uh_ulen - sizeof(*pUdpHdr); return (void *)(pUdpHdr + 1); }
/** Print an error and return true if an option is already set. */ bool errorIfSet(const char *pcszName, bool isSet) { if (isSet) RTStrmPrintf(g_pStdErr, "%s may only be specified once.\n", pcszName); return isSet; }
int main(int argc, char **argv) { int rc = RTR3InitExe(argc, &argv, 0); if (RT_FAILURE(rc)) return RTMsgInitFailure(rc); /* * Create a HTTP client instance. */ RTHTTP hHttp; rc = RTHttpCreate(&hHttp); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTHttpCreate failed: %Rrc", rc); /* * Parse arguments. */ static const RTGETOPTDEF s_aOptions[] = { { "--output", 'o', RTGETOPT_REQ_STRING }, { "--quiet", 'q', RTGETOPT_REQ_NOTHING }, { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, }; RTEXITCODE rcExit = RTEXITCODE_SUCCESS; const char *pszOutput = NULL; unsigned uVerbosityLevel = 1; RTGETOPTUNION ValueUnion; RTGETOPTSTATE GetState; RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); while ((rc = RTGetOpt(&GetState, &ValueUnion))) { switch (rc) { case 'o': pszOutput = ValueUnion.psz; break; case 'q': uVerbosityLevel--; break; case 'v': uVerbosityLevel++; break; case 'h': RTPrintf("Usage: %s [options] URL0 [URL1 [...]]\n" "\n" "Options:\n" " -o,--output=file\n" " Output file. If not given, the file is displayed on stdout.\n" " -q, --quiet\n" " -v, --verbose\n" " Controls the verbosity level.\n" " -h, -?, --help\n" " Display this help text and exit successfully.\n" " -V, --version\n" " Display the revision and exit successfully.\n" , RTPathFilename(argv[0])); return RTEXITCODE_SUCCESS; case 'V': RTPrintf("$Revision: 102641 $\n"); return RTEXITCODE_SUCCESS; case VINF_GETOPT_NOT_OPTION: { int rcHttp; if (pszOutput && strcmp("-", pszOutput)) { if (uVerbosityLevel > 0) RTStrmPrintf(g_pStdErr, "Fetching '%s' into '%s'...\n", ValueUnion.psz, pszOutput); rcHttp = RTHttpGetFile(hHttp, ValueUnion.psz, pszOutput); } else { if (uVerbosityLevel > 0) RTStrmPrintf(g_pStdErr, "Fetching '%s'...\n", ValueUnion.psz); void *pvResp; size_t cbResp; rcHttp = RTHttpGetBinary(hHttp, ValueUnion.psz, &pvResp, &cbResp); if (RT_SUCCESS(rcHttp)) { RTVFSIOSTREAM hVfsIos; rc = RTVfsIoStrmFromStdHandle(RTHANDLESTD_OUTPUT, 0, true /*fLeaveOpen*/, &hVfsIos); if (RT_SUCCESS(rc)) { rc = RTVfsIoStrmWrite(hVfsIos, pvResp, cbResp, true /*fBlocking*/, NULL); if (RT_FAILURE(rc)) rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error writing to stdout: %Rrc", rc); RTVfsIoStrmRelease(hVfsIos); } else rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening stdout: %Rrc", rc); RTHttpFreeResponse(pvResp); } } if (RT_FAILURE(rcHttp)) rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error %Rrc getting '%s'", rcHttp, ValueUnion.psz); break; } default: return RTGetOptPrintError(rc, &ValueUnion); } } return rcExit; }
/** * Prints an error message to the screen. * * @param pszFormat The message format string. * @param va Format arguments. */ void supSvcDisplayErrorV(const char *pszFormat, va_list va) { RTStrmPrintf(g_pStdErr, "VBoxSupSvc error: "); RTStrmPrintfV(g_pStdErr, pszFormat, va); Log(("supSvcDisplayErrorV: %s", pszFormat)); /** @todo format it! */ }
void printUsage(USAGECATEGORY fCategory, uint32_t fSubCategory, PRTSTREAM pStrm) { bool fDumpOpts = false; #ifdef RT_OS_LINUX bool fLinux = true; #else bool fLinux = false; #endif #ifdef RT_OS_WINDOWS bool fWin = true; #else bool fWin = false; #endif #ifdef RT_OS_SOLARIS bool fSolaris = true; #else bool fSolaris = false; #endif #ifdef RT_OS_FREEBSD bool fFreeBSD = true; #else bool fFreeBSD = false; #endif #ifdef RT_OS_DARWIN bool fDarwin = true; #else bool fDarwin = false; #endif #ifdef VBOX_WITH_VBOXSDL bool fVBoxSDL = true; #else bool fVBoxSDL = false; #endif if (fCategory == USAGE_DUMPOPTS) { fDumpOpts = true; fLinux = true; fWin = true; fSolaris = true; fFreeBSD = true; fDarwin = true; fVBoxSDL = true; fCategory = USAGE_ALL; } RTStrmPrintf(pStrm, "Usage:\n" "\n"); if (fCategory == USAGE_ALL) RTStrmPrintf(pStrm, " VBoxManage [<general option>] <command>\n" " \n \n" "General Options:\n \n" " [-v|--version] print version number and exit\n" " [-q|--nologo] suppress the logo\n" " [--settingspw <pw>] provide the settings password\n" " [--settingspwfile <file>] provide a file containing the settings password\n" " \n \n" "Commands:\n \n"); const char *pcszSep1 = " "; const char *pcszSep2 = " "; if (fCategory != USAGE_ALL) { pcszSep1 = "VBoxManage"; pcszSep2 = ""; } #define SEP pcszSep1, pcszSep2 if (fCategory & USAGE_LIST) RTStrmPrintf(pStrm, "%s list [--long|-l]%s vms|runningvms|ostypes|hostdvds|hostfloppies|\n" #if defined(VBOX_WITH_NETFLT) " intnets|bridgedifs|hostonlyifs|natnets|dhcpservers|\n" #else " intnets|bridgedifs|natnets|dhcpservers|hostinfo|\n" #endif " hostinfo|hostcpuids|hddbackends|hdds|dvds|floppies|\n" " usbhost|usbfilters|systemproperties|extpacks|\n" " groups|webcams|screenshotformats\n" "\n", SEP); if (fCategory & USAGE_SHOWVMINFO) RTStrmPrintf(pStrm, "%s showvminfo %s <uuid|vmname> [--details]\n" " [--machinereadable]\n" "%s showvminfo %s <uuid|vmname> --log <idx>\n" "\n", SEP, SEP); if (fCategory & USAGE_REGISTERVM) RTStrmPrintf(pStrm, "%s registervm %s <filename>\n" "\n", SEP); if (fCategory & USAGE_UNREGISTERVM) RTStrmPrintf(pStrm, "%s unregistervm %s <uuid|vmname> [--delete]\n" "\n", SEP); if (fCategory & USAGE_CREATEVM) RTStrmPrintf(pStrm, "%s createvm %s --name <name>\n" " [--groups <group>, ...]\n" " [--ostype <ostype>]\n" " [--register]\n" " [--basefolder <path>]\n" " [--uuid <uuid>]\n" "\n", SEP); if (fCategory & USAGE_MODIFYVM) { RTStrmPrintf(pStrm, "%s modifyvm %s <uuid|vmname>\n" " [--name <name>]\n" " [--groups <group>, ...]\n" " [--description <desc>]\n" " [--ostype <ostype>]\n" " [--iconfile <filename>]\n" " [--memory <memorysize in MB>]\n" " [--pagefusion on|off]\n" " [--vram <vramsize in MB>]\n" " [--acpi on|off]\n" #ifdef VBOX_WITH_PCI_PASSTHROUGH " [--pciattach 03:04.0]\n" " [--pciattach 03:04.0@02:01.0]\n" " [--pcidetach 03:04.0]\n" #endif " [--ioapic on|off]\n" " [--hpet on|off]\n" " [--triplefaultreset on|off]\n" " [--paravirtprovider none|default|legacy|minimal|\n" " hyperv]\n" " [--hwvirtex on|off]\n" " [--nestedpaging on|off]\n" " [--largepages on|off]\n" " [--vtxvpid on|off]\n" " [--vtxux on|off]\n" " [--pae on|off]\n" " [--longmode on|off]\n" " [--synthcpu on|off]\n" " [--cpuidset <leaf> <eax> <ebx> <ecx> <edx>]\n" " [--cpuidremove <leaf>]\n" " [--cpuidremoveall]\n" " [--hardwareuuid <uuid>]\n" " [--cpus <number>]\n" " [--cpuhotplug on|off]\n" " [--plugcpu <id>]\n" " [--unplugcpu <id>]\n" " [--cpuexecutioncap <1-100>]\n" " [--rtcuseutc on|off]\n" #ifdef VBOX_WITH_VMSVGA " [--graphicscontroller none|vboxvga|vmsvga]\n" #else " [--graphicscontroller none|vboxvga]\n" #endif " [--monitorcount <number>]\n" " [--accelerate3d on|off]\n" #ifdef VBOX_WITH_VIDEOHWACCEL " [--accelerate2dvideo on|off]\n" #endif " [--firmware bios|efi|efi32|efi64]\n" " [--chipset ich9|piix3]\n" " [--bioslogofadein on|off]\n" " [--bioslogofadeout on|off]\n" " [--bioslogodisplaytime <msec>]\n" " [--bioslogoimagepath <imagepath>]\n" " [--biosbootmenu disabled|menuonly|messageandmenu]\n" " [--biossystemtimeoffset <msec>]\n" " [--biospxedebug on|off]\n" " [--boot<1-4> none|floppy|dvd|disk|net>]\n" " [--nic<1-N> none|null|nat|bridged|intnet" #if defined(VBOX_WITH_NETFLT) "|hostonly" #endif "|\n" " generic|natnetwork" "]\n" " [--nictype<1-N> Am79C970A|Am79C973" #ifdef VBOX_WITH_E1000 "|\n 82540EM|82543GC|82545EM" #endif #ifdef VBOX_WITH_VIRTIO "|\n virtio" #endif /* VBOX_WITH_VIRTIO */ "]\n" " [--cableconnected<1-N> on|off]\n" " [--nictrace<1-N> on|off]\n" " [--nictracefile<1-N> <filename>]\n" " [--nicproperty<1-N> name=[value]]\n" " [--nicspeed<1-N> <kbps>]\n" " [--nicbootprio<1-N> <priority>]\n" " [--nicpromisc<1-N> deny|allow-vms|allow-all]\n" " [--nicbandwidthgroup<1-N> none|<name>]\n" " [--bridgeadapter<1-N> none|<devicename>]\n" #if defined(VBOX_WITH_NETFLT) " [--hostonlyadapter<1-N> none|<devicename>]\n" #endif " [--intnet<1-N> <network name>]\n" " [--nat-network<1-N> <network name>]\n" " [--nicgenericdrv<1-N> <driver>\n" " [--natnet<1-N> <network>|default]\n" " [--natsettings<1-N> [<mtu>],[<socksnd>],\n" " [<sockrcv>],[<tcpsnd>],\n" " [<tcprcv>]]\n" " [--natpf<1-N> [<rulename>],tcp|udp,[<hostip>],\n" " <hostport>,[<guestip>],<guestport>]\n" " [--natpf<1-N> delete <rulename>]\n" " [--nattftpprefix<1-N> <prefix>]\n" " [--nattftpfile<1-N> <file>]\n" " [--nattftpserver<1-N> <ip>]\n" " [--natbindip<1-N> <ip>\n" " [--natdnspassdomain<1-N> on|off]\n" " [--natdnsproxy<1-N> on|off]\n" " [--natdnshostresolver<1-N> on|off]\n" " [--nataliasmode<1-N> default|[log],[proxyonly],\n" " [sameports]]\n" " [--macaddress<1-N> auto|<mac>]\n" " [--mouse ps2|usb|usbtablet|usbmultitouch]\n" " [--keyboard ps2|usb\n" " [--uart<1-N> off|<I/O base> <IRQ>]\n" " [--uartmode<1-N> disconnected|\n" " server <pipe>|\n" " client <pipe>|\n" " file <file>|\n" " <devicename>]\n" #if defined(RT_OS_LINUX) || defined(RT_OS_WINDOWS) " [--lpt<1-N> off|<I/O base> <IRQ>]\n" " [--lptmode<1-N> <devicename>]\n" #endif " [--guestmemoryballoon <balloonsize in MB>]\n" " [--audio none|null", SEP); if (fWin) { #ifdef VBOX_WITH_WINMM RTStrmPrintf(pStrm, "|winmm|dsound"); #else RTStrmPrintf(pStrm, "|dsound"); #endif } if (fSolaris) { RTStrmPrintf(pStrm, "|solaudio" #ifdef VBOX_WITH_SOLARIS_OSS "|oss" #endif ); } if (fLinux) { RTStrmPrintf(pStrm, "|oss" #ifdef VBOX_WITH_ALSA "|alsa" #endif #ifdef VBOX_WITH_PULSE "|pulse" #endif ); } if (fFreeBSD) { /* Get the line break sorted when dumping all option variants. */ if (fDumpOpts) { RTStrmPrintf(pStrm, "|\n" " oss"); } else RTStrmPrintf(pStrm, "|oss"); #ifdef VBOX_WITH_PULSE RTStrmPrintf(pStrm, "|pulse"); #endif } if (fDarwin) { RTStrmPrintf(pStrm, "|coreaudio"); } RTStrmPrintf(pStrm, "]\n"); RTStrmPrintf(pStrm, " [--audiocontroller ac97|hda|sb16]\n" " [--clipboard disabled|hosttoguest|guesttohost|\n" " bidirectional]\n" " [--draganddrop disabled|hosttoguest]\n"); RTStrmPrintf(pStrm, " [--vrde on|off]\n" " [--vrdeextpack default|<name>\n" " [--vrdeproperty <name=[value]>]\n" " [--vrdeport <hostport>]\n" " [--vrdeaddress <hostip>]\n" " [--vrdeauthtype null|external|guest]\n" " [--vrdeauthlibrary default|<name>\n" " [--vrdemulticon on|off]\n" " [--vrdereusecon on|off]\n" " [--vrdevideochannel on|off]\n" " [--vrdevideochannelquality <percent>]\n"); RTStrmPrintf(pStrm, " [--usb on|off]\n" " [--usbehci on|off]\n" " [--snapshotfolder default|<path>]\n" " [--teleporter on|off]\n" " [--teleporterport <port>]\n" " [--teleporteraddress <address|empty>\n" " [--teleporterpassword <password>]\n" " [--teleporterpasswordfile <file>|stdin]\n" " [--tracing-enabled on|off]\n" " [--tracing-config <config-string>]\n" " [--tracing-allow-vm-access on|off]\n" #if 0 " [--iocache on|off]\n" " [--iocachesize <I/O cache size in MB>]\n" #endif #if 0 " [--faulttolerance master|standby]\n" " [--faulttoleranceaddress <name>]\n" " [--faulttoleranceport <port>]\n" " [--faulttolerancesyncinterval <msec>]\n" " [--faulttolerancepassword <password>]\n" #endif #ifdef VBOX_WITH_USB_CARDREADER " [--usbcardreader on|off]\n" #endif " [--autostart-enabled on|off]\n" " [--autostart-delay <seconds>]\n" #if 0 " [--autostop-type disabled|savestate|poweroff|\n" " acpishutdown]\n" #endif #ifdef VBOX_WITH_VPX " [--vcpenabled on|off]\n" " [--vcpscreens [<display>],...\n" " [--vcpfile <filename>]\n" " [--vcpwidth <width>]\n" " [--vcpheight <height>]\n" " [--vcprate <rate>]\n" " [--vcpfps <fps>]\n" " [--vcpmaxtime <time>]\n" " [--vcpmaxsize <size>]\n" " [--vcpoptions <options>]\n" #endif " [--defaultfrontend default|<name>]\n" "\n"); } if (fCategory & USAGE_CLONEVM) RTStrmPrintf(pStrm, "%s clonevm %s <uuid|vmname>\n" " [--snapshot <uuid>|<name>]\n" " [--mode machine|machineandchildren|all]\n" " [--options link|keepallmacs|keepnatmacs|\n" " keepdisknames]\n" " [--name <name>]\n" " [--groups <group>, ...]\n" " [--basefolder <basefolder>]\n" " [--uuid <uuid>]\n" " [--register]\n" "\n", SEP); if (fCategory & USAGE_IMPORTAPPLIANCE) RTStrmPrintf(pStrm, "%s import %s <ovfname/ovaname>\n" " [--dry-run|-n]\n" " [--options keepallmacs|keepnatmacs]\n" " [more options]\n" " (run with -n to have options displayed\n" " for a particular OVF)\n\n", SEP); if (fCategory & USAGE_EXPORTAPPLIANCE) RTStrmPrintf(pStrm, "%s export %s <machines> --output|-o <name>.<ovf/ova>\n" " [--legacy09|--ovf09|--ovf10|--ovf20]\n" " [--manifest]\n" " [--iso]\n" " [--options manifest|iso|nomacs|nomacsbutnat]\n" " [--vsys <number of virtual system>]\n" " [--product <product name>]\n" " [--producturl <product url>]\n" " [--vendor <vendor name>]\n" " [--vendorurl <vendor url>]\n" " [--version <version info>]\n" " [--description <description info>]\n" " [--eula <license text>]\n" " [--eulafile <filename>]\n" "\n", SEP); if (fCategory & USAGE_STARTVM) { RTStrmPrintf(pStrm, "%s startvm %s <uuid|vmname>...\n" " [--type gui", SEP); if (fVBoxSDL) RTStrmPrintf(pStrm, "|sdl"); RTStrmPrintf(pStrm, "|headless]\n"); RTStrmPrintf(pStrm, "\n"); } if (fCategory & USAGE_CONTROLVM) { RTStrmPrintf(pStrm, "%s controlvm %s <uuid|vmname>\n" " pause|resume|reset|poweroff|savestate|\n" " acpipowerbutton|acpisleepbutton|\n" " keyboardputscancode <hex> [<hex> ...]|\n" " setlinkstate<1-N> on|off |\n" #if defined(VBOX_WITH_NETFLT) " nic<1-N> null|nat|bridged|intnet|hostonly|generic|\n" " natnetwork [<devicename>] |\n" #else /* !VBOX_WITH_NETFLT */ " nic<1-N> null|nat|bridged|intnet|generic|natnetwork\n" " [<devicename>] |\n" #endif /* !VBOX_WITH_NETFLT */ " nictrace<1-N> on|off |\n" " nictracefile<1-N> <filename> |\n" " nicproperty<1-N> name=[value] |\n" " nicpromisc<1-N> deny|allow-vms|allow-all |\n" " natpf<1-N> [<rulename>],tcp|udp,[<hostip>],\n" " <hostport>,[<guestip>],<guestport> |\n" " natpf<1-N> delete <rulename> |\n" " guestmemoryballoon <balloonsize in MB> |\n" " usbattach <uuid>|<address>\n" " [--capturefile <filename>] |\n" " usbdetach <uuid>|<address> |\n" " clipboard disabled|hosttoguest|guesttohost|\n" " bidirectional |\n" " draganddrop disabled|hosttoguest |\n" " vrde on|off |\n" " vrdeport <port> |\n" " vrdeproperty <name=[value]> |\n" " vrdevideochannelquality <percent> |\n" " setvideomodehint <xres> <yres> <bpp>\n" " [[<display>] [<enabled:yes|no> |\n" " [<xorigin> <yorigin>]]] |\n" " screenshotpng <file> [display] |\n" " vcpenabled on|off |\n" " vcpscreens all|none|<screen>,[<screen>...] |\n" " setcredentials <username>\n" " --passwordfile <file> | <password>\n" " <domain>\n" " [--allowlocallogon <yes|no>] |\n" " teleport --host <name> --port <port>\n" " [--maxdowntime <msec>]\n" " [--passwordfile <file> |\n" " --password <password>] |\n" " plugcpu <id> |\n" " unplugcpu <id> |\n" " cpuexecutioncap <1-100>\n" " webcam <attach [path [settings]]> | <detach [path]> | <list>\n" "\n", SEP); } if (fCategory & USAGE_DISCARDSTATE) RTStrmPrintf(pStrm, "%s discardstate %s <uuid|vmname>\n" "\n", SEP); if (fCategory & USAGE_ADOPTSTATE) RTStrmPrintf(pStrm, "%s adoptstate %s <uuid|vmname> <state_file>\n" "\n", SEP); if (fCategory & USAGE_SNAPSHOT) RTStrmPrintf(pStrm, "%s snapshot %s <uuid|vmname>\n" " take <name> [--description <desc>] [--live] |\n" " delete <uuid|snapname> |\n" " restore <uuid|snapname> |\n" " restorecurrent |\n" " edit <uuid|snapname>|--current\n" " [--name <name>]\n" " [--description <desc>] |\n" " list [--details|--machinereadable]\n" " showvminfo <uuid|snapname>\n" "\n", SEP); if (fCategory & USAGE_CLOSEMEDIUM) RTStrmPrintf(pStrm, "%s closemedium %s disk|dvd|floppy <uuid|filename>\n" " [--delete]\n" "\n", SEP); if (fCategory & USAGE_STORAGEATTACH) RTStrmPrintf(pStrm, "%s storageattach %s <uuid|vmname>\n" " --storagectl <name>\n" " [--port <number>]\n" " [--device <number>]\n" " [--type dvddrive|hdd|fdd]\n" " [--medium none|emptydrive|additions|\n" " <uuid|filename>|host:<drive>|iscsi]\n" " [--mtype normal|writethrough|immutable|shareable|\n" " readonly|multiattach]\n" " [--comment <text>]\n" " [--setuuid <uuid>]\n" " [--setparentuuid <uuid>]\n" " [--passthrough on|off]\n" " [--tempeject on|off]\n" " [--nonrotational on|off]\n" " [--discard on|off]\n" " [--hotpluggable on|off]\n" " [--bandwidthgroup <name>]\n" " [--forceunmount]\n" " [--server <name>|<ip>]\n" " [--target <target>]\n" " [--tport <port>]\n" " [--lun <lun>]\n" " [--encodedlun <lun>]\n" " [--username <username>]\n" " [--password <password>]\n" " [--initiator <initiator>]\n" " [--intnet]\n" "\n", SEP); if (fCategory & USAGE_STORAGECONTROLLER) RTStrmPrintf(pStrm, "%s storagectl %s <uuid|vmname>\n" " --name <name>\n" " [--add ide|sata|scsi|floppy|sas]\n" " [--controller LSILogic|LSILogicSAS|BusLogic|\n" " IntelAHCI|PIIX3|PIIX4|ICH6|I82078]\n" " [--portcount <1-n>]\n" " [--hostiocache on|off]\n" " [--bootable on|off]\n" " [--remove]\n" "\n", SEP); if (fCategory & USAGE_BANDWIDTHCONTROL) RTStrmPrintf(pStrm, "%s bandwidthctl %s <uuid|vmname>\n" " add <name> --type disk|network\n" " --limit <megabytes per second>[k|m|g|K|M|G] |\n" " set <name>\n" " --limit <megabytes per second>[k|m|g|K|M|G] |\n" " remove <name> |\n" " list [--machinereadable]\n" " (limit units: k=kilobit, m=megabit, g=gigabit,\n" " K=kilobyte, M=megabyte, G=gigabyte)\n" "\n", SEP); if (fCategory & USAGE_SHOWHDINFO) RTStrmPrintf(pStrm, "%s showhdinfo %s <uuid|filename>\n" "\n", SEP); if (fCategory & USAGE_CREATEHD) RTStrmPrintf(pStrm, "%s createhd %s --filename <filename>\n" " [--size <megabytes>|--sizebyte <bytes>]\n" " [--diffparent <uuid>|<filename>\n" " [--format VDI|VMDK|VHD] (default: VDI)\n" " [--variant Standard,Fixed,Split2G,Stream,ESX]\n" "\n", SEP); if (fCategory & USAGE_MODIFYHD) RTStrmPrintf(pStrm, "%s modifyhd %s <uuid|filename>\n" " [--type normal|writethrough|immutable|shareable|\n" " readonly|multiattach]\n" " [--autoreset on|off]\n" " [--property <name=[value]>]\n" " [--compact]\n" " [--resize <megabytes>|--resizebyte <bytes>]\n" "\n", SEP); if (fCategory & USAGE_CLONEHD) RTStrmPrintf(pStrm, "%s clonehd %s <uuid|inputfile> <uuid|outputfile>\n" " [--format VDI|VMDK|VHD|RAW|<other>]\n" " [--variant Standard,Fixed,Split2G,Stream,ESX]\n" " [--existing]\n" "\n", SEP); if (fCategory & USAGE_HDPROPERTY) RTStrmPrintf(pStrm, "%s hdproperty %s set <uuid|filename>\n" " <property> <value>\n" "\n" " get <uuid|filename>\n" " <property>\n" "\n" " delete <uuid|filename>\n" " <property>\n" "\n", SEP); if (fCategory & USAGE_CONVERTFROMRAW) RTStrmPrintf(pStrm, "%s convertfromraw %s <filename> <outputfile>\n" " [--format VDI|VMDK|VHD]\n" " [--variant Standard,Fixed,Split2G,Stream,ESX]\n" " [--uuid <uuid>]\n" "%s convertfromraw %s stdin <outputfile> <bytes>\n" " [--format VDI|VMDK|VHD]\n" " [--variant Standard,Fixed,Split2G,Stream,ESX]\n" " [--uuid <uuid>]\n" "\n", SEP, SEP); if (fCategory & USAGE_GETEXTRADATA) RTStrmPrintf(pStrm, "%s getextradata %s global|<uuid|vmname>\n" " <key>|enumerate\n" "\n", SEP); if (fCategory & USAGE_SETEXTRADATA) RTStrmPrintf(pStrm, "%s setextradata %s global|<uuid|vmname>\n" " <key>\n" " [<value>] (no value deletes key)\n" "\n", SEP); if (fCategory & USAGE_SETPROPERTY) RTStrmPrintf(pStrm, "%s setproperty %s machinefolder default|<folder> |\n" " hwvirtexclusive on|off |\n" " vrdeauthlibrary default|<library> |\n" " websrvauthlibrary default|null|<library> |\n" " vrdeextpack null|<library> |\n" " autostartdbpath null|<folder> |\n" " loghistorycount <value>\n" " defaultfrontend default|<name>\n" "\n", SEP); if (fCategory & USAGE_USBFILTER_ADD) RTStrmPrintf(pStrm, "%s usbfilter %s add <index,0-N>\n" " --target <uuid|vmname>|global\n" " --name <string>\n" " --action ignore|hold (global filters only)\n" " [--active yes|no] (yes)\n" " [--vendorid <XXXX>] (null)\n" " [--productid <XXXX>] (null)\n" " [--revision <IIFF>] (null)\n" " [--manufacturer <string>] (null)\n" " [--product <string>] (null)\n" " [--remote yes|no] (null, VM filters only)\n" " [--serialnumber <string>] (null)\n" " [--maskedinterfaces <XXXXXXXX>]\n" "\n", SEP); if (fCategory & USAGE_USBFILTER_MODIFY) RTStrmPrintf(pStrm, "%s usbfilter %s modify <index,0-N>\n" " --target <uuid|vmname>|global\n" " [--name <string>]\n" " [--action ignore|hold] (global filters only)\n" " [--active yes|no]\n" " [--vendorid <XXXX>|\"\"]\n" " [--productid <XXXX>|\"\"]\n" " [--revision <IIFF>|\"\"]\n" " [--manufacturer <string>|\"\"]\n" " [--product <string>|\"\"]\n" " [--remote yes|no] (null, VM filters only)\n" " [--serialnumber <string>|\"\"]\n" " [--maskedinterfaces <XXXXXXXX>]\n" "\n", SEP); if (fCategory & USAGE_USBFILTER_REMOVE) RTStrmPrintf(pStrm, "%s usbfilter %s remove <index,0-N>\n" " --target <uuid|vmname>|global\n" "\n", SEP); if (fCategory & USAGE_SHAREDFOLDER_ADD) RTStrmPrintf(pStrm, "%s sharedfolder %s add <uuid|vmname>\n" " --name <name> --hostpath <hostpath>\n" " [--transient] [--readonly] [--automount]\n" "\n", SEP); if (fCategory & USAGE_SHAREDFOLDER_REMOVE) RTStrmPrintf(pStrm, "%s sharedfolder %s remove <uuid|vmname>\n" " --name <name> [--transient]\n" "\n", SEP); #ifdef VBOX_WITH_GUEST_PROPS if (fCategory & USAGE_GUESTPROPERTY) usageGuestProperty(pStrm, SEP); #endif /* VBOX_WITH_GUEST_PROPS defined */ #ifdef VBOX_WITH_GUEST_CONTROL if (fCategory & USAGE_GUESTCONTROL) usageGuestControl(pStrm, SEP, fSubCategory); #endif /* VBOX_WITH_GUEST_CONTROL defined */ if (fCategory & USAGE_DEBUGVM) { RTStrmPrintf(pStrm, "%s debugvm %s <uuid|vmname>\n" " dumpguestcore --filename <name> |\n" " info <item> [args] |\n" " injectnmi |\n" " log [--release|--debug] <settings> ...|\n" " logdest [--release|--debug] <settings> ...|\n" " logflags [--release|--debug] <settings> ...|\n" " osdetect |\n" " osinfo |\n" " getregisters [--cpu <id>] <reg>|all ... |\n" " setregisters [--cpu <id>] <reg>=<value> ... |\n" " show [--human-readable|--sh-export|--sh-eval|\n" " --cmd-set] \n" " <logdbg-settings|logrel-settings>\n" " [[opt] what ...] |\n" " statistics [--reset] [--pattern <pattern>]\n" " [--descriptions]\n" "\n", SEP); } if (fCategory & USAGE_METRICS) RTStrmPrintf(pStrm, "%s metrics %s list [*|host|<vmname> [<metric_list>]]\n" " (comma-separated)\n\n" "%s metrics %s setup\n" " [--period <seconds>] (default: 1)\n" " [--samples <count>] (default: 1)\n" " [--list]\n" " [*|host|<vmname> [<metric_list>]]\n\n" "%s metrics %s query [*|host|<vmname> [<metric_list>]]\n\n" "%s metrics %s enable\n" " [--list]\n" " [*|host|<vmname> [<metric_list>]]\n\n" "%s metrics %s disable\n" " [--list]\n" " [*|host|<vmname> [<metric_list>]]\n\n" "%s metrics %s collect\n" " [--period <seconds>] (default: 1)\n" " [--samples <count>] (default: 1)\n" " [--list]\n" " [--detach]\n" " [*|host|<vmname> [<metric_list>]]\n" "\n", SEP, SEP, SEP, SEP, SEP, SEP); #if defined(VBOX_WITH_NAT_SERVICE) if (fCategory & USAGE_NATNETWORK) { RTStrmPrintf(pStrm, "%s natnetwork %s add --netname <name>\n" " --network <network>\n" " [--enable|--disable]\n" " [--dhcp on|off]\n" " [--port-forward-4 <rule>]\n" " [--loopback-4 <rule>]\n" " [--ipv6 on|off]\n" " [--port-forward-6 <rule>]\n" " [--loopback-6 <rule>]\n\n" "%s natnetwork %s remove --netname <name>\n\n" "%s natnetwork %s modify --netname <name>\n" " [--network <network>]\n" " [--enable|--disable]\n" " [--dhcp on|off]\n" " [--port-forward-4 <rule>]\n" " [--loopback-4 <rule>]\n" " [--ipv6 on|off]\n" " [--port-forward-6 <rule>]\n" " [--loopback-6 <rule>]\n\n" "%s natnetwork %s start --netname <name>\n\n" "%s natnetwork %s stop --netname <name>\n" "\n", SEP, SEP, SEP, SEP, SEP); } #endif #if defined(VBOX_WITH_NETFLT) if (fCategory & USAGE_HOSTONLYIFS) { RTStrmPrintf(pStrm, "%s hostonlyif %s ipconfig <name>\n" " [--dhcp |\n" " --ip<ipv4> [--netmask<ipv4> (def: 255.255.255.0)] |\n" " --ipv6<ipv6> [--netmasklengthv6<length> (def: 64)]]\n" # if !defined(RT_OS_SOLARIS) " create |\n" " remove <name>\n" # endif "\n", SEP); } #endif if (fCategory & USAGE_DHCPSERVER) { RTStrmPrintf(pStrm, "%s dhcpserver %s add|modify --netname <network_name> |\n" #if defined(VBOX_WITH_NETFLT) " --ifname <hostonly_if_name>\n" #endif " [--ip <ip_address>\n" " --netmask <network_mask>\n" " --lowerip <lower_ip>\n" " --upperip <upper_ip>]\n" " [--enable | --disable]\n\n" "%s dhcpserver %s remove --netname <network_name> |\n" #if defined(VBOX_WITH_NETFLT) " --ifname <hostonly_if_name>\n" #endif "\n", SEP, SEP); } if (fCategory & USAGE_EXTPACK) { RTStrmPrintf(pStrm, "%s extpack %s install [--replace] <tarball> |\n" " uninstall [--force] <name> |\n" " cleanup\n" "\n", SEP); } }
/* * The 'extract-exe-signer-cert' command. */ static RTEXITCODE HelpExtractExeSignerCert(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RTStrmPrintf(pStrm, "extract-exe-signer-cert [--ber|--cer|--der] [--exe|-e] <exe> [--output|-o] <outfile.cer>\n"); return RTEXITCODE_SUCCESS; }
/** * Parse the arguments. * * @returns 0 on success, fully bitched exit code on failure. * * @param argc Argument count. * @param argv Argument vector. * * @todo r=bird: The --help and --version options shall not return a * non-zero exit code. So, this method need to grow some * complexity. I'm to blame for that blunder :/ */ int VBoxNetBaseService::parseArgs(int argc, char **argv) { RTGETOPTSTATE State; PRTGETOPTDEF paOptionArray = getOptionsPtr(); int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m->m_vecOptionDefs.size(), 0, 0 /*fFlags*/); AssertRCReturn(rc, 49); #if 0 /* default initialization */ m_enmTrunkType = kIntNetTrunkType_WhateverNone; #endif Log2(("BaseService: parseArgs enter\n")); for (;;) { RTGETOPTUNION Val; rc = RTGetOpt(&State, &Val); if (!rc) break; switch (rc) { case 'N': // --name m->m_ServiceName = Val.psz; break; case 'n': // --network m->m_NetworkName = Val.psz; break; case 't': //--trunk-name m->m_TrunkName = Val.psz; break; case 'T': //--trunk-type if (!strcmp(Val.psz, "none")) m->m_enmTrunkType = kIntNetTrunkType_None; else if (!strcmp(Val.psz, "whatever")) m->m_enmTrunkType = kIntNetTrunkType_WhateverNone; else if (!strcmp(Val.psz, "netflt")) m->m_enmTrunkType = kIntNetTrunkType_NetFlt; else if (!strcmp(Val.psz, "netadp")) m->m_enmTrunkType = kIntNetTrunkType_NetAdp; else if (!strcmp(Val.psz, "srvnat")) m->m_enmTrunkType = kIntNetTrunkType_SrvNat; else { RTStrmPrintf(g_pStdErr, "Invalid trunk type '%s'\n", Val.psz); return RTEXITCODE_SYNTAX; } break; case 'a': // --mac-address m->m_MacAddress = Val.MacAddr; break; case 'i': // --ip-address m->m_Ipv4Address = Val.IPv4Addr; break; case 'm': // --netmask m->m_Ipv4Netmask = Val.IPv4Addr; break; case 'v': // --verbose m->m_cVerbosity++; break; case 'V': // --version (missed) RTPrintf("%sr%u\n", RTBldCfgVersion(), RTBldCfgRevision()); return 1; /** @todo this exit code is wrong, of course. :/ */ case 'M': // --need-main m->m_fNeedMain = true; break; case 'h': // --help (missed) RTPrintf("%s Version %sr%u\n" "(C) 2009-" VBOX_C_YEAR " " VBOX_VENDOR "\n" "All rights reserved.\n" "\n" "Usage: %s <options>\n" "\n" "Options:\n", RTProcShortName(), RTBldCfgVersion(), RTBldCfgRevision(), RTProcShortName()); for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); i++) RTPrintf(" -%c, %s\n", m->m_vecOptionDefs[i]->iShort, m->m_vecOptionDefs[i]->pszLong); usage(); /* to print Service Specific usage */ return 1; /** @todo this exit code is wrong, of course. :/ */ default: { int rc1 = parseOpt(rc, Val); if (RT_FAILURE(rc1)) { RTEXITCODE rcExit = RTGetOptPrintError(rc, &Val); RTPrintf("Use --help for more information.\n"); return rcExit; } break; } } } RTMemFree(paOptionArray); return RTEXITCODE_SUCCESS; }
/** * Reports a difference and propels the streams to the lines following the * resync. * * * @returns New pState->cDiff value (just to return something). * @param pState The diff state. The cDiffs member will be * incremented. * @param cMatches The resync length. * @param iLeft Where the difference starts on the left side. * @param cLeft How long it is on this side. ~(size_t)0 is used * to indicate that it goes all the way to the end. * @param iRight Where the difference starts on the right side. * @param cRight How long it is. */ static size_t scmDiffReport(PSCMDIFFSTATE pState, size_t cMatches, size_t iLeft, size_t cLeft, size_t iRight, size_t cRight) { /* * Adjust the input. */ if (cLeft == ~(size_t)0) { size_t c = ScmStreamCountLines(pState->pLeft); if (c >= iLeft) cLeft = c - iLeft; else { iLeft = c; cLeft = 0; } } if (cRight == ~(size_t)0) { size_t c = ScmStreamCountLines(pState->pRight); if (c >= iRight) cRight = c - iRight; else { iRight = c; cRight = 0; } } /* * Print header if it's the first difference */ if (!pState->cDiffs) RTStrmPrintf(pState->pDiff, "diff %s %s\n", pState->pszFilename, pState->pszFilename); /* * Emit the change description. */ char ch = cLeft == 0 ? 'a' : cRight == 0 ? 'd' : 'c'; if (cLeft > 1 && cRight > 1) RTStrmPrintf(pState->pDiff, "%zu,%zu%c%zu,%zu\n", iLeft + 1, iLeft + cLeft, ch, iRight + 1, iRight + cRight); else if (cLeft > 1) RTStrmPrintf(pState->pDiff, "%zu,%zu%c%zu\n", iLeft + 1, iLeft + cLeft, ch, iRight + 1); else if (cRight > 1) RTStrmPrintf(pState->pDiff, "%zu%c%zu,%zu\n", iLeft + 1, ch, iRight + 1, iRight + cRight); else RTStrmPrintf(pState->pDiff, "%zu%c%zu\n", iLeft + 1, ch, iRight + 1); /* * And the lines. */ if (cLeft) scmDiffPrintLines(pState, '<', pState->pLeft, iLeft, cLeft); if (cLeft && cRight) RTStrmPrintf(pState->pDiff, "---\n"); if (cRight) scmDiffPrintLines(pState, '>', pState->pRight, iRight, cRight); /* * Reposition the streams (safely ignores return value). */ ScmStreamSeekByLine(pState->pLeft, iLeft + cLeft + cMatches); ScmStreamSeekByLine(pState->pRight, iRight + cRight + cMatches); pState->cDiffs++; return pState->cDiffs; }
bool writeQuoted(enum ENMFORMAT enmFormat, const char *pcszQuoted) { /* Was the last character seen a back slash? */ bool fEscaped = false; /* Was the last character seen an argument separator (an unescaped space)? */ bool fNextArgument = false; if (enmFormat == FORMAT_SHELL) if (!outputCharacter('\'')) return false; for (; *pcszQuoted; ++pcszQuoted) { if (fEscaped) { bool fRc = true; const char (*pachEscapes)[2]; fEscaped = false; /* One-letter escapes. */ for (pachEscapes = aachEscapes; (*pachEscapes)[0]; ++pachEscapes) if (*pcszQuoted == (*pachEscapes)[0]) { if (!escapeAndOutputCharacter(enmFormat, (*pachEscapes)[1])) return false; break; } if ((*pachEscapes)[0]) continue; /* Octal. */ if (*pcszQuoted >= '0' && *pcszQuoted <= '7') { uint8_t cNum; char *pchNext; char achDigits[4]; int rc; RTStrCopy(achDigits, sizeof(achDigits), pcszQuoted); rc = RTStrToUInt8Ex(achDigits, &pchNext, 8, &cNum); if (rc == VWRN_NUMBER_TOO_BIG) { RTStrmPrintf(g_pStdErr, "Invalid octal sequence at \"%.16s\"\n", pcszQuoted - 1); return false; } if (!escapeAndOutputCharacter(enmFormat, cNum)) return false; pcszQuoted += pchNext - achDigits - 1; continue; } /* Hexadecimal. */ if (*pcszQuoted == 'x') { uint8_t cNum; char *pchNext; char achDigits[3]; int rc; RTStrCopy(achDigits, sizeof(achDigits), pcszQuoted + 1); rc = RTStrToUInt8Ex(achDigits, &pchNext, 16, &cNum); if ( rc == VWRN_NUMBER_TOO_BIG || rc == VWRN_NEGATIVE_UNSIGNED || RT_FAILURE(rc)) { RTStrmPrintf(g_pStdErr, "Invalid hexadecimal sequence at \"%.16s\"\n", pcszQuoted - 1); return false; } if (!escapeAndOutputCharacter(enmFormat, cNum)) return false; pcszQuoted += pchNext - achDigits; continue; } /* Output anything else non-zero as is. */ if (*pcszQuoted) { if (!escapeAndOutputCharacter(enmFormat, *pcszQuoted)) return false; continue; } RTStrmPrintf(g_pStdErr, "Trailing back slash in argument.\n"); return false; } /* Argument separator. */ if (*pcszQuoted == ' ') { if (!fNextArgument && !outputArgumentSeparator(enmFormat)) return false; fNextArgument = true; continue; } else fNextArgument = false; /* Start of escape sequence. */ if (*pcszQuoted == '\\') { fEscaped = true; continue; } /* Anything else. */ if (!outputCharacter(*pcszQuoted)) return false; } if (enmFormat == FORMAT_SHELL) if (!outputCharacter('\'')) return false; return true; }
/** The actual implemenation code for @a createServiceFile. */ bool createServiceFileCore(char **ppachTemplate, struct SERVICEPARAMETERS *pParameters) { /* The size of the template data we have read. */ size_t cchTemplate = 0; /* The size of the buffer we have allocated. */ size_t cbBuffer = 0; /* How much of the template data we have written out. */ size_t cchWritten = 0; int rc = VINF_SUCCESS; /* First of all read in the file. */ while (rc != VINF_EOF) { size_t cchRead; if (cchTemplate == cbBuffer) { cbBuffer += READ_SIZE; *ppachTemplate = (char *)RTMemRealloc((void *)*ppachTemplate, cbBuffer); } if (!*ppachTemplate) { RTStrmPrintf(g_pStdErr, "Out of memory.\n"); return false; } rc = RTStrmReadEx(g_pStdIn, *ppachTemplate + cchTemplate, cbBuffer - cchTemplate, &cchRead); if (RT_FAILURE(rc)) { RTStrmPrintf(g_pStdErr, "Error reading input: %Rrc\n", rc); return false; } if (!cchRead) rc = VINF_EOF; cchTemplate += cchRead; } while (true) { /* Find the next '%' character if any and write out up to there (or the * end if there is no '%'). */ char *pchNext = (char *) memchr((void *)(*ppachTemplate + cchWritten), '%', cchTemplate - cchWritten); size_t cchToWrite = pchNext ? pchNext - *ppachTemplate - cchWritten : cchTemplate - cchWritten; rc = RTStrmWrite(g_pStdOut, *ppachTemplate + cchWritten, cchToWrite); if (RT_FAILURE(rc)) { RTStrmPrintf(g_pStdErr, "Error writing output: %Rrc\n", rc); return false; } cchWritten += cchToWrite; if (!pchNext) break; /* And substitute any of our well-known strings. We favour code * readability over efficiency here. */ if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, COMMAND, sizeof(COMMAND) - 1)) { if (!pParameters->pcszCommand) { RTStrmPrintf(g_pStdErr, "--command not specified.\n"); return false; } if (!writeCommand(pParameters->enmFormat, pParameters->pcszCommand)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, ARGUMENTS, sizeof(ARGUMENTS) - 1)) { if ( pParameters->pcszArguments && !writeQuoted(pParameters->enmFormat, pParameters->pcszArguments)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, DESCRIPTION, sizeof(DESCRIPTION) - 1)) { if (!pParameters->pcszDescription) { RTStrmPrintf(g_pStdErr, "--description not specified.\n"); return false; } if (!writePrintableString(pParameters->enmFormat, pParameters->pcszDescription)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, SERVICE_NAME, sizeof(SERVICE_NAME) - 1)) { if ( !pParameters->pcszCommand && !pParameters->pcszServiceName) { RTStrmPrintf(g_pStdErr, "Neither --command nor --service-name specified.\n"); return false; } if (pParameters->pcszServiceName) { if (!writePrintableString(pParameters->enmFormat, pParameters->pcszServiceName)) return false; } else { const char *pcszFileName = RTPathFilename(pParameters->pcszCommand); const char *pcszSuffix = RTPathSuffix(pParameters->pcszCommand); char *pszName = RTStrDupN(pcszFileName, pcszSuffix ? pcszSuffix - pcszFileName : RTPATH_MAX); bool fRc; if (!pszName) { RTStrmPrintf(g_pStdErr, "Out of memory.\n"); return false; } fRc = writePrintableString(pParameters->enmFormat, pszName); RTStrFree(pszName); if (!fRc) return false; } } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, HAVE_ONESHOT, sizeof(HAVE_ONESHOT) - 1)) { if (!pParameters->fOneShot) skipLine(*ppachTemplate, cchTemplate, &cchWritten); } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, HAVE_DAEMON, sizeof(HAVE_DAEMON) - 1)) { if (pParameters->fOneShot) skipLine(*ppachTemplate, cchTemplate, &cchWritten); } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, STOP_COMMAND, sizeof(STOP_COMMAND) - 1)) { if ( pParameters->pcszStopCommand && !writeCommand(pParameters->enmFormat, pParameters->pcszStopCommand)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, STOP_ARGUMENTS, sizeof(STOP_ARGUMENTS) - 1)) { if ( pParameters->pcszStopArguments && !writeQuoted(pParameters->enmFormat, pParameters->pcszStopArguments)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, HAVE_STOP_COMMAND, sizeof(HAVE_STOP_COMMAND) - 1)) { if (!pParameters->pcszStopCommand) skipLine(*ppachTemplate, cchTemplate, &cchWritten); } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, NO_STOP_COMMAND, sizeof(NO_STOP_COMMAND) - 1)) { if (pParameters->pcszStopCommand) skipLine(*ppachTemplate, cchTemplate, &cchWritten); } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, STATUS_COMMAND, sizeof(STATUS_COMMAND) - 1)) { if ( pParameters->pcszStatusCommand && !writeCommand(pParameters->enmFormat, pParameters->pcszStatusCommand)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, STATUS_ARGUMENTS, sizeof(STATUS_ARGUMENTS) - 1)) { if ( pParameters->pcszStatusArguments && !writeQuoted(pParameters->enmFormat, pParameters->pcszStatusArguments)) return false; } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, HAVE_STATUS_COMMAND, sizeof(HAVE_STATUS_COMMAND) - 1)) { if (!pParameters->pcszStatusCommand) skipLine(*ppachTemplate, cchTemplate, &cchWritten); } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, NO_STATUS_COMMAND, sizeof(NO_STATUS_COMMAND) - 1)) { if (pParameters->pcszStatusCommand) skipLine(*ppachTemplate, cchTemplate, &cchWritten); } else if (getSequence(*ppachTemplate, cchTemplate, &cchWritten, "%%", 2)) { rc = RTStrmPutCh(g_pStdOut, '%'); if (RT_FAILURE(rc)) { RTStrmPrintf(g_pStdErr, "Error writing output: %Rrc\n", rc); return false; } } else { RTStrmPrintf(g_pStdErr, "Unknown substitution sequence in input at \"%.*s\"\n", RT_MIN(16, cchTemplate - cchWritten), *ppachTemplate + cchWritten); return false; } } return true; }
int main(int argc, char **argv) { RTR3InitExe(argc, &argv, 0); const char * const argv0 = RTPathFilename(argv[0]); /* options */ uint64_t uAddress = 0; uint64_t uHighlightAddr = UINT64_MAX; ASMSTYLE enmStyle = kAsmStyle_Default; UNDEFOPHANDLING enmUndefOp = kUndefOp_Fail; bool fListing = true; DISCPUMODE enmCpuMode = DISCPUMODE_32BIT; RTFOFF off = 0; RTFOFF cbMax = _1G; bool fHexBytes = false; /* * Parse arguments. */ static const RTGETOPTDEF g_aOptions[] = { { "--address", 'a', RTGETOPT_REQ_UINT64 }, { "--cpumode", 'c', RTGETOPT_REQ_UINT32 }, { "--bytes", 'b', RTGETOPT_REQ_INT64 }, { "--listing", 'l', RTGETOPT_REQ_NOTHING }, { "--no-listing", 'L', RTGETOPT_REQ_NOTHING }, { "--offset", 'o', RTGETOPT_REQ_INT64 }, { "--style", 's', RTGETOPT_REQ_STRING }, { "--undef-op", 'u', RTGETOPT_REQ_STRING }, { "--hex-bytes", 'x', RTGETOPT_REQ_NOTHING }, }; int ch; RTGETOPTUNION ValueUnion; RTGETOPTSTATE GetState; RTGetOptInit(&GetState, argc, argv, g_aOptions, RT_ELEMENTS(g_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); while ( (ch = RTGetOpt(&GetState, &ValueUnion)) && ch != VINF_GETOPT_NOT_OPTION) { switch (ch) { case 'a': uAddress = ValueUnion.u64; break; case 'b': cbMax = ValueUnion.i64; break; case 'c': if (ValueUnion.u32 == 16) enmCpuMode = DISCPUMODE_16BIT; else if (ValueUnion.u32 == 32) enmCpuMode = DISCPUMODE_32BIT; else if (ValueUnion.u32 == 64) enmCpuMode = DISCPUMODE_64BIT; else { RTStrmPrintf(g_pStdErr, "%s: Invalid CPU mode value %RU32\n", argv0, ValueUnion.u32); return 1; } break; case 'h': return Usage(argv0); case 'l': fListing = true; break; case 'L': fListing = false; break; case 'o': off = ValueUnion.i64; break; case 's': if (!strcmp(ValueUnion.psz, "default")) enmStyle = kAsmStyle_Default; else if (!strcmp(ValueUnion.psz, "yasm")) enmStyle = kAsmStyle_yasm; else if (!strcmp(ValueUnion.psz, "masm")) { enmStyle = kAsmStyle_masm; RTStrmPrintf(g_pStdErr, "%s: masm style isn't implemented yet\n", argv0); return 1; } else { RTStrmPrintf(g_pStdErr, "%s: unknown assembly style: %s\n", argv0, ValueUnion.psz); return 1; } break; case 'u': if (!strcmp(ValueUnion.psz, "fail")) enmUndefOp = kUndefOp_Fail; else if (!strcmp(ValueUnion.psz, "all")) enmUndefOp = kUndefOp_All; else if (!strcmp(ValueUnion.psz, "db")) enmUndefOp = kUndefOp_DefineByte; else { RTStrmPrintf(g_pStdErr, "%s: unknown undefined opcode handling method: %s\n", argv0, ValueUnion.psz); return 1; } break; case 'x': fHexBytes = true; break; case 'V': RTPrintf("$Revision: $\n"); return 0; default: return RTGetOptPrintError(ch, &ValueUnion); } } int iArg = GetState.iNext - 1; /** @todo Not pretty, add RTGetOptInit flag for this. */ if (iArg >= argc) return Usage(argv0); int rc = VINF_SUCCESS; if (fHexBytes) { /* * Convert the remaining arguments from a hex byte string into * a buffer that we disassemble. */ size_t cb = 0; uint8_t *pb = NULL; for ( ; iArg < argc; iArg++) { char ch2; const char *psz = argv[iArg]; while (*psz) { /** @todo this stuff belongs in IPRT, same stuff as mac address reading. Could be reused for IPv6 with a different item size.*/ /* skip white space, and for the benefit of linux panics '<' and '>'. */ while (RT_C_IS_SPACE(ch2 = *psz) || ch2 == '<' || ch2 == '>' || ch2 == ',' || ch2 == ';') { if (ch2 == '<') uHighlightAddr = uAddress + cb; psz++; } if (ch2 == '0' && (psz[1] == 'x' || psz[1] == 'X')) { psz += 2; ch2 = *psz; } if (!ch2) break; /* one digit followed by a space or EOS, or two digits. */ int iNum = HexDigitToNum(*psz++); if (iNum == -1) return 1; if (!RT_C_IS_SPACE(ch2 = *psz) && ch2 != '\0' && ch2 != '>' && ch2 != ',' && ch2 != ';') { int iDigit = HexDigitToNum(*psz++); if (iDigit == -1) return 1; iNum = iNum * 16 + iDigit; } /* add the byte */ if (!(cb % 4 /*64*/)) { pb = (uint8_t *)RTMemRealloc(pb, cb + 64); if (!pb) { RTPrintf("%s: error: RTMemRealloc failed\n", argv[0]); return 1; } } pb[cb++] = (uint8_t)iNum; } } /* * Disassemble it. */ rc = MyDisasmBlock(argv0, enmCpuMode, uAddress, uHighlightAddr, pb, cb, enmStyle, fListing, enmUndefOp); } else { /* * Process the files. */ for ( ; iArg < argc; iArg++) { /* * Read the file into memory. */ void *pvFile; size_t cbFile; rc = RTFileReadAllEx(argv[iArg], off, cbMax, RTFILE_RDALL_O_DENY_NONE, &pvFile, &cbFile); if (RT_FAILURE(rc)) { RTStrmPrintf(g_pStdErr, "%s: %s: %Rrc\n", argv0, argv[iArg], rc); break; } /* * Disassemble it. */ rc = MyDisasmBlock(argv0, enmCpuMode, uAddress, uHighlightAddr, (uint8_t *)pvFile, cbFile, enmStyle, fListing, enmUndefOp); if (RT_FAILURE(rc)) break; } } return RT_SUCCESS(rc) ? 0 : 1; }
RTDECL(int) RTCrStoreCertExportAsPem(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename) { /* * Validate input. */ AssertReturn(!fFlags, VERR_INVALID_FLAGS); /* * Start the enumeration first as this validates the store handle. */ RTCRSTORECERTSEARCH Search; int rc = RTCrStoreCertFindAll(hStore, &Search); if (RT_SUCCESS(rc)) { /* * Open the file for writing. * * Note! We must use text and no binary here, because the base-64 API * below will use host specific EOL markers, not CRLF as PEM * specifies. */ PRTSTREAM hStrm; rc = RTStrmOpen(pszFilename, "w", &hStrm); if (RT_SUCCESS(rc)) { /* * Enumerate the certificates in the store, writing them out one by one. */ size_t cbBase64 = 0; char *pszBase64 = NULL; PCRTCRCERTCTX pCertCtx; while ((pCertCtx = RTCrStoreCertSearchNext(hStore, &Search)) != NULL) { const char *pszMarker; switch (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_MASK) { case RTCRCERTCTX_F_ENC_X509_DER: pszMarker = "CERTIFICATE"; break; case RTCRCERTCTX_F_ENC_TAF_DER: pszMarker = "TRUST ANCHOR"; break; default: pszMarker = NULL; break; } if (pszMarker && pCertCtx->cbEncoded > 0) { /* * Do the base64 conversion first. */ size_t cchEncoded = RTBase64EncodedLength(pCertCtx->cbEncoded); if (cchEncoded < cbBase64) { /* likely */ } else { size_t cbNew = RT_ALIGN(cchEncoded + 64, 128); void *pvNew = RTMemRealloc(pszBase64, cbNew); if (!pvNew) { rc = VERR_NO_MEMORY; break; } cbBase64 = cbNew; pszBase64 = (char *)pvNew; } rc = RTBase64Encode(pCertCtx->pabEncoded, pCertCtx->cbEncoded, pszBase64, cbBase64, &cchEncoded); if (RT_FAILURE(rc)) break; RTStrmPrintf(hStrm, "-----BEGIN %s-----\n", pszMarker); RTStrmWrite(hStrm, pszBase64, cchEncoded); rc = RTStrmPrintf(hStrm, "\n-----END %s-----\n", pszMarker); if (RT_FAILURE(rc)) break; } RTCrCertCtxRelease(pCertCtx); } if (pCertCtx) RTCrCertCtxRelease(pCertCtx); RTMemFree(pszBase64); /* * Flush the output file before closing. */ int rc2 = RTStrmFlush(hStrm); if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) rc = rc2; RTStrmClearError(hStrm); /** @todo fix RTStrmClose... */ rc2 = RTStrmClose(hStrm); if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) rc = rc2; } int rc2 = RTCrStoreCertSearchDestroy(hStore, &Search); AssertRC(rc2); } return rc; }
/** * Callback for reading bytes. * * @todo This should check that the disassembler doesn't do unnecessary reads, * however the current doesn't do this and is just complicated... */ static DECLCALLBACK(int) MyDisasInstrRead(RTUINTPTR uSrcAddr, uint8_t *pbDst, uint32_t cbRead, void *pvDisCpu) { PMYDISSTATE pState = (PMYDISSTATE)pvDisCpu; if (RT_LIKELY( pState->uNextAddr == uSrcAddr && pState->cbLeft >= cbRead)) { /* * Straight forward reading. */ if (cbRead == 1) { pState->cbLeft--; *pbDst = *pState->pbNext++; pState->uNextAddr++; } else { memcpy(pbDst, pState->pbNext, cbRead); pState->pbNext += cbRead; pState->cbLeft -= cbRead; pState->uNextAddr += cbRead; } } else { /* * Jumping up the stream. * This occurs when the byte sequence is added to the output string. */ uint64_t offReq64 = uSrcAddr - pState->uAddress; if (offReq64 < 32) { uint32_t offReq = offReq64; uintptr_t off = pState->pbNext - pState->pbInstr; if (off + pState->cbLeft <= offReq) { pState->pbNext += pState->cbLeft; pState->uNextAddr += pState->cbLeft; pState->cbLeft = 0; memset(pbDst, 0xcc, cbRead); pState->rc = VERR_EOF; return VERR_EOF; } /* reset the stream. */ pState->cbLeft += off; pState->pbNext = pState->pbInstr; pState->uNextAddr = pState->uAddress; /* skip ahead. */ pState->cbLeft -= offReq; pState->pbNext += offReq; pState->uNextAddr += offReq; /* do the reading. */ if (pState->cbLeft >= cbRead) { memcpy(pbDst, pState->pbNext, cbRead); pState->cbLeft -= cbRead; pState->pbNext += cbRead; pState->uNextAddr += cbRead; } else { if (pState->cbLeft > 0) { memcpy(pbDst, pState->pbNext, pState->cbLeft); pbDst += pState->cbLeft; cbRead -= (uint32_t)pState->cbLeft; pState->pbNext += pState->cbLeft; pState->uNextAddr += pState->cbLeft; pState->cbLeft = 0; } memset(pbDst, 0xcc, cbRead); pState->rc = VERR_EOF; return VERR_EOF; } } else { RTStrmPrintf(g_pStdErr, "Reading before current instruction!\n"); memset(pbDst, 0x90, cbRead); pState->rc = VERR_INTERNAL_ERROR; return VERR_INTERNAL_ERROR; } } return VINF_SUCCESS; }
int main(int argc, char **argv) { int rc = RTR3InitExe(argc, &argv, 0); if (RT_FAILURE(rc)) return RTMsgInitFailure(rc); /* * Create an empty address space that we can load modules and stuff into * as we parse the parameters. */ RTDBGAS hDbgAs; rc = RTDbgAsCreate(&hDbgAs, 0, RTUINTPTR_MAX, ""); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTDBgAsCreate -> %Rrc", rc); /* * Create a debugging configuration instance to work with so that we can * make use of (i.e. test) path searching and such. */ RTDBGCFG hDbgCfg; rc = RTDbgCfgCreate(&hDbgCfg, "IPRT", true /*fNativePaths*/); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTDbgCfgCreate -> %Rrc", rc); /* * Parse arguments. */ static const RTGETOPTDEF s_aOptions[] = { { "--input", 'i', RTGETOPT_REQ_STRING }, { "--local-file", 'l', RTGETOPT_REQ_NOTHING }, { "--cache-file", 'c', RTGETOPT_REQ_NOTHING }, { "--pe-image", 'p', RTGETOPT_REQ_NOTHING }, { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, { "--x86", '8', RTGETOPT_REQ_NOTHING }, { "--amd64", '6', RTGETOPT_REQ_NOTHING }, { "--whatever", '*', RTGETOPT_REQ_NOTHING }, }; PRTSTREAM pInput = g_pStdIn; PRTSTREAM pOutput = g_pStdOut; unsigned cVerbosityLevel = 0; enum { kOpenMethod_FromImage, kOpenMethod_FromPeImage } enmOpenMethod = kOpenMethod_FromImage; bool fCacheFile = false; RTLDRARCH enmArch = RTLDRARCH_WHATEVER; RTGETOPTUNION ValueUnion; RTGETOPTSTATE GetState; RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0); while ((rc = RTGetOpt(&GetState, &ValueUnion))) { switch (rc) { case 'i': rc = RTStrmOpen(ValueUnion.psz, "r", &pInput); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to open '%s' for reading: %Rrc", ValueUnion.psz, rc); break; case 'c': fCacheFile = true; break; case 'l': fCacheFile = false; break; case 'p': enmOpenMethod = kOpenMethod_FromPeImage; break; case 'v': cVerbosityLevel++; break; case '8': enmArch = RTLDRARCH_X86_32; break; case '6': enmArch = RTLDRARCH_AMD64; break; case '*': enmArch = RTLDRARCH_WHATEVER; break; case 'h': RTPrintf("Usage: %s [options] <module> <address> [<module> <address> [..]]\n" "\n" "Options:\n" " -i,--input=file\n" " Specify a input file instead of standard input.\n" " --pe-image\n" " Use RTDbgModCreateFromPeImage to open the file." " -v, --verbose\n" " Display the address space before doing the filtering.\n" " --amd64,--x86,--whatever\n" " Selects the desired architecture.\n" " -h, -?, --help\n" " Display this help text and exit successfully.\n" " -V, --version\n" " Display the revision and exit successfully.\n" , RTPathFilename(argv[0])); return RTEXITCODE_SUCCESS; case 'V': RTPrintf("$Revision$\n"); return RTEXITCODE_SUCCESS; case VINF_GETOPT_NOT_OPTION: { /* <module> <address> */ const char *pszModule = ValueUnion.psz; rc = RTGetOptFetchValue(&GetState, &ValueUnion, RTGETOPT_REQ_UINT64 | RTGETOPT_FLAG_HEX); if (RT_FAILURE(rc)) return RTGetOptPrintError(rc, &ValueUnion); uint64_t u64Address = ValueUnion.u64; uint32_t cbImage = 0; uint32_t uTimestamp = 0; if (fCacheFile) { rc = RTGetOptFetchValue(&GetState, &ValueUnion, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX); if (RT_FAILURE(rc)) return RTGetOptPrintError(rc, &ValueUnion); cbImage = ValueUnion.u32; rc = RTGetOptFetchValue(&GetState, &ValueUnion, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX); if (RT_FAILURE(rc)) return RTGetOptPrintError(rc, &ValueUnion); uTimestamp = ValueUnion.u32; } RTDBGMOD hMod; if (enmOpenMethod == kOpenMethod_FromImage) rc = RTDbgModCreateFromImage(&hMod, pszModule, NULL, enmArch, hDbgCfg); else rc = RTDbgModCreateFromPeImage(&hMod, pszModule, NULL, NIL_RTLDRMOD, cbImage, uTimestamp, hDbgCfg); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTDbgModCreateFromImage(,%s,,) -> %Rrc", pszModule, rc); rc = RTDbgAsModuleLink(hDbgAs, hMod, u64Address, 0 /* fFlags */); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTDbgAsModuleLink(,%s,%llx,) -> %Rrc", pszModule, u64Address, rc); break; } default: return RTGetOptPrintError(rc, &ValueUnion); } } /* * Display the address space. */ if (cVerbosityLevel) { RTPrintf("*** Address Space Dump ***\n"); uint32_t cModules = RTDbgAsModuleCount(hDbgAs); for (uint32_t iModule = 0; iModule < cModules; iModule++) { RTDBGMOD hDbgMod = RTDbgAsModuleByIndex(hDbgAs, iModule); RTPrintf("Module #%u: %s\n", iModule, RTDbgModName(hDbgMod)); RTDBGASMAPINFO aMappings[128]; uint32_t cMappings = RT_ELEMENTS(aMappings); rc = RTDbgAsModuleQueryMapByIndex(hDbgAs, iModule, &aMappings[0], &cMappings, 0 /*fFlags*/); if (RT_SUCCESS(rc)) { for (uint32_t iMapping = 0; iMapping < cMappings; iMapping++) { if (aMappings[iMapping].iSeg == NIL_RTDBGSEGIDX) RTPrintf(" mapping #%u: %RTptr-%RTptr\n", iMapping, aMappings[iMapping].Address, aMappings[iMapping].Address + RTDbgModImageSize(hDbgMod) - 1); else { RTDBGSEGMENT SegInfo; rc = RTDbgModSegmentByIndex(hDbgMod, aMappings[iMapping].iSeg, &SegInfo); if (RT_SUCCESS(rc)) RTPrintf(" mapping #%u: %RTptr-%RTptr (segment #%u - '%s')", iMapping, aMappings[iMapping].Address, aMappings[iMapping].Address + SegInfo.cb, SegInfo.iSeg, SegInfo.szName); else RTPrintf(" mapping #%u: %RTptr-???????? (segment #%u)", iMapping, aMappings[iMapping].Address); } if (cVerbosityLevel > 1) { uint32_t cSymbols = RTDbgModSymbolCount(hDbgMod); RTPrintf(" %u symbols\n", cSymbols); for (uint32_t iSymbol = 0; iSymbol < cSymbols; iSymbol++) { RTDBGSYMBOL SymInfo; rc = RTDbgModSymbolByOrdinal(hDbgMod, iSymbol, &SymInfo); if (RT_SUCCESS(rc)) RTPrintf(" #%04u at %08x:%RTptr %05llx %s\n", SymInfo.iOrdinal, SymInfo.iSeg, SymInfo.offSeg, (uint64_t)SymInfo.cb, SymInfo.szName); } } } } else RTMsgError("RTDbgAsModuleQueryMapByIndex failed: %Rrc", rc); RTDbgModRelease(hDbgMod); } RTPrintf("*** End of Address Space Dump ***\n"); } /* * Read text from standard input and see if there is anything we can translate. */ for (;;) { /* Get a line. */ char szLine[_64K]; rc = RTStrmGetLine(pInput, szLine, sizeof(szLine)); if (rc == VERR_EOF) break; if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTStrmGetLine() -> %Rrc\n", rc); /* * Search the line for potential addresses and replace them with * symbols+offset. */ const char *pszStart = szLine; const char *psz = szLine; char ch; while ((ch = *psz) != '\0') { size_t cchAddress; uint64_t u64Address; if ( ( ch == '0' && (psz[1] == 'x' || psz[1] == 'X') && TryParseAddress(psz, &cchAddress, &u64Address)) || ( RT_C_IS_XDIGIT(ch) && TryParseAddress(psz, &cchAddress, &u64Address)) ) { /* Print. */ psz += cchAddress; if (pszStart != psz) RTStrmWrite(pOutput, pszStart, psz - pszStart); pszStart = psz; /* Try get the module. */ RTUINTPTR uAddr; RTDBGSEGIDX iSeg; RTDBGMOD hDbgMod; rc = RTDbgAsModuleByAddr(hDbgAs, u64Address, &hDbgMod, &uAddr, &iSeg); if (RT_SUCCESS(rc)) { if (iSeg != UINT32_MAX) RTStrmPrintf(pOutput, "=[%s:%u", RTDbgModName(hDbgMod), iSeg); else RTStrmPrintf(pOutput, "=[%s", RTDbgModName(hDbgMod), iSeg); /* * Do we have symbols? */ RTDBGSYMBOL Symbol; RTINTPTR offSym; rc = RTDbgAsSymbolByAddr(hDbgAs, u64Address, RTDBGSYMADDR_FLAGS_LESS_OR_EQUAL, &offSym, &Symbol, NULL); if (RT_SUCCESS(rc)) { if (!offSym) RTStrmPrintf(pOutput, "!%s", Symbol.szName); else if (offSym > 0) RTStrmPrintf(pOutput, "!%s+%#llx", Symbol.szName, offSym); else RTStrmPrintf(pOutput, "!%s-%#llx", Symbol.szName, -offSym); } else RTStrmPrintf(pOutput, "+%#llx", u64Address - uAddr); /* * Do we have line numbers? */ RTDBGLINE Line; RTINTPTR offLine; rc = RTDbgAsLineByAddr(hDbgAs, u64Address, &offLine, &Line, NULL); if (RT_SUCCESS(rc)) RTStrmPrintf(pOutput, " %Rbn(%u)", Line.szFilename, Line.uLineNo); RTStrmPrintf(pOutput, "]"); RTDbgModRelease(hDbgMod); } } else psz++; } if (pszStart != psz) RTStrmWrite(pOutput, pszStart, psz - pszStart); RTStrmPutCh(pOutput, '\n'); } return RTEXITCODE_SUCCESS; }
int main(int argc, char **argv) { RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_SUPLIB); /* * Options are mandatory. */ if (argc <= 1) return usage(); /* * Parse the options. */ static const RTGETOPTDEF s_aOptions[] = { { "--flags", 'f', RTGETOPT_REQ_STRING }, { "--groups", 'g', RTGETOPT_REQ_STRING }, { "--dest", 'd', RTGETOPT_REQ_STRING }, { "--what", 'o', RTGETOPT_REQ_STRING }, { "--which", 'l', RTGETOPT_REQ_STRING }, }; const char *pszFlags = ""; const char *pszGroups = ""; const char *pszDest = ""; SUPLOGGER enmWhich = SUPLOGGER_DEBUG; enum { kSupLoggerCtl_Set, kSupLoggerCtl_Create, kSupLoggerCtl_Destroy } enmWhat = kSupLoggerCtl_Set; int ch; int i = 1; RTGETOPTUNION Val; RTGETOPTSTATE GetState; RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0); while ((ch = RTGetOpt(&GetState, &Val))) { switch (ch) { case 'f': pszFlags = Val.psz; break; case 'g': pszGroups = Val.psz; break; case 'd': pszDest = Val.psz; break; case 'o': if (!strcmp(Val.psz, "set")) enmWhat = kSupLoggerCtl_Set; else if (!strcmp(Val.psz, "create")) enmWhat = kSupLoggerCtl_Create; else if (!strcmp(Val.psz, "destroy")) enmWhat = kSupLoggerCtl_Destroy; else { RTStrmPrintf(g_pStdErr, "SUPLoggerCtl: error: Unknown operation '%s'.\n", Val.psz); return 1; } break; case 'l': if (!strcmp(Val.psz, "debug")) enmWhich = SUPLOGGER_DEBUG; else if (!strcmp(Val.psz, "release")) enmWhich = SUPLOGGER_RELEASE; else { RTStrmPrintf(g_pStdErr, "SUPLoggerCtl: error: Unknown logger '%s'.\n", Val.psz); return 1; } break; case 'h': return usage(); case 'V': RTPrintf("%sr%s\n", RTBldCfgVersion(), RTBldCfgRevisionStr()); return 0; case VINF_GETOPT_NOT_OPTION: RTStrmPrintf(g_pStdErr, "SUPLoggerCtl: error: Unexpected argument '%s'.\n", Val.psz); return 1; default: return RTGetOptPrintError(ch, &Val); } } /* * Do the requested job. */ int rc; switch (enmWhat) { case kSupLoggerCtl_Set: rc = SUPR3LoggerSettings(enmWhich, pszFlags, pszGroups, pszDest); break; case kSupLoggerCtl_Create: rc = SUPR3LoggerCreate(enmWhich, pszFlags, pszGroups, pszDest); break; case kSupLoggerCtl_Destroy: rc = SUPR3LoggerDestroy(enmWhich); break; default: rc = VERR_INTERNAL_ERROR; break; } if (RT_SUCCESS(rc)) RTPrintf("SUPLoggerCtl: Success\n"); else RTStrmPrintf(g_pStdErr, "SUPLoggerCtl: error: rc=%Rrc\n", rc); return RT_SUCCESS(rc) ? 0 : 1; }
/** * Parse the arguments. * * @returns 0 on success, fully bitched exit code on failure. * * @param argc Argument count. * @param argv Argument vector. */ int VBoxNetBaseService::parseArgs(int argc, char **argv) { RTGETOPTSTATE State; PRTGETOPTDEF paOptionArray = getOptionsPtr(); int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m_vecOptionDefs.size(), 0, 0 /*fFlags*/); AssertRCReturn(rc, 49); #if 0 /* default initialization */ m_enmTrunkType = kIntNetTrunkType_WhateverNone; #endif Log2(("BaseService: parseArgs enter\n")); for (;;) { RTGETOPTUNION Val; rc = RTGetOpt(&State, &Val); if (!rc) break; switch (rc) { case 'N': m_Name = Val.psz; break; case 'n': m_Network = Val.psz; break; case 't': m_TrunkName = Val.psz; break; case 'T': if (!strcmp(Val.psz, "none")) m_enmTrunkType = kIntNetTrunkType_None; else if (!strcmp(Val.psz, "whatever")) m_enmTrunkType = kIntNetTrunkType_WhateverNone; else if (!strcmp(Val.psz, "netflt")) m_enmTrunkType = kIntNetTrunkType_NetFlt; else if (!strcmp(Val.psz, "netadp")) m_enmTrunkType = kIntNetTrunkType_NetAdp; else if (!strcmp(Val.psz, "srvnat")) m_enmTrunkType = kIntNetTrunkType_SrvNat; else { RTStrmPrintf(g_pStdErr, "Invalid trunk type '%s'\n", Val.psz); return 1; } break; case 'a': m_MacAddress = Val.MacAddr; break; case 'i': m_Ipv4Address = Val.IPv4Addr; break; case 'm': m_Ipv4Netmask = Val.IPv4Addr; break; case 'v': m_cVerbosity++; break; case 'V': RTPrintf("%sr%u\n", RTBldCfgVersion(), RTBldCfgRevision()); return 1; case 'h': RTPrintf("VBoxNetDHCP Version %s\n" "(C) 2009-" VBOX_C_YEAR " " VBOX_VENDOR "\n" "All rights reserved.\n" "\n" "Usage: VBoxNetDHCP <options>\n" "\n" "Options:\n", RTBldCfgVersion()); for (unsigned int i = 0; i < m_vecOptionDefs.size(); i++) RTPrintf(" -%c, %s\n", m_vecOptionDefs[i]->iShort, m_vecOptionDefs[i]->pszLong); usage(); /* to print Service Specific usage */ return 1; default: int rc1 = parseOpt(rc, Val); if (RT_FAILURE(rc1)) { rc = RTGetOptPrintError(rc, &Val); RTPrintf("Use --help for more information.\n"); return rc; } } } RTMemFree(paOptionArray); return rc; }
int main(int cArgs, char **apszArgs) { int rc = RTR3InitExe(cArgs, &apszArgs, 0); if (RT_FAILURE(rc)) return RTMsgInitFailure(rc); enum { OPTION_FORMAT = 1, OPTION_COMMAND, OPTION_ARGUMENTS, OPTION_DESCRIPTION, OPTION_SERVICE_NAME, OPTION_ONE_SHOT, OPTION_STOP_COMMAND, OPTION_STOP_ARGUMENTS, OPTION_STATUS_COMMAND, OPTION_STATUS_ARGUMENTS }; static const RTGETOPTDEF s_aOptions[] = { { "--format", OPTION_FORMAT, RTGETOPT_REQ_STRING }, { "--command", OPTION_COMMAND, RTGETOPT_REQ_STRING }, { "--arguments", OPTION_ARGUMENTS, RTGETOPT_REQ_STRING }, { "--description", OPTION_DESCRIPTION, RTGETOPT_REQ_STRING }, { "--service-name", OPTION_SERVICE_NAME, RTGETOPT_REQ_STRING }, { "--one-shot", OPTION_ONE_SHOT, RTGETOPT_REQ_NOTHING }, { "--stop-command", OPTION_STOP_COMMAND, RTGETOPT_REQ_STRING }, { "--stop-arguments", OPTION_STOP_ARGUMENTS, RTGETOPT_REQ_STRING }, { "--status-command", OPTION_STATUS_COMMAND, RTGETOPT_REQ_STRING }, { "--status-arguments", OPTION_STATUS_ARGUMENTS, RTGETOPT_REQ_STRING } }; int ch; struct SERVICEPARAMETERS Parameters = { FORMAT_NONE }; RTGETOPTUNION ValueUnion; RTGETOPTSTATE GetState; RTGetOptInit(&GetState, cArgs, apszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0); while ((ch = RTGetOpt(&GetState, &ValueUnion))) { switch (ch) { case 'h': showUsage(apszArgs[0]); return RTEXITCODE_SUCCESS; break; case 'V': showLogo(); return RTEXITCODE_SUCCESS; break; case OPTION_FORMAT: if (errorIfSet("--format", Parameters.enmFormat != FORMAT_NONE)) return(RTEXITCODE_SYNTAX); Parameters.enmFormat = getFormat("--format", ValueUnion.psz); if (Parameters.enmFormat == FORMAT_NONE) return(RTEXITCODE_SYNTAX); break; case OPTION_COMMAND: if (errorIfSet("--command", Parameters.pcszCommand)) return(RTEXITCODE_SYNTAX); Parameters.pcszCommand = ValueUnion.psz; if (!checkAbsoluteFilePath("--command", Parameters.pcszCommand)) return(RTEXITCODE_SYNTAX); break; case OPTION_ARGUMENTS: if (errorIfSet("--arguments", Parameters.pcszArguments)) return(RTEXITCODE_SYNTAX); /* Quoting will be checked while writing out the string. */ Parameters.pcszArguments = ValueUnion.psz; break; case OPTION_DESCRIPTION: if (errorIfSet("--description", Parameters.pcszDescription)) return(RTEXITCODE_SYNTAX); Parameters.pcszDescription = ValueUnion.psz; if (!checkPrintable("--description", Parameters.pcszDescription)) return(RTEXITCODE_SYNTAX); break; case OPTION_SERVICE_NAME: if (errorIfSet("--service-name", Parameters.pcszServiceName)) return(RTEXITCODE_SYNTAX); Parameters.pcszServiceName = ValueUnion.psz; if (!checkGraphic("--service-name", Parameters.pcszServiceName)) return(RTEXITCODE_SYNTAX); break; case OPTION_ONE_SHOT: Parameters.fOneShot = true; break; case OPTION_STOP_COMMAND: if (errorIfSet("--stop-command", Parameters.pcszStopCommand)) return(RTEXITCODE_SYNTAX); Parameters.pcszStopCommand = ValueUnion.psz; if (!checkAbsoluteFilePath("--stop-command", Parameters.pcszStopCommand)) return(RTEXITCODE_SYNTAX); break; case OPTION_STOP_ARGUMENTS: if (errorIfSet("--stop-arguments", Parameters.pcszStopArguments)) return(RTEXITCODE_SYNTAX); /* Quoting will be checked while writing out the string. */ Parameters.pcszStopArguments = ValueUnion.psz; break; case OPTION_STATUS_COMMAND: if (errorIfSet("--status-command", Parameters.pcszStatusCommand)) return(RTEXITCODE_SYNTAX); Parameters.pcszStatusCommand = ValueUnion.psz; if (!checkAbsoluteFilePath("--status-command", Parameters.pcszStatusCommand)) return(RTEXITCODE_SYNTAX); break; case OPTION_STATUS_ARGUMENTS: if (errorIfSet("--status-arguments", Parameters.pcszStatusArguments)) return(RTEXITCODE_SYNTAX); /* Quoting will be checked while writing out the string. */ Parameters.pcszStatusArguments = ValueUnion.psz; break; default: return RTGetOptPrintError(ch, &ValueUnion); } } if (Parameters.enmFormat == FORMAT_NONE) { RTStrmPrintf(g_pStdErr, "--format must be specified.\n"); return(RTEXITCODE_SYNTAX); } if (Parameters.pcszArguments && !Parameters.pcszCommand) { RTStrmPrintf(g_pStdErr, "--arguments requires --command to be specified.\n"); return(RTEXITCODE_SYNTAX); } if (Parameters.pcszStopArguments && !Parameters.pcszStopCommand) { RTStrmPrintf(g_pStdErr, "--stop-arguments requires --stop-command to be specified.\n"); return(RTEXITCODE_SYNTAX); } if (Parameters.pcszStatusArguments && !Parameters.pcszStatusCommand) { RTStrmPrintf(g_pStdErr, "--status-arguments requires --status-command to be specified.\n"); return(RTEXITCODE_SYNTAX); } return createServiceFile(&Parameters) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; }