uint32_t TDNFCloneCmdArgs( PTDNF_CMD_ARGS pCmdArgsIn, PTDNF_CMD_ARGS* ppCmdArgs ) { uint32_t dwError = 0; int nIndex = 0; PTDNF_CMD_ARGS pCmdArgs = NULL; dwError = TDNFAllocateMemory( sizeof(TDNF_CMD_ARGS), (void**)&pCmdArgs); BAIL_ON_TDNF_ERROR(dwError); pCmdArgs->nAllowErasing = pCmdArgsIn->nAllowErasing; pCmdArgs->nAssumeNo = pCmdArgsIn->nAssumeNo; pCmdArgs->nAssumeYes = pCmdArgsIn->nAssumeYes; pCmdArgs->nBest = pCmdArgsIn->nBest; pCmdArgs->nCacheOnly = pCmdArgsIn->nCacheOnly; pCmdArgs->nDebugSolver = pCmdArgsIn->nDebugSolver; pCmdArgs->nNoGPGCheck = pCmdArgsIn->nNoGPGCheck; pCmdArgs->nRefresh = pCmdArgsIn->nRefresh; pCmdArgs->nRpmVerbosity = pCmdArgsIn->nRpmVerbosity; pCmdArgs->nShowDuplicates= pCmdArgsIn->nShowDuplicates; pCmdArgs->nShowHelp = pCmdArgsIn->nShowHelp; pCmdArgs->nShowVersion = pCmdArgsIn->nShowVersion; pCmdArgs->nVerbose = pCmdArgsIn->nVerbose; pCmdArgs->nIPv4 = pCmdArgsIn->nIPv4; pCmdArgs->nIPv6 = pCmdArgsIn->nIPv6; pCmdArgs->nCmdCount = pCmdArgsIn->nCmdCount; dwError = TDNFAllocateMemory( pCmdArgs->nCmdCount * sizeof(char*), (void**)&pCmdArgs->ppszCmds ); BAIL_ON_TDNF_ERROR(dwError); for(nIndex = 0; nIndex < pCmdArgs->nCmdCount; ++nIndex) { dwError = TDNFAllocateString( pCmdArgsIn->ppszCmds[nIndex], &pCmdArgs->ppszCmds[nIndex]); BAIL_ON_TDNF_ERROR(dwError); } *ppCmdArgs = pCmdArgs; cleanup: return dwError; error: if(ppCmdArgs) { *ppCmdArgs = NULL; } TDNFFreeCmdArgs(pCmdArgs); goto cleanup; }
int main(int argc, char* argv[]) { uint32_t dwError = 0; PTDNF_CMD_ARGS pCmdArgs = NULL; TDNF_CLI_CMD_MAP arCmdMap[] = { {"autoerase", TDNFCliAutoEraseCommand}, {"autoremove", TDNFCliAutoEraseCommand}, {"check-local", TDNFCliCheckLocalCommand}, {"check-update", TDNFCliCheckUpdateCommand}, {"clean", TDNFCliCleanCommand}, {"count", TDNFCliCountCommand}, {"distro-sync", TDNFCliDistroSyncCommand}, {"downgrade", TDNFCliDowngradeCommand}, {"erase", TDNFCliEraseCommand}, {"help", TDNFCliHelpCommand}, {"info", TDNFCliInfoCommand}, {"install", TDNFCliInstallCommand}, {"list", TDNFCliListCommand}, {"makecache", TDNFCliMakeCacheCommand}, {"provides", TDNFCliProvidesCommand}, {"whatprovides", TDNFCliProvidesCommand}, {"reinstall", TDNFCliReinstallCommand}, {"remove", TDNFCliEraseCommand}, {"repolist", TDNFCliRepoListCommand}, {"search", TDNFCliSearchCommand}, {"update", TDNFCliUpgradeCommand}, {"update-to", TDNFCliUpgradeCommand}, {"upgrade", TDNFCliUpgradeCommand}, {"upgrade-to", TDNFCliUpgradeCommand}, {"updateinfo", TDNFCliUpdateInfoCommand}, }; int nCommandCount = sizeof(arCmdMap)/sizeof(TDNF_CLI_CMD_MAP); const char* pszCmd = NULL; PTDNF pTdnf = NULL; int nFound = 0; dwError = TDNFCliParseArgs(argc, argv, &pCmdArgs); BAIL_ON_CLI_ERROR(dwError); //If --version, show version and exit if(pCmdArgs->nShowVersion) { TDNFCliShowVersion(); } else if(pCmdArgs->nShowHelp) { TDNFCliShowHelp(); } else if(pCmdArgs->nCmdCount > 0) { pszCmd = pCmdArgs->ppszCmds[0]; while(nCommandCount > 0) { --nCommandCount; if(!strcmp(pszCmd, arCmdMap[nCommandCount].pszCmdName)) { nFound = 1; if(!strcmp(pszCmd, "makecache")) { pCmdArgs->nRefresh = 1; } dwError = TDNFOpenHandle(pCmdArgs, &pTdnf); BAIL_ON_CLI_ERROR(dwError); dwError = arCmdMap[nCommandCount].pFnCmd(pTdnf, pCmdArgs); BAIL_ON_CLI_ERROR(dwError); break; } }; if(!nFound) { TDNFCliShowNoSuchCommand(pszCmd); } } else { TDNFCliShowUsage(); } cleanup: if(pTdnf) { TDNFCloseHandle(pTdnf); } if(pCmdArgs) { TDNFFreeCmdArgs(pCmdArgs); } return dwError; error: PrintError(dwError); goto cleanup; }
uint32_t TDNFCliParseArgs( int argc, char* const* argv, PTDNF_CMD_ARGS* ppCmdArgs ) { uint32_t dwError = 0; PTDNF_CMD_ARGS pCmdArgs = NULL; int nOptionIndex = 0; int nOption = 0; int nIndex = 0; char* pszDefaultInstallRoot = "/"; if(!ppCmdArgs) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_CLI_ERROR(dwError); } dwError = TDNFAllocateMemory( 1, sizeof(TDNF_CMD_ARGS), (void**)&pCmdArgs); BAIL_ON_CLI_ERROR(dwError); opterr = 0;//tell getopt to not print errors while (1) { nOption = getopt_long ( argc, argv, "46bCc:d:e:hiqvxy", pstOptions, &nOptionIndex); if (nOption == -1) break; switch (nOption) { case 0: dwError = ParseOption( pstOptions[nOptionIndex].name, optarg, pCmdArgs); BAIL_ON_CLI_ERROR(dwError); break; case 'b': _opt.nBest = 1; break; case 'e': break; case 'C': _opt.nCacheOnly = 1; break; case 'h': _opt.nShowHelp = 1; break; case 'i': dwError = TDNFAllocateString( optarg, &pCmdArgs->pszInstallRoot); BAIL_ON_CLI_ERROR(dwError); break; case 'r': break; case 'y': _opt.nAssumeYes = 1; break; case '4': _opt.nIPv4 = 1; break; case '6': _opt.nIPv6 = 1; break; case 'v': _opt.nVerbose = 1; break; case '?': dwError = HandleOptionsError(argv[optind-1], optarg, pstOptions); BAIL_ON_CLI_ERROR(dwError); //TODO: Handle unknown option, incomplete options break; } } if(pCmdArgs->pszInstallRoot == NULL) { dwError = TDNFAllocateString( pszDefaultInstallRoot, &pCmdArgs->pszInstallRoot); BAIL_ON_CLI_ERROR(dwError); } dwError = TDNFCopyOptions(&_opt, pCmdArgs); BAIL_ON_CLI_ERROR(dwError); //Collect extra args if (optind < argc) { pCmdArgs->nCmdCount = argc-optind; dwError = TDNFAllocateMemory( pCmdArgs->nCmdCount, sizeof(char*), (void**)&pCmdArgs->ppszCmds); BAIL_ON_CLI_ERROR(dwError); while (optind < argc) { dwError = TDNFAllocateString( argv[optind++], &pCmdArgs->ppszCmds[nIndex++]); BAIL_ON_CLI_ERROR(dwError); } } *ppCmdArgs = pCmdArgs; cleanup: return dwError; error: if(ppCmdArgs) { *ppCmdArgs = NULL; } if(pCmdArgs) { TDNFFreeCmdArgs(pCmdArgs); } goto cleanup; }