diff --git a/client/api.c b/client/api.c index b8f9364..a648b9d 100644 --- a/client/api.c +++ b/client/api.c @@ -430,6 +430,12 @@ TDNFClean( dwError = TDNFRemoveSolvCache(pTdnf, *ppszReposUsed); BAIL_ON_TDNF_ERROR(dwError); + if (!pTdnf->pConf->nKeepCache) + { + dwError = TDNFRemoveRpmCache(pTdnf, *ppszReposUsed); + BAIL_ON_TDNF_ERROR(dwError); + } + ++ppszReposUsed; } } diff --git a/client/prototypes.h b/client/prototypes.h index 3161650..d07e7bd 100644 --- a/client/prototypes.h +++ b/client/prototypes.h @@ -127,6 +127,12 @@ TDNFRepoRemoveCache( const char* pszRepoId ); +uint32_t +TDNFRemoveRpmCache( + PTDNF pTdnf, + const char* pszRepoId + ); + uint32_t TDNFRemoveLastRefreshMarker( PTDNF pTdnf, diff --git a/client/repoutils.c b/client/repoutils.c index f3a4b11..1464129 100644 --- a/client/repoutils.c +++ b/client/repoutils.c @@ -182,6 +182,12 @@ TDNFRepoGetRpmCacheDir( if(access(pszRpmCacheDir, F_OK)) { dwError = errno; + if (dwError == ENOENT) + { + dwError = 0; + TDNF_SAFE_FREE_MEMORY(pszRpmCacheDir); + pszRpmCacheDir = NULL; + } BAIL_ON_TDNF_SYSTEM_ERROR(dwError); } @@ -276,6 +282,156 @@ error: goto cleanup; } +uint32_t +TDNFRemoveRpmCache( + PTDNF pTdnf, + const char* pszRepoId + ) +{ + uint32_t dwError = 0; + char* pszRpmCacheDir = NULL; + char *pszRpmCacheArchDir = NULL; + char *pszRpmCacheNoarchDir = NULL; + char* pszFilePath = NULL; + DIR *pDir = NULL; + struct dirent *pEnt = NULL; + + if (!pTdnf || !pTdnf->pConf || IsNullOrEmptyString(pszRepoId)) + { + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); + } + + dwError = TDNFRepoGetRpmCacheDir(pTdnf, pszRepoId, &pszRpmCacheDir); + BAIL_ON_TDNF_ERROR(dwError); + + if (!IsNullOrEmptyString(pszRpmCacheDir)) + { + dwError = TDNFAllocateStringPrintf( + &pszRpmCacheArchDir, + "%s/%s", + pszRpmCacheDir, + pTdnf->pConf->pszVarBaseArch); + BAIL_ON_TDNF_ERROR(dwError); + + pDir = opendir(pszRpmCacheArchDir); + if (pDir == NULL) + { + if (errno == ENOENT) + { + goto cleanup; + } + dwError = errno; + BAIL_ON_TDNF_SYSTEM_ERROR(dwError); + } + + while ((pEnt = readdir (pDir)) != NULL ) + { + if (!strcmp(pEnt->d_name, ".") || !strcmp(pEnt->d_name, "..")) + { + continue; + } + + dwError = TDNFAllocateStringPrintf( + &pszFilePath, + "%s/%s", + pszRpmCacheArchDir, + pEnt->d_name); + BAIL_ON_TDNF_ERROR(dwError); + if(pszFilePath) + { + if(unlink(pszFilePath)) + { + dwError = errno; + BAIL_ON_TDNF_SYSTEM_ERROR(dwError); + } + TDNF_SAFE_FREE_MEMORY(pszFilePath); + pszFilePath = NULL; + } + else + { + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); + } + } + if(rmdir(pszRpmCacheArchDir)) + { + dwError = errno; + BAIL_ON_TDNF_SYSTEM_ERROR(dwError); + } + + dwError = TDNFAllocateStringPrintf( + &pszRpmCacheNoarchDir, + "%s/%s", + pszRpmCacheDir, + "noarch"); + BAIL_ON_TDNF_ERROR(dwError); + + pDir = opendir(pszRpmCacheNoarchDir); + if(pDir == NULL) + { + if (errno == ENOENT) + { + goto cleanup; + } + dwError = errno; + BAIL_ON_TDNF_SYSTEM_ERROR(dwError); + } + + while ((pEnt = readdir (pDir)) != NULL ) + { + if (!strcmp(pEnt->d_name, ".") || !strcmp(pEnt->d_name, "..")) + { + continue; + } + + dwError = TDNFAllocateStringPrintf( + &pszFilePath, + "%s/%s", + pszRpmCacheNoarchDir, + pEnt->d_name); + BAIL_ON_TDNF_ERROR(dwError); + if(pszFilePath) + { + if(unlink(pszFilePath)) + { + dwError = errno; + BAIL_ON_TDNF_SYSTEM_ERROR(dwError); + } + TDNF_SAFE_FREE_MEMORY(pszFilePath); + pszFilePath = NULL; + } + else + { + dwError = ERROR_TDNF_INVALID_PARAMETER; + BAIL_ON_TDNF_ERROR(dwError); + } + } + if(rmdir(pszRpmCacheNoarchDir)) + { + dwError = errno; + BAIL_ON_TDNF_SYSTEM_ERROR(dwError); + } + } + +cleanup: + if (pDir) + { + closedir(pDir); + } + if (!IsNullOrEmptyString(pszRpmCacheDir)) + { + rmdir(pszRpmCacheDir); + } + TDNF_SAFE_FREE_MEMORY(pszFilePath); + TDNF_SAFE_FREE_MEMORY(pszRpmCacheDir); + TDNF_SAFE_FREE_MEMORY(pszRpmCacheArchDir); + TDNF_SAFE_FREE_MEMORY(pszRpmCacheNoarchDir); + return dwError; +error: + goto cleanup; +} + uint32_t TDNFRemoveTmpRepodata( const char* pszTmpRepodataDir,