Bug 25151 - Move cleanCacheDirectory() from fc-cache.c into

the library

Add FcDirCacheScan() API to clean up the cache files in the directory.
This commit is contained in:
Akira TAGOH 2012-04-18 12:55:23 +09:00
parent 9e62fcedfe
commit dd2a3d3520
5 changed files with 106 additions and 92 deletions

View File

@ -66,3 +66,12 @@ This returns the total number of subdirectories in the cache.
This returns the number of fonts which would be included in the return from This returns the number of fonts which would be included in the return from
FcCacheCopySet. FcCacheCopySet.
@@ @@
@RET@ FcBool
@FUNC@ FcDirCacheClean
@TYPE1@ const FcChar8 * @ARG1@ cache_dir
@TYPE2@ FcBool @ARG2@ verbose
@PURPOSE@
This tries to clean up the cache directory of <parameter>cache_dir</parameter>.
This returns FcTrue if the operation is successfully complete. otherwise FcFalse.
@@

View File

@ -32,7 +32,6 @@
#endif #endif
#include <fontconfig/fontconfig.h> #include <fontconfig/fontconfig.h>
#include "../src/fcarch.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@ -318,96 +317,6 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
return ret; return ret;
} }
static FcBool
cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose)
{
DIR *d;
struct dirent *ent;
FcChar8 *dir_base;
FcBool ret = FcTrue;
FcBool remove;
FcCache *cache;
struct stat target_stat;
dir_base = FcStrPlus (dir, (FcChar8 *) "/");
if (!dir_base)
{
fprintf (stderr, "%s: out of memory\n", dir);
return FcFalse;
}
if (access ((char *) dir, W_OK) != 0)
{
if (verbose)
printf ("%s: not cleaning %s cache directory\n", dir,
access ((char *) dir, F_OK) == 0 ? "unwritable" : "non-existent");
FcStrFree (dir_base);
return FcTrue;
}
if (verbose)
printf ("%s: cleaning cache directory\n", dir);
d = opendir ((char *) dir);
if (!d)
{
perror ((char *) dir);
FcStrFree (dir_base);
return FcFalse;
}
while ((ent = readdir (d)))
{
FcChar8 *file_name;
const FcChar8 *target_dir;
if (ent->d_name[0] == '.')
continue;
/* skip cache files for different architectures and */
/* files which are not cache files at all */
if (strlen(ent->d_name) != 32 + strlen ("-" FC_ARCHITECTURE FC_CACHE_SUFFIX) ||
strcmp(ent->d_name + 32, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX))
continue;
file_name = FcStrPlus (dir_base, (FcChar8 *) ent->d_name);
if (!file_name)
{
fprintf (stderr, "%s: allocation failure\n", dir);
ret = FcFalse;
break;
}
remove = FcFalse;
cache = FcDirCacheLoadFile (file_name, NULL);
if (!cache)
{
if (verbose)
printf ("%s: invalid cache file: %s\n", dir, ent->d_name);
remove = FcTrue;
}
else
{
target_dir = FcCacheDir (cache);
if (stat ((char *) target_dir, &target_stat) < 0)
{
if (verbose)
printf ("%s: %s: missing directory: %s \n",
dir, ent->d_name, target_dir);
remove = FcTrue;
}
}
if (remove)
{
if (unlink ((char *) file_name) < 0)
{
perror ((char *) file_name);
ret = FcFalse;
}
}
FcDirCacheUnload (cache);
FcStrFree (file_name);
}
closedir (d);
FcStrFree (dir_base);
return ret;
}
static FcBool static FcBool
cleanCacheDirectories (FcConfig *config, FcBool verbose) cleanCacheDirectories (FcConfig *config, FcBool verbose)
{ {
@ -419,7 +328,7 @@ cleanCacheDirectories (FcConfig *config, FcBool verbose)
return FcFalse; return FcFalse;
while ((cache_dir = FcStrListNext (cache_dirs))) while ((cache_dir = FcStrListNext (cache_dirs)))
{ {
if (!cleanCacheDirectory (config, cache_dir, verbose)) if (!FcDirCacheClean (cache_dir, verbose))
{ {
ret = FcFalse; ret = FcFalse;
break; break;

View File

@ -328,6 +328,9 @@ FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config);
FcPublic FcBool FcPublic FcBool
FcDirCacheValid (const FcChar8 *cache_file); FcDirCacheValid (const FcChar8 *cache_file);
FcPublic FcBool
FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose);
/* fccfg.c */ /* fccfg.c */
FcPublic FcChar8 * FcPublic FcChar8 *
FcConfigHome (void); FcConfigHome (void);

View File

@ -1020,6 +1020,97 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
return FcFalse; return FcFalse;
} }
FcBool
FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose)
{
DIR *d;
struct dirent *ent;
FcChar8 *dir_base;
FcBool ret = FcTrue;
FcBool remove;
FcCache *cache;
struct stat target_stat;
dir_base = FcStrPlus (cache_dir, (FcChar8 *) FC_DIR_SEPARATOR_S);
if (!dir_base)
{
fprintf (stderr, "Fontconfig error: %s: out of memory\n", cache_dir);
return FcFalse;
}
if (access ((char *) cache_dir, W_OK) != 0)
{
if (verbose || FcDebug () & FC_DBG_CACHE)
printf ("%s: not cleaning %s cache directory\n", cache_dir,
access ((char *) cache_dir, F_OK) == 0 ? "unwritable" : "non-existent");
goto bail0;
}
if (verbose || FcDebug () & FC_DBG_CACHE)
printf ("%s: cleaning cache directory\n", cache_dir);
d = opendir ((char *) cache_dir);
if (!d)
{
perror ((char *) cache_dir);
ret = FcFalse;
goto bail0;
}
while ((ent = readdir (d)))
{
FcChar8 *file_name;
const FcChar8 *target_dir;
if (ent->d_name[0] == '.')
continue;
/* skip cache files for different architectures and */
/* files which are not cache files at all */
if (strlen(ent->d_name) != 32 + strlen ("-" FC_ARCHITECTURE FC_CACHE_SUFFIX) ||
strcmp(ent->d_name + 32, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX))
continue;
file_name = FcStrPlus (dir_base, (FcChar8 *) ent->d_name);
if (!file_name)
{
fprintf (stderr, "Fontconfig error: %s: allocation failure\n", cache_dir);
ret = FcFalse;
break;
}
remove = FcFalse;
cache = FcDirCacheLoadFile (file_name, NULL);
if (!cache)
{
if (verbose || FcDebug () & FC_DBG_CACHE)
printf ("%s: invalid cache file: %s\n", cache_dir, ent->d_name);
remove = FcTrue;
}
else
{
target_dir = FcCacheDir (cache);
if (stat ((char *) target_dir, &target_stat) < 0)
{
if (verbose || FcDebug () & FC_DBG_CACHE)
printf ("%s: %s: missing directory: %s \n",
cache_dir, ent->d_name, target_dir);
remove = FcTrue;
}
}
if (remove)
{
if (unlink ((char *) file_name) < 0)
{
perror ((char *) file_name);
ret = FcFalse;
}
}
FcDirCacheUnload (cache);
FcStrFree (file_name);
}
closedir (d);
bail0:
FcStrFree (dir_base);
return ret;
}
/* /*
* Hokey little macro trick to permit the definitions of C functions * Hokey little macro trick to permit the definitions of C functions
* with the same name as CPP macros * with the same name as CPP macros

View File

@ -64,8 +64,10 @@ typedef HRESULT (WINAPI *pfnSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
extern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory; extern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory;
extern pfnSHGetFolderPathA pSHGetFolderPathA; extern pfnSHGetFolderPathA pSHGetFolderPathA;
# define FC_SEARCH_PATH_SEPARATOR ';' # define FC_SEARCH_PATH_SEPARATOR ';'
# define FC_DIR_SEPARATOR_S "\\"
#else #else
# define FC_SEARCH_PATH_SEPARATOR ':' # define FC_SEARCH_PATH_SEPARATOR ':'
# define FC_DIR_SEPARATOR_S "/"
#endif #endif
#define FC_DBG_MATCH 1 #define FC_DBG_MATCH 1