summaryrefslogtreecommitdiff
path: root/source/x/fontconfig/fedora-patches/fontconfig-0-timestamp-dir-on-sb.patch
blob: cfbc206f9b8a5868fedb72a8dcb64303823a3369 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
diff --git a/src/fccache.c b/src/fccache.c
index 2d398c73..7139b082 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -845,7 +845,7 @@ FcCacheTimeValid (FcConfig *config, FcCache *cache, struct stat *dir_stat)
 		FcCacheDir (cache), cache->checksum, (int) dir_stat->st_mtime);
 #endif
 
-    return cache->checksum == (int) dir_stat->st_mtime && fnano;
+    return dir_stat->st_mtime == 0 || (cache->checksum == (int) dir_stat->st_mtime && fnano);
 }
 
 static FcBool
@@ -1041,17 +1041,39 @@ static FcBool
 FcDirCacheMapHelper (FcConfig *config, int fd, struct stat *fd_stat, struct stat *dir_stat, struct timeval *latest_cache_mtime, void *closure)
 {
     FcCache *cache = FcDirCacheMapFd (config, fd, fd_stat, dir_stat);
-    struct timeval cache_mtime;
+    struct timeval cache_mtime, zero_mtime = { 0, 0}, dir_mtime;
 
     if (!cache)
 	return FcFalse;
     cache_mtime.tv_sec = fd_stat->st_mtime;
+    dir_mtime.tv_sec = dir_stat->st_mtime;
 #ifdef HAVE_STRUCT_STAT_ST_MTIM
     cache_mtime.tv_usec = fd_stat->st_mtim.tv_nsec / 1000;
+    dir_mtime.tv_usec = dir_stat->st_mtim.tv_nsec / 1000;
 #else
     cache_mtime.tv_usec = 0;
+    dir_mtime.tv_usec = 0;
 #endif
-    if (timercmp (latest_cache_mtime, &cache_mtime, <))
+    /* special take care of OSTree */
+    if (!timercmp (&zero_mtime, &dir_mtime, !=))
+    {
+	if (!timercmp (&zero_mtime, &cache_mtime, !=))
+	{
+	    if (*((FcCache **) closure))
+		FcDirCacheUnload (*((FcCache **) closure));
+	}
+	else if (*((FcCache **) closure) && !timercmp (&zero_mtime, latest_cache_mtime, !=))
+	{
+	    FcDirCacheUnload (cache);
+	    return FcFalse;
+	}
+	else if (timercmp (latest_cache_mtime, &cache_mtime, <))
+	{
+	    if (*((FcCache **) closure))
+		FcDirCacheUnload (*((FcCache **) closure));
+	}
+    }
+    else if (timercmp (latest_cache_mtime, &cache_mtime, <))
     {
 	if (*((FcCache **) closure))
 	    FcDirCacheUnload (*((FcCache **) closure));