diff --git a/client/api.c b/client/api.c index 7781e824..370f8970 100644 --- a/client/api.c +++ b/client/api.c @@ -515,10 +515,13 @@ TDNFOpenHandle( dwError = TDNFLoadRepoData( pTdnf, - REPOLISTFILTER_ENABLED, + REPOLISTFILTER_ALL, &pTdnf->pRepos); BAIL_ON_TDNF_ERROR(dwError); + dwError = TDNFRepoListFinalize(pTdnf); + BAIL_ON_TDNF_ERROR(dwError); + dwError = TDNFRefreshSack(pTdnf, pTdnf->pArgs->nRefresh); BAIL_ON_TDNF_ERROR(dwError); @@ -624,15 +627,54 @@ TDNFRepoList( { uint32_t dwError = 0; PTDNF_REPO_DATA pReposAll = NULL; + PTDNF_REPO_DATA pRepoTemp = NULL; + PTDNF_REPO_DATA pRepoCurrent = NULL; + PTDNF_REPO_DATA pRepos = NULL; + int nAdd = 0; - if(!pTdnf || !pTdnf->pConf || !ppReposAll) + if(!pTdnf || !pTdnf->pRepos || !ppReposAll) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } - dwError = TDNFLoadRepoData(pTdnf, nFilter, &pReposAll); - BAIL_ON_TDNF_ERROR(dwError); + pRepos = pTdnf->pRepos; + + while(pRepos) + { + nAdd = 0; + if(nFilter == REPOLISTFILTER_ALL) + { + nAdd = 1; + } + else if(nFilter == REPOLISTFILTER_ENABLED && pRepos->nEnabled) + { + nAdd = 1; + } + else if(nFilter == REPOLISTFILTER_DISABLED && !pRepos->nEnabled) + { + nAdd = 1; + } + if(nAdd) + { + dwError = TDNFCloneRepo(pRepos, &pRepoTemp); + BAIL_ON_TDNF_ERROR(dwError); + + if(!pReposAll) + { + pReposAll = pRepoTemp; + pRepoCurrent = pReposAll; + } + else + { + pRepoCurrent->pNext = pRepoTemp; + pRepoCurrent = pRepoCurrent->pNext; + } + pRepoTemp = NULL; + } + + pRepos = pRepos->pNext; + } *ppReposAll = pReposAll; @@ -640,6 +682,14 @@ TDNFRepoList( return dwError; error: + if(ppReposAll) + { + *ppReposAll = NULL; + } + if(pReposAll) + { + TDNFFreeRepos(pReposAll); + } goto cleanup; } @@ -1064,7 +1114,10 @@ TDNFFreeCmdArgs( TDNF_SAFE_FREE_MEMORY(pCmdArgs->pszConfFile); TDNF_SAFE_FREE_MEMORY(pCmdArgs->pszReleaseVer); - TDNF_SAFE_FREE_MEMORY(pCmdArgs->pSetOpt); + if(pCmdArgs->pSetOpt) + { + TDNFFreeCmdOpt(pCmdArgs->pSetOpt); + } TDNF_SAFE_FREE_MEMORY(pCmdArgs); } } diff --git a/client/includes.h b/client/includes.h index e3a2128d..0cddad47 100644 --- a/client/includes.h +++ b/client/includes.h @@ -28,6 +28,7 @@ #include #include #include +#include // #include //glib diff --git a/client/init.c b/client/init.c index 8259871d..73de4a83 100644 --- a/client/init.c +++ b/client/init.c @@ -171,6 +171,13 @@ TDNFCloneCmdArgs( BAIL_ON_TDNF_ERROR(dwError); } + if(pCmdArgsIn->pSetOpt) + { + dwError = TDNFCloneSetOpts(pCmdArgsIn->pSetOpt, + &pCmdArgs->pSetOpt); + BAIL_ON_TDNF_ERROR(dwError); + } + *ppCmdArgs = pCmdArgs; cleanup: @@ -185,6 +192,55 @@ TDNFCloneCmdArgs( goto cleanup; } +uint32_t +TDNFCloneSetOpts( + PTDNF_CMD_OPT pCmdOptIn, + PTDNF_CMD_OPT* ppCmdOpt + ) +{ + uint32_t dwError = 0; + PTDNF_CMD_OPT pCmdOpt = NULL; + PTDNF_CMD_OPT pCmdOptCurrent = NULL; + PTDNF_CMD_OPT* ppCmdOptCurrent = NULL; + + if(!pCmdOptIn || !ppCmdOpt) + { + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); + } + + ppCmdOptCurrent = &pCmdOpt; + while(pCmdOptIn) + { + dwError = TDNFAllocateMemory(1, + sizeof(TDNF_CMD_OPT), + (void**)ppCmdOptCurrent); + BAIL_ON_TDNF_ERROR(dwError); + + pCmdOptCurrent = *ppCmdOptCurrent; + + pCmdOptCurrent->nType = pCmdOptIn->nType; + + dwError = TDNFAllocateString(pCmdOptIn->pszOptName, + &pCmdOptCurrent->pszOptName); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFAllocateString(pCmdOptIn->pszOptValue, + &pCmdOptCurrent->pszOptValue); + BAIL_ON_TDNF_ERROR(dwError); + + ppCmdOptCurrent = &(pCmdOptCurrent->pNext); + pCmdOptIn = pCmdOptIn->pNext; + } + + *ppCmdOpt = pCmdOpt; +cleanup: + return dwError; + +error: + goto cleanup; +} + uint32_t TDNFRefreshSack( PTDNF pTdnf, diff --git a/client/prototypes.h b/client/prototypes.h index 9b642482..774e768b 100644 --- a/client/prototypes.h +++ b/client/prototypes.h @@ -80,6 +80,12 @@ TDNFCloneCmdArgs( PTDNF_CMD_ARGS* ppCmdArgs ); +uint32_t +TDNFCloneSetOpts( + PTDNF_CMD_OPT pCmdOptIn, + PTDNF_CMD_OPT* ppCmdOpt + ); + uint32_t TDNFInitSack( PTDNF pTdnf, @@ -433,6 +439,24 @@ TDNFLoadRepoData( PTDNF_REPO_DATA* ppReposAll ); +uint32_t +TDNFRepoListFinalize( + PTDNF pTdnf + ); + +uint32_t +TDNFAlterRepoState( + PTDNF_REPO_DATA pRepos, + int nEnable, + const char* pszId + ); + +uint32_t +TDNFCloneRepo( + PTDNF_REPO_DATA pRepoIn, + PTDNF_REPO_DATA* ppRepo + ); + //resolve.c HySubject hy_subject_create( diff --git a/client/repolist.c b/client/repolist.c index 43bd26fb..55087e16 100644 --- a/client/repolist.c +++ b/client/repolist.c @@ -238,6 +238,73 @@ TDNFLoadReposFromFile( &pRepo->pszPass); BAIL_ON_TDNF_ERROR(dwError); + pRepo->pNext = pRepos; + pRepos = pRepo; + pRepo = NULL; + i++; + } + + *ppRepos = pRepos; +cleanup: + if(pKeyFile) + { + g_key_file_free(pKeyFile); + } + g_free(pszValue); + g_strfreev(ppszRepos); + return dwError; + +error: + if(ppRepos) + { + *ppRepos = NULL; + } + TDNF_SAFE_FREE_MEMORY(pRepo); + if(pRepos) + { + TDNFFreeRepos(pRepos); + } + goto cleanup; +} + +uint32_t +TDNFRepoListFinalize( + PTDNF pTdnf + ) +{ + uint32_t dwError = 0; + PTDNF_CMD_OPT pSetOpt = NULL; + PTDNF_REPO_DATA pRepo = NULL; + + if(!pTdnf || !pTdnf->pArgs || !pTdnf->pRepos) + { + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); + } + + //There could be overrides to enable/disable + //repo such as cmdline args, api overrides + pSetOpt = pTdnf->pArgs->pSetOpt; + + while(pSetOpt) + { + if(pSetOpt->nType == CMDOPT_ENABLEREPO || + pSetOpt->nType == CMDOPT_DISABLEREPO) + { + dwError = TDNFAlterRepoState( + pTdnf->pRepos, + pSetOpt->nType == CMDOPT_ENABLEREPO, + pSetOpt->pszOptValue); + BAIL_ON_TDNF_ERROR(dwError); + } + pSetOpt = pSetOpt->pNext; + } + + //Now that the overrides are applied, replace config vars + //for the repos that are enabled. + pRepo = pTdnf->pRepos; + while(pRepo) + { if(pRepo->nEnabled) { if(pRepo->pszBaseUrl) @@ -252,32 +319,119 @@ TDNFLoadReposFromFile( BAIL_ON_TDNF_ERROR(dwError); } } + pRepo = pRepo->pNext; + } - pRepo->pNext = pRepos; - pRepos = pRepo; - pRepo = NULL; - i++; +cleanup: + return dwError; + +error: + goto cleanup; +} + +uint32_t +TDNFAlterRepoState( + PTDNF_REPO_DATA pRepos, + int nEnable, + const char* pszId + ) +{ + uint32_t dwError = 0; + int nMatch = 0; + int nIsGlob = 0; + if(!pRepos && IsNullOrEmptyString(pszId)) + { + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); } - *ppRepos = pRepos; + nIsGlob = TDNFIsGlob(pszId); + + while(pRepos) + { + nMatch = 0; + if(nIsGlob) + { + if(!fnmatch(pszId, pRepos->pszId, 0)) + { + nMatch = 1; + } + } + else if(!strcmp(pRepos->pszId, pszId)) + { + nMatch = 1; + } + if(nMatch) + { + pRepos->nEnabled = nEnable; + if(!nIsGlob) + { + break; + } + } + pRepos = pRepos->pNext; + } cleanup: - if(pKeyFile) + return dwError; + +error: + goto cleanup; +} + +uint32_t +TDNFCloneRepo( + PTDNF_REPO_DATA pRepoIn, + PTDNF_REPO_DATA* ppRepo + ) +{ + uint32_t dwError = 0; + PTDNF_REPO_DATA pRepo = NULL; + + if(!pRepoIn || !ppRepo) { - g_key_file_free(pKeyFile); + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); } - g_free(pszValue); - g_strfreev(ppszRepos); + + dwError = TDNFAllocateMemory(1, sizeof(TDNF_REPO_DATA), (void**)&pRepo); + BAIL_ON_TDNF_ERROR(dwError); + + pRepo->nEnabled = pRepoIn->nEnabled; + + dwError = TDNFSafeAllocateString(pRepoIn->pszId, &pRepo->pszId); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFSafeAllocateString(pRepoIn->pszName, &pRepo->pszName); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFSafeAllocateString(pRepoIn->pszBaseUrl, &pRepo->pszBaseUrl); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFSafeAllocateString(pRepoIn->pszMetaLink, &pRepo->pszMetaLink); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFSafeAllocateString(pRepoIn->pszUrlGPGKey, &pRepo->pszUrlGPGKey); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFSafeAllocateString(pRepoIn->pszUser, &pRepo->pszUser); + BAIL_ON_TDNF_ERROR(dwError); + + dwError = TDNFSafeAllocateString(pRepoIn->pszPass, &pRepo->pszPass); + BAIL_ON_TDNF_ERROR(dwError); + + *ppRepo = pRepo; + +cleanup: return dwError; error: - if(ppRepos) + if(ppRepo) { - *ppRepos = NULL; + *ppRepo = NULL; } - TDNF_SAFE_FREE_MEMORY(pRepo); - if(pRepos) + if(pRepo) { - TDNFFreeRepos(pRepos); + TDNFFreeRepos(pRepo); } goto cleanup; } diff --git a/include/tdnftypes.h b/include/tdnftypes.h index 320d2db4..94c7b5a4 100644 --- a/include/tdnftypes.h +++ b/include/tdnftypes.h @@ -133,6 +133,15 @@ typedef enum REPOLISTFILTER_DISABLED }TDNF_REPOLISTFILTER; +//CmdOpt Types +typedef enum +{ + CMDOPT_NONE = -1, + CMDOPT_KEYVALUE, + CMDOPT_ENABLEREPO, + CMDOPT_DISABLEREPO +}TDNF_CMDOPT_TYPE; + typedef struct _TDNF_ *PTDNF; typedef struct _HyRepo * HyRepo; @@ -172,6 +181,7 @@ typedef struct _TDNF_SOLVED_PKG_INFO typedef struct _TDNF_CMD_OPT { + int nType; char* pszOptName; char* pszOptValue; struct _TDNF_CMD_OPT* pNext; @@ -204,10 +214,6 @@ typedef struct _TDNF_CMD_ARGS //Commands and args that do not fall in options char** ppszCmds; int nCmdCount; - //Enabled repositories - char** ppszEnabledRepos; - //Disabled repositories - char** ppszDisabledRepos; PTDNF_CMD_OPT pSetOpt; }TDNF_CMD_ARGS, *PTDNF_CMD_ARGS; diff --git a/tools/cli/defines.h b/tools/cli/defines.h index 13ecc227..9a0c2e27 100644 --- a/tools/cli/defines.h +++ b/tools/cli/defines.h @@ -34,6 +34,8 @@ #define ERROR_TDNF_CLI_OPTION_ARG_UNEXPECTED (ERROR_TDNF_CLI_BASE + 10) #define ERROR_TDNF_CLI_SETOPT_NO_EQUALS (ERROR_TDNF_CLI_BASE + 11) +#define ENABLEREPO "enablerepo" +#define DISABLEREPO "disablerepo" #define IsNullOrEmptyString(str) (!(str) || !(*str)) diff --git a/tools/cli/parseargs.c b/tools/cli/parseargs.c index f0140e34..f3820b9a 100644 --- a/tools/cli/parseargs.c +++ b/tools/cli/parseargs.c @@ -325,9 +325,19 @@ ParseOption( } else if(!strcasecmp(pszName, "enablerepo")) { + dwError = AddSetOptWithValues(pCmdArgs, + CMDOPT_ENABLEREPO, + ENABLEREPO, + optarg); + BAIL_ON_CLI_ERROR(dwError); } else if(!strcasecmp(pszName, "disablerepo")) { + dwError = AddSetOptWithValues(pCmdArgs, + CMDOPT_DISABLEREPO, + DISABLEREPO, + optarg); + BAIL_ON_CLI_ERROR(dwError); } else if(!strcasecmp(pszName, "installroot")) { diff --git a/tools/cli/prototypes.h b/tools/cli/prototypes.h index e1b9f91d..9912a29e 100644 --- a/tools/cli/prototypes.h +++ b/tools/cli/prototypes.h @@ -395,6 +395,14 @@ AddSetOpt( const char* pszOptArg ); +uint32_t +AddSetOptWithValues( + PTDNF_CMD_ARGS pCmdArgs, + int nType, + const char* pszOptArg, + const char* pszOptValue + ); + uint32_t GetOptionAndValue( const char* pszOptArg, diff --git a/tools/cli/setopt.c b/tools/cli/setopt.c index 7fd05bc1..7a472bc0 100644 --- a/tools/cli/setopt.c +++ b/tools/cli/setopt.c @@ -59,6 +59,62 @@ AddSetOpt( goto cleanup; } +uint32_t +AddSetOptWithValues( + PTDNF_CMD_ARGS pCmdArgs, + int nType, + const char* pszOptArg, + const char* pszOptValue + ) +{ + uint32_t dwError = 0; + PTDNF_CMD_OPT pCmdOpt = NULL; + PTDNF_CMD_OPT pSetOptTemp = NULL; + + if(!pCmdArgs || + IsNullOrEmptyString(pszOptArg) || + IsNullOrEmptyString(pszOptValue)) + { + dwError = ERROR_TDNF_CLI_INVALID_ARGUMENT; + BAIL_ON_CLI_ERROR(dwError); + } + + dwError = TDNFAllocateMemory(1, sizeof(TDNF_CMD_OPT), (void**)&pCmdOpt); + BAIL_ON_CLI_ERROR(dwError); + + pCmdOpt->nType = nType; + + dwError = TDNFAllocateString(pszOptArg, &pCmdOpt->pszOptName); + BAIL_ON_CLI_ERROR(dwError); + + dwError = TDNFAllocateString(pszOptValue, &pCmdOpt->pszOptValue); + BAIL_ON_CLI_ERROR(dwError); + + pSetOptTemp = pCmdArgs->pSetOpt; + if(!pSetOptTemp) + { + pCmdArgs->pSetOpt = pCmdOpt; + } + else + { + while(pSetOptTemp->pNext) + { + pSetOptTemp = pSetOptTemp->pNext; + } + pSetOptTemp->pNext = pCmdOpt; + } + +cleanup: + return dwError; + +error: + if(pCmdOpt) + { + TDNFFreeCmdOpt(pCmdOpt); + } + goto cleanup; +} + uint32_t GetOptionAndValue( const char* pszOptArg, @@ -87,6 +143,7 @@ GetOptionAndValue( dwError = TDNFAllocateMemory(1, sizeof(TDNF_CMD_OPT), (void**)&pCmdOpt); BAIL_ON_CLI_ERROR(dwError); + pCmdOpt->nType = CMDOPT_KEYVALUE; dwError = TDNFAllocateString(pszOptArg, &pCmdOpt->pszOptName); BAIL_ON_CLI_ERROR(dwError);