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:
parent
9e62fcedfe
commit
dd2a3d3520
|
@ -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
|
||||
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.
|
||||
@@
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#endif
|
||||
|
||||
#include <fontconfig/fontconfig.h>
|
||||
#include "../src/fcarch.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
@ -318,96 +317,6 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
|
|||
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
|
||||
cleanCacheDirectories (FcConfig *config, FcBool verbose)
|
||||
{
|
||||
|
@ -419,7 +328,7 @@ cleanCacheDirectories (FcConfig *config, FcBool verbose)
|
|||
return FcFalse;
|
||||
while ((cache_dir = FcStrListNext (cache_dirs)))
|
||||
{
|
||||
if (!cleanCacheDirectory (config, cache_dir, verbose))
|
||||
if (!FcDirCacheClean (cache_dir, verbose))
|
||||
{
|
||||
ret = FcFalse;
|
||||
break;
|
||||
|
|
|
@ -328,6 +328,9 @@ FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config);
|
|||
FcPublic FcBool
|
||||
FcDirCacheValid (const FcChar8 *cache_file);
|
||||
|
||||
FcPublic FcBool
|
||||
FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose);
|
||||
|
||||
/* fccfg.c */
|
||||
FcPublic FcChar8 *
|
||||
FcConfigHome (void);
|
||||
|
|
|
@ -1020,6 +1020,97 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
|
|||
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
|
||||
* with the same name as CPP macros
|
||||
|
|
|
@ -64,8 +64,10 @@ typedef HRESULT (WINAPI *pfnSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
|
|||
extern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory;
|
||||
extern pfnSHGetFolderPathA pSHGetFolderPathA;
|
||||
# define FC_SEARCH_PATH_SEPARATOR ';'
|
||||
# define FC_DIR_SEPARATOR_S "\\"
|
||||
#else
|
||||
# define FC_SEARCH_PATH_SEPARATOR ':'
|
||||
# define FC_DIR_SEPARATOR_S "/"
|
||||
#endif
|
||||
|
||||
#define FC_DBG_MATCH 1
|
||||
|
|
Loading…
Reference in New Issue