configure.in | 2 + src/fcstat.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 8 deletions(-) New commits: commit 4a741e9a0ab8dbaa0c377fbfed41547645ac79af Author: Akira TAGOH <akira@xxxxxxxxx> Date: Wed May 30 18:21:57 2012 +0900 Fix the build fail on Solaris It's introduced by 0ac6c98294d666762960824d39329459b22b48b7. Use lstat() and S_ISDIR() to check if it's the directory or not if there are no d_type in struct dirent. diff --git a/configure.in b/configure.in index b2174d9..f455cb5 100644 --- a/configure.in +++ b/configure.in @@ -154,6 +154,8 @@ if test "x$ac_cv_func_fstatfs" = "xyes"; then #include <sys/mount.h> #endif]) fi +AC_CHECK_MEMBERS([struct dirent.d_type],,, + [#include <dirent.h>]) # # regex # diff --git a/src/fcstat.c b/src/fcstat.c index c2d9fe9..c67c434 100644 --- a/src/fcstat.c +++ b/src/fcstat.c @@ -163,7 +163,11 @@ Adler32Finish (struct Adler32 *ctx) static FcBool FcDirChecksumScandirFilter(const struct dirent *entry) { +#ifdef HAVE_STRUCT_DIRENT_D_TYPE return entry->d_type != DT_DIR; +#else + return FcFalse; +#endif } static int @@ -177,25 +181,66 @@ FcDirChecksum (const FcChar8 *dir, time_t *checksum) { struct Adler32 ctx; struct dirent **files; - int n; + int n, ret = 0; +#ifndef HAVE_STRUCT_DIRENT_D_TYPE + size_t len = strlen ((const char *)dir); +#endif Adler32Init (&ctx); n = scandir ((const char *)dir, &files, - &FcDirChecksumScandirFilter, - &FcDirChecksumScandirSorter); + &FcDirChecksumScandirFilter, + &FcDirChecksumScandirSorter); if (n == -1) - return -1; + return -1; while (n--) { - Adler32Update (&ctx, files[n]->d_name, strlen(files[n]->d_name) + 1); - Adler32Update (&ctx, (char *)&files[n]->d_type, sizeof(files[n]->d_type)); - free(files[n]); + size_t dlen = strlen (files[n]->d_name); + int dtype; + +#ifdef HAVE_STRUCT_DIRENT_D_TYPE + dtype = files[n]->d_type; +#else + struct stat statb; + char *f; + + f = malloc (len + 1 + dlen + 1); + if (!f) + { + ret = -1; + goto bail; + } + memcpy (f, dir, len); + f[len] = FC_DIR_SEPARATOR; + memcpy (&f[len + 1], files[n]->d_name, dlen); + f[len + 1 + dlen] = 0; + if (lstat (f, &statb) < 0) + { + ret = -1; + goto bail; + } + if (S_ISDIR (statb.st_mode)) + goto bail; + + dtype = statb.st_mode; +#endif + Adler32Update (&ctx, files[n]->d_name, dlen + 1); + Adler32Update (&ctx, (char *)&dtype, sizeof (int)); + +#ifndef HAVE_STRUCT_DIRENT_D_TYPE + bail: + if (f) + free (f); +#endif + free (files[n]); } - free(files); + free (files); + if (ret == -1) + return -1; *checksum = Adler32Finish (&ctx); + return 0; } _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/fontconfig