[Fontconfig] fontconfig: Branch 'master'
Akira TAGOH
tagoh at kemper.freedesktop.org
Wed May 30 02:34:04 PDT 2012
configure.in | 2 +
src/fcstat.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 55 insertions(+), 8 deletions(-)
New commits:
commit 4a741e9a0ab8dbaa0c377fbfed41547645ac79af
Author: Akira TAGOH <akira at tagoh.org>
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;
}
More information about the Fontconfig
mailing list