2015-04-02 09:59:27 +08:00
|
|
|
/*
|
2020-01-29 09:30:07 +08:00
|
|
|
* Copyright (C) 2015-2020 VMware, Inc. All Rights Reserved.
|
2015-04-16 05:10:08 +08:00
|
|
|
*
|
|
|
|
* Licensed under the GNU Lesser General Public License v2.1 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License. The terms
|
|
|
|
* of the License are located in the COPYING file of this distribution.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Module : repolist.c
|
|
|
|
*
|
|
|
|
* Abstract :
|
|
|
|
*
|
|
|
|
* tdnfclientlib
|
|
|
|
*
|
|
|
|
* client library
|
|
|
|
*
|
|
|
|
* Authors : Priyesh Padmavilasom (ppadmavilasom@vmware.com)
|
|
|
|
*/
|
|
|
|
|
2015-04-02 09:59:27 +08:00
|
|
|
#include "includes.h"
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFLoadRepoData(
|
2015-12-13 05:30:40 +08:00
|
|
|
PTDNF pTdnf,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPOLISTFILTER nFilter,
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL* ppReposAll
|
2015-04-02 09:59:27 +08:00
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
char* pszRepoFilePath = NULL;
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pReposAll = NULL;
|
|
|
|
PTDNF_REPO_DATA_INTERNAL pReposTemp = NULL;
|
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepos = NULL;
|
2015-12-13 05:30:40 +08:00
|
|
|
PTDNF_CONF pConf = NULL;
|
2016-11-30 02:41:51 +08:00
|
|
|
DIR *pDir = NULL;
|
|
|
|
struct dirent *pEnt = NULL;
|
|
|
|
int nLen = 0;
|
|
|
|
int nLenRepoExt = 0;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
if(!pTdnf || !pTdnf->pConf || !ppReposAll)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
2015-12-13 05:30:40 +08:00
|
|
|
pConf = pTdnf->pConf;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2020-09-22 08:37:47 +08:00
|
|
|
dwError = TDNFCreateCmdLineRepo(&pReposAll);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
pDir = opendir(pConf->pszRepoDir);
|
|
|
|
if(pDir == NULL)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_REPO_DIR_OPEN;
|
2020-02-07 19:03:08 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
while ((pEnt = readdir (pDir)) != NULL )
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2016-11-30 02:41:51 +08:00
|
|
|
nLen = strlen(pEnt->d_name);
|
|
|
|
nLenRepoExt = strlen(TDNF_REPO_EXT);
|
|
|
|
if (nLen <= nLenRepoExt ||
|
|
|
|
strcmp(pEnt->d_name + nLen - nLenRepoExt, TDNF_REPO_EXT))
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
2016-11-30 02:41:51 +08:00
|
|
|
|
|
|
|
dwError = TDNFAllocateStringPrintf(
|
|
|
|
&pszRepoFilePath,
|
|
|
|
"%s/%s",
|
|
|
|
pConf->pszRepoDir,
|
|
|
|
pEnt->d_name);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2020-01-29 09:30:07 +08:00
|
|
|
dwError = TDNFLoadReposFromFile(pTdnf, pszRepoFilePath, &pRepos);
|
2015-04-02 09:59:27 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pszRepoFilePath);
|
2015-04-02 09:59:27 +08:00
|
|
|
pszRepoFilePath = NULL;
|
|
|
|
|
|
|
|
//Apply filter
|
|
|
|
if((nFilter == REPOLISTFILTER_ENABLED && !pRepos->nEnabled) ||
|
|
|
|
(nFilter == REPOLISTFILTER_DISABLED && pRepos->nEnabled))
|
|
|
|
{
|
2017-02-19 14:18:44 +08:00
|
|
|
TDNFFreeReposInternal(pRepos);
|
2015-04-02 09:59:27 +08:00
|
|
|
pRepos = NULL;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!pReposAll)
|
|
|
|
{
|
|
|
|
pReposAll = pRepos;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pReposTemp = pReposAll;
|
|
|
|
while(pReposAll->pNext)
|
|
|
|
{
|
|
|
|
pReposAll = pReposAll->pNext;
|
|
|
|
}
|
|
|
|
pReposAll->pNext = pRepos;
|
|
|
|
pReposAll = pReposTemp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*ppReposAll = pReposAll;
|
|
|
|
cleanup:
|
|
|
|
if(pDir)
|
|
|
|
{
|
2016-11-30 02:41:51 +08:00
|
|
|
closedir(pDir);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
2016-11-30 02:41:51 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pszRepoFilePath);
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
return dwError;
|
2015-04-02 09:59:27 +08:00
|
|
|
error:
|
|
|
|
if(ppReposAll)
|
|
|
|
{
|
|
|
|
*ppReposAll = NULL;
|
|
|
|
}
|
|
|
|
if(pReposAll)
|
|
|
|
{
|
2017-02-19 14:18:44 +08:00
|
|
|
TDNFFreeReposInternal(pReposAll);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
2020-01-29 09:30:07 +08:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2020-09-22 08:37:47 +08:00
|
|
|
uint32_t
|
|
|
|
TDNFCreateCmdLineRepo(
|
|
|
|
PTDNF_REPO_DATA_INTERNAL* ppRepo
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError;
|
2020-10-28 13:41:04 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepo = NULL;
|
2020-09-22 08:37:47 +08:00
|
|
|
|
|
|
|
if(!ppRepo)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
dwError = TDNFAllocateMemory(
|
|
|
|
1,
|
|
|
|
sizeof(TDNF_REPO_DATA_INTERNAL),
|
|
|
|
(void**)&pRepo);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFSafeAllocateString("@cmdline", &pRepo->pszName);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFSafeAllocateString("@cmdline", &pRepo->pszId);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
*ppRepo = pRepo;
|
|
|
|
cleanup:
|
|
|
|
return dwError;
|
|
|
|
error:
|
|
|
|
if(ppRepo)
|
|
|
|
{
|
|
|
|
*ppRepo = NULL;
|
|
|
|
}
|
|
|
|
if(pRepo)
|
|
|
|
{
|
|
|
|
TDNFFreeReposInternal(pRepo);
|
|
|
|
}
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2020-01-29 09:30:07 +08:00
|
|
|
uint32_t
|
|
|
|
TDNFEventRepoReadConfigEnd(
|
|
|
|
PTDNF pTdnf,
|
|
|
|
PCONF_SECTION pSection
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
TDNF_EVENT_CONTEXT stContext = {0};
|
|
|
|
|
|
|
|
if (!pTdnf || !pSection)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
stContext.nEvent = MAKE_PLUGIN_EVENT(
|
|
|
|
TDNF_PLUGIN_EVENT_TYPE_REPO,
|
|
|
|
TDNF_PLUGIN_EVENT_STATE_READCONFIG,
|
|
|
|
TDNF_PLUGIN_EVENT_PHASE_END);
|
|
|
|
dwError = TDNFAddEventDataPtr(&stContext,
|
|
|
|
TDNF_EVENT_ITEM_REPO_SECTION,
|
|
|
|
pSection);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFPluginRaiseEvent(pTdnf, &stContext);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
TDNFFreeEventData(stContext.pData);
|
|
|
|
return dwError;
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFEventRepoReadConfigStart(
|
|
|
|
PTDNF pTdnf,
|
|
|
|
PCONF_SECTION pSection
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
TDNF_EVENT_CONTEXT stContext = {0};
|
|
|
|
|
|
|
|
if (!pTdnf || !pSection)
|
|
|
|
{
|
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
stContext.nEvent = MAKE_PLUGIN_EVENT(
|
|
|
|
TDNF_PLUGIN_EVENT_TYPE_REPO,
|
|
|
|
TDNF_PLUGIN_EVENT_STATE_READCONFIG,
|
|
|
|
TDNF_PLUGIN_EVENT_PHASE_START);
|
|
|
|
dwError = TDNFAddEventDataPtr(&stContext,
|
|
|
|
TDNF_EVENT_ITEM_REPO_SECTION,
|
|
|
|
pSection);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFPluginRaiseEvent(pTdnf, &stContext);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
TDNFFreeEventData(stContext.pData);
|
|
|
|
return dwError;
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2015-04-02 09:59:27 +08:00
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFLoadReposFromFile(
|
2020-01-29 09:30:07 +08:00
|
|
|
PTDNF pTdnf,
|
2015-04-02 09:59:27 +08:00
|
|
|
char* pszRepoFile,
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL* ppRepos
|
2015-04-02 09:59:27 +08:00
|
|
|
)
|
|
|
|
{
|
2019-10-08 14:53:42 +08:00
|
|
|
char *pszRepo = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
uint32_t dwError = 0;
|
2019-10-08 14:53:42 +08:00
|
|
|
char *pszMetadataExpire = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepos = NULL;
|
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepo = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
PCONF_DATA pData = NULL;
|
|
|
|
PCONF_SECTION pSections = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadConfigFile(pszRepoFile, 0, &pData);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2020-01-29 09:30:07 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
pSections = pData->pSections;
|
|
|
|
for(; pSections; pSections = pSections->pNext)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2020-01-29 09:30:07 +08:00
|
|
|
/* plugin event repo readconfig start */
|
|
|
|
dwError = TDNFEventRepoReadConfigStart(pTdnf, pSections);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
pszRepo = pSections->pszName;
|
2015-04-02 09:59:27 +08:00
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFAllocateMemory(
|
|
|
|
1,
|
2017-02-19 14:18:44 +08:00
|
|
|
sizeof(TDNF_REPO_DATA_INTERNAL),
|
2016-11-30 02:41:51 +08:00
|
|
|
(void**)&pRepo);
|
2015-04-02 09:59:27 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFAllocateString(pszRepo, &pRepo->pszId);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_ENABLED,
|
|
|
|
0,
|
|
|
|
&pRepo->nEnabled);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_NAME,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszName);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_BASEURL,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszBaseUrl);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_METALINK,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszMetaLink);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_SKIP,
|
|
|
|
1,
|
|
|
|
&pRepo->nSkipIfUnavailable);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_GPGCHECK,
|
|
|
|
1,
|
|
|
|
&pRepo->nGPGCheck);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2020-09-19 04:27:24 +08:00
|
|
|
dwError = TDNFReadKeyValueStringArray(
|
2016-11-30 02:41:51 +08:00
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_GPGKEY,
|
2020-09-19 04:27:24 +08:00
|
|
|
&pRepo->ppszUrlGPGKeys);
|
2015-04-02 09:59:27 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_USERNAME,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszUser);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
2015-04-02 09:59:27 +08:00
|
|
|
TDNF_REPO_KEY_PASSWORD,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszPass);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2020-10-24 03:05:59 +08:00
|
|
|
dwError = TDNFReadKeyValueBoolean(
|
|
|
|
pSections,
|
|
|
|
TDNF_REPO_KEY_SSL_VERIFY,
|
|
|
|
1,
|
|
|
|
&pRepo->nSSLVerify);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
|
|
|
TDNF_REPO_KEY_SSL_CA_CERT,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszSSLCaCert);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
|
|
|
TDNF_REPO_KEY_SSL_CLI_CERT,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszSSLClientCert);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
|
|
|
TDNF_REPO_KEY_SSL_CLI_KEY,
|
|
|
|
NULL,
|
|
|
|
&pRepo->pszSSLClientKey);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-11-30 02:41:51 +08:00
|
|
|
dwError = TDNFReadKeyValue(
|
|
|
|
pSections,
|
2016-06-24 16:20:53 +08:00
|
|
|
TDNF_REPO_KEY_METADATA_EXPIRE,
|
2016-11-30 02:41:51 +08:00
|
|
|
TDNF_REPO_DEFAULT_METADATA_EXPIRE,
|
2016-06-24 16:20:53 +08:00
|
|
|
&pszMetadataExpire);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
dwError = TDNFParseMetadataExpire(
|
|
|
|
pszMetadataExpire,
|
|
|
|
&pRepo->lMetadataExpire);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pszMetadataExpire);
|
|
|
|
pszMetadataExpire = NULL;
|
|
|
|
|
2020-01-29 09:30:07 +08:00
|
|
|
/* plugin event repo readconfig end */
|
|
|
|
dwError = TDNFEventRepoReadConfigEnd(pTdnf, pSections);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2016-06-03 15:36:56 +08:00
|
|
|
pRepo->pNext = pRepos;
|
|
|
|
pRepos = pRepo;
|
|
|
|
pRepo = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
*ppRepos = pRepos;
|
|
|
|
cleanup:
|
2016-11-30 02:41:51 +08:00
|
|
|
if(pData)
|
2016-06-03 15:36:56 +08:00
|
|
|
{
|
2016-11-30 02:41:51 +08:00
|
|
|
TDNFFreeConfigData(pData);
|
2016-06-03 15:36:56 +08:00
|
|
|
}
|
2016-06-24 16:20:53 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pszMetadataExpire);
|
2016-06-03 15:36:56 +08:00
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
if(ppRepos)
|
|
|
|
{
|
|
|
|
*ppRepos = NULL;
|
|
|
|
}
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo);
|
|
|
|
if(pRepos)
|
|
|
|
{
|
2017-02-19 14:18:44 +08:00
|
|
|
TDNFFreeReposInternal(pRepos);
|
2016-06-03 15:36:56 +08:00
|
|
|
}
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFRepoListFinalize(
|
|
|
|
PTDNF pTdnf
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
PTDNF_CMD_OPT pSetOpt = NULL;
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepo = NULL;
|
2016-06-03 15:36:56 +08:00
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
2015-12-13 05:30:40 +08:00
|
|
|
if(pRepo->nEnabled)
|
|
|
|
{
|
2018-01-10 03:08:54 +08:00
|
|
|
if(pRepo->pszName)
|
|
|
|
{
|
|
|
|
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszName);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
2015-12-13 05:30:40 +08:00
|
|
|
if(pRepo->pszBaseUrl)
|
|
|
|
{
|
|
|
|
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszBaseUrl);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(pRepo->pszMetaLink)
|
|
|
|
{
|
|
|
|
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszMetaLink);
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
}
|
|
|
|
}
|
2016-06-03 15:36:56 +08:00
|
|
|
pRepo = pRepo->pNext;
|
|
|
|
}
|
2015-12-13 05:30:40 +08:00
|
|
|
|
2016-06-03 15:36:56 +08:00
|
|
|
cleanup:
|
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFAlterRepoState(
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepos,
|
2016-06-03 15:36:56 +08:00
|
|
|
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);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
|
2016-06-03 15:36:56 +08:00
|
|
|
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;
|
|
|
|
}
|
2015-04-02 09:59:27 +08:00
|
|
|
cleanup:
|
2016-06-03 15:36:56 +08:00
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
TDNFCloneRepo(
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepoIn,
|
2016-06-03 15:36:56 +08:00
|
|
|
PTDNF_REPO_DATA* ppRepo
|
|
|
|
)
|
|
|
|
{
|
|
|
|
uint32_t dwError = 0;
|
|
|
|
PTDNF_REPO_DATA pRepo = NULL;
|
|
|
|
|
|
|
|
if(!pRepoIn || !ppRepo)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2016-06-03 15:36:56 +08:00
|
|
|
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
2016-06-03 15:36:56 +08:00
|
|
|
|
2017-05-16 08:32:45 +08:00
|
|
|
dwError = TDNFAllocateMemory(1, sizeof(TDNF_REPO_DATA), (void**)&pRepo);
|
2016-06-03 15:36:56 +08:00
|
|
|
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);
|
|
|
|
|
2017-05-16 08:32:45 +08:00
|
|
|
dwError = TDNFSafeAllocateString(
|
|
|
|
pRepoIn->pszMetaLink,
|
|
|
|
&pRepo->pszMetaLink);
|
2016-06-03 15:36:56 +08:00
|
|
|
BAIL_ON_TDNF_ERROR(dwError);
|
|
|
|
|
2020-09-19 06:02:02 +08:00
|
|
|
if (pRepoIn->ppszUrlGPGKeys) {
|
|
|
|
dwError = TDNFAllocateStringArray(
|
|
|
|
pRepoIn->ppszUrlGPGKeys,
|
|
|
|
&pRepo->ppszUrlGPGKeys);
|
2020-09-19 04:27:24 +08:00
|
|
|
}
|
|
|
|
|
2016-06-03 15:36:56 +08:00
|
|
|
*ppRepo = pRepo;
|
|
|
|
|
|
|
|
cleanup:
|
2015-04-02 09:59:27 +08:00
|
|
|
return dwError;
|
|
|
|
|
|
|
|
error:
|
2016-06-03 15:36:56 +08:00
|
|
|
if(ppRepo)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2016-06-03 15:36:56 +08:00
|
|
|
*ppRepo = NULL;
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
2016-06-03 15:36:56 +08:00
|
|
|
if(pRepo)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2016-06-03 15:36:56 +08:00
|
|
|
TDNFFreeRepos(pRepo);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2017-02-19 14:18:44 +08:00
|
|
|
TDNFFreeReposInternal(
|
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepos
|
|
|
|
)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2017-02-19 14:18:44 +08:00
|
|
|
PTDNF_REPO_DATA_INTERNAL pRepo = NULL;
|
|
|
|
while(pRepos)
|
2015-04-02 09:59:27 +08:00
|
|
|
{
|
2017-02-19 14:18:44 +08:00
|
|
|
pRepo = pRepos;
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo->pszId);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo->pszName);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo->pszBaseUrl);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo->pszMetaLink);
|
2020-09-19 04:27:24 +08:00
|
|
|
TDNF_SAFE_FREE_STRINGARRAY(pRepo->ppszUrlGPGKeys);
|
2017-02-19 14:18:44 +08:00
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo->pszUser);
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo->pszPass);
|
|
|
|
pRepos = pRepo->pNext;
|
|
|
|
TDNF_SAFE_FREE_MEMORY(pRepo);
|
2015-04-02 09:59:27 +08:00
|
|
|
}
|
|
|
|
}
|