test-migration.c revision 6fc018e4
16fc018e4Smrg#include <stdio.h> 26fc018e4Smrg#include <stdlib.h> 36fc018e4Smrg#include <string.h> 46fc018e4Smrg#include <unistd.h> 56fc018e4Smrg#include <sys/types.h> 66fc018e4Smrg#include <dirent.h> 76fc018e4Smrg#include <fontconfig/fontconfig.h> 86fc018e4Smrg 96fc018e4SmrgFcBool 106fc018e4Smrgmkdir_p(const char *dir) 116fc018e4Smrg{ 126fc018e4Smrg char *parent; 136fc018e4Smrg FcBool ret; 146fc018e4Smrg 156fc018e4Smrg if (strlen (dir) == 0) 166fc018e4Smrg return FcFalse; 176fc018e4Smrg parent = (char *) FcStrDirname (dir); 186fc018e4Smrg if (!parent) 196fc018e4Smrg return FcFalse; 206fc018e4Smrg if (access (parent, F_OK) == 0) 216fc018e4Smrg ret = mkdir (dir, 0755) == 0 && chmod (dir, 0755) == 0; 226fc018e4Smrg else if (access (parent, F_OK) == -1) 236fc018e4Smrg ret = mkdir_p (parent) && (mkdir (dir, 0755) == 0) && chmod (dir, 0755) == 0; 246fc018e4Smrg else 256fc018e4Smrg ret = FcFalse; 266fc018e4Smrg free (parent); 276fc018e4Smrg 286fc018e4Smrg return ret; 296fc018e4Smrg} 306fc018e4Smrg 316fc018e4SmrgFcBool 326fc018e4Smrgunlink_dirs(const char *dir) 336fc018e4Smrg{ 346fc018e4Smrg DIR *d = opendir (dir); 356fc018e4Smrg struct dirent *e; 366fc018e4Smrg size_t len = strlen (dir); 376fc018e4Smrg char *n = NULL; 386fc018e4Smrg FcBool ret = FcTrue; 396fc018e4Smrg 406fc018e4Smrg if (!d) 416fc018e4Smrg return FcFalse; 426fc018e4Smrg while ((e = readdir(d)) != NULL) 436fc018e4Smrg { 446fc018e4Smrg size_t l; 456fc018e4Smrg 466fc018e4Smrg if (strcmp (e->d_name, ".") == 0 || 476fc018e4Smrg strcmp (e->d_name, "..") == 0) 486fc018e4Smrg continue; 496fc018e4Smrg l = strlen (e->d_name) + 1; 506fc018e4Smrg if (n) 516fc018e4Smrg free (n); 526fc018e4Smrg n = malloc (l + len + 1); 536fc018e4Smrg strcpy (n, dir); 546fc018e4Smrg n[len] = '/'; 556fc018e4Smrg strcpy (&n[len + 1], e->d_name); 566fc018e4Smrg if (e->d_type == DT_DIR) 576fc018e4Smrg { 586fc018e4Smrg if (!unlink_dirs (n)) 596fc018e4Smrg { 606fc018e4Smrg fprintf (stderr, "E: %s\n", n); 616fc018e4Smrg ret = FcFalse; 626fc018e4Smrg break; 636fc018e4Smrg } 646fc018e4Smrg } 656fc018e4Smrg else 666fc018e4Smrg { 676fc018e4Smrg if (unlink (n) == -1) 686fc018e4Smrg { 696fc018e4Smrg fprintf (stderr, "E: %s\n", n); 706fc018e4Smrg ret = FcFalse; 716fc018e4Smrg break; 726fc018e4Smrg } 736fc018e4Smrg } 746fc018e4Smrg } 756fc018e4Smrg if (n) 766fc018e4Smrg free (n); 776fc018e4Smrg closedir (d); 786fc018e4Smrg 796fc018e4Smrg if (rmdir (dir) == -1) 806fc018e4Smrg { 816fc018e4Smrg fprintf (stderr, "E: %s\n", dir); 826fc018e4Smrg return FcFalse; 836fc018e4Smrg } 846fc018e4Smrg 856fc018e4Smrg return ret; 866fc018e4Smrg} 876fc018e4Smrg 886fc018e4Smrgint 896fc018e4Smrgmain(void) 906fc018e4Smrg{ 916fc018e4Smrg char template[32] = "fontconfig-XXXXXXXX"; 926fc018e4Smrg char *tmp = mkdtemp (template); 936fc018e4Smrg size_t len = strlen (tmp), xlen, dlen; 946fc018e4Smrg char xdg[256], confd[256], fn[256], nfn[256], ud[256], nud[256]; 956fc018e4Smrg int ret = -1; 966fc018e4Smrg FILE *fp; 976fc018e4Smrg char *content = "<fontconfig></fontconfig>"; 986fc018e4Smrg 996fc018e4Smrg strcpy (xdg, tmp); 1006fc018e4Smrg strcpy (&xdg[len], "/.config"); 1016fc018e4Smrg setenv ("HOME", tmp, 1); 1026fc018e4Smrg setenv ("XDG_CONFIG_HOME", xdg, 1); 1036fc018e4Smrg xlen = strlen (xdg); 1046fc018e4Smrg strcpy (confd, xdg); 1056fc018e4Smrg strcpy (&confd[xlen], "/fontconfig"); 1066fc018e4Smrg dlen = strlen (confd); 1076fc018e4Smrg /* In case there are no configuration files nor directory */ 1086fc018e4Smrg FcInit (); 1096fc018e4Smrg if (access (confd, F_OK) == 0) 1106fc018e4Smrg { 1116fc018e4Smrg fprintf (stderr, "%s unexpectedly exists\n", confd); 1126fc018e4Smrg goto bail; 1136fc018e4Smrg } 1146fc018e4Smrg FcFini (); 1156fc018e4Smrg if (!unlink_dirs (tmp)) 1166fc018e4Smrg { 1176fc018e4Smrg fprintf (stderr, "Unable to clean up\n"); 1186fc018e4Smrg goto bail; 1196fc018e4Smrg } 1206fc018e4Smrg /* In case there are the user configuration file */ 1216fc018e4Smrg strcpy (fn, tmp); 1226fc018e4Smrg strcpy (&fn[len], "/.fonts.conf"); 1236fc018e4Smrg strcpy (nfn, confd); 1246fc018e4Smrg strcpy (&nfn[dlen], "/fonts.conf"); 1256fc018e4Smrg if (!mkdir_p (confd)) 1266fc018e4Smrg { 1276fc018e4Smrg fprintf (stderr, "Unable to create a config dir: %s\n", confd); 1286fc018e4Smrg goto bail; 1296fc018e4Smrg } 1306fc018e4Smrg if ((fp = fopen (fn, "wb")) == NULL) 1316fc018e4Smrg { 1326fc018e4Smrg fprintf (stderr, "Unable to create a config file: %s\n", fn); 1336fc018e4Smrg goto bail; 1346fc018e4Smrg } 1356fc018e4Smrg fwrite (content, sizeof (char), strlen (content), fp); 1366fc018e4Smrg fclose (fp); 1376fc018e4Smrg FcInit (); 1386fc018e4Smrg if (access (nfn, F_OK) != 0) 1396fc018e4Smrg { 1406fc018e4Smrg fprintf (stderr, "migration failed for %s\n", nfn); 1416fc018e4Smrg goto bail; 1426fc018e4Smrg } 1436fc018e4Smrg FcFini (); 1446fc018e4Smrg if (!unlink_dirs (tmp)) 1456fc018e4Smrg { 1466fc018e4Smrg fprintf (stderr, "Unable to clean up\n"); 1476fc018e4Smrg goto bail; 1486fc018e4Smrg } 1496fc018e4Smrg /* In case there are the user configuration dir */ 1506fc018e4Smrg strcpy (ud, tmp); 1516fc018e4Smrg strcpy (&ud[len], "/.fonts.conf.d"); 1526fc018e4Smrg strcpy (nud, confd); 1536fc018e4Smrg strcpy (&nud[dlen], "/conf.d"); 1546fc018e4Smrg if (!mkdir_p (ud)) 1556fc018e4Smrg { 1566fc018e4Smrg fprintf (stderr, "Unable to create a config dir: %s\n", ud); 1576fc018e4Smrg goto bail; 1586fc018e4Smrg } 1596fc018e4Smrg FcInit (); 1606fc018e4Smrg if (access (nud, F_OK) != 0) 1616fc018e4Smrg { 1626fc018e4Smrg fprintf (stderr, "migration failed for %s\n", nud); 1636fc018e4Smrg goto bail; 1646fc018e4Smrg } 1656fc018e4Smrg FcFini (); 1666fc018e4Smrg 1676fc018e4Smrg ret = 0; 1686fc018e4Smrgbail: 1696fc018e4Smrg unlink_dirs (tmp); 1706fc018e4Smrg 1716fc018e4Smrg return ret; 1726fc018e4Smrg} 173