[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