]> git.wh0rd.org - fontconfig.git/blobdiff - fc-cat/fc-cat.c
Initialize fontconfig library in fc-cat to avoid segfault.
[fontconfig.git] / fc-cat / fc-cat.c
index d6247114f227935898581f635d3e38eea301e59d..0bcc4854344a8fa77fed085fc38473565ac8b376 100644 (file)
@@ -377,6 +377,16 @@ bail2:
     return FcFalse;
 }
 
+FcBool
+FcFileIsDir (const FcChar8 *file)
+{
+    struct stat            statb;
+
+    if (stat ((const char *) file, &statb) != 0)
+       return FcFalse;
+    return S_ISDIR(statb.st_mode);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -386,6 +396,7 @@ main (int argc, char **argv)
     FcFontSet  *fs = FcFontSetCreate();
     FcStrSet    *dirs = FcStrSetCreate();
     char       *name_buf;
+    FcConfig   *config;
 
 #if HAVE_GETOPT_LONG
     while ((c = getopt_long (argc, argv, "fsVv?", longopts, NULL)) != -1)
@@ -407,10 +418,32 @@ main (int argc, char **argv)
     i = 1;
 #endif
 
+    config = FcInitLoadConfig ();
+    if (!config)
+    {
+       fprintf (stderr, "%s: Can't init font config library\n", argv[0]);
+       return 1;
+    }
+    FcConfigSetCurrent (config);
+    
     if (i >= argc)
         usage (argv[0]);
 
-    if ((name_buf = FcCacheFileRead (fs, dirs, argv[i])) != 0)
+    if (FcFileIsDir ((const FcChar8 *)argv[i]))
+    {
+        char * dummy_name = (char *)FcStrPlus ((FcChar8 *)argv[i], 
+                                               (FcChar8 *)"/dummy");
+        if (!FcDirScanConfig (fs, dirs, 0, 0, 
+                              (const FcChar8 *)argv[i], FcFalse, config))
+            fprintf (stderr, "couldn't load font dir %s\n", argv[i]);
+        else
+        {
+            /* sorry, we can't tell you where the cache file is. */
+            FcCachePrintSet (fs, dirs, dummy_name);
+            FcStrFree ((FcChar8 *)dummy_name);
+        }
+    }
+    else if ((name_buf = FcCacheFileRead (fs, dirs, argv[i])) != 0)
        FcCachePrintSet (fs, dirs, name_buf);
     else
     {