summaryrefslogtreecommitdiff
path: root/src/fcstat.c
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2012-05-30 18:21:57 +0900
committerAkira TAGOH <akira@tagoh.org>2012-05-30 18:30:49 +0900
commit4a741e9a0ab8dbaa0c377fbfed41547645ac79af (patch)
treea948f507cfe3f0a663cb53ace90ee3f374a1624a /src/fcstat.c
parent0ac6c98294d666762960824d39329459b22b48b7 (diff)
downloadfontconfig-4a741e9a0ab8dbaa0c377fbfed41547645ac79af.tar.gz
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.
Diffstat (limited to 'src/fcstat.c')
-rw-r--r--src/fcstat.c61
1 files changed, 53 insertions, 8 deletions
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;
}