test-migration.c revision a32e9e42
1b09479dcSmrg/* 2b09479dcSmrg * fontconfig/test/test-migration.c 3b09479dcSmrg * 4b09479dcSmrg * Copyright © 2000 Keith Packard 5b09479dcSmrg * Copyright © 2013 Akira TAGOH 6b09479dcSmrg * 7b09479dcSmrg * Permission to use, copy, modify, distribute, and sell this software and its 8b09479dcSmrg * documentation for any purpose is hereby granted without fee, provided that 9b09479dcSmrg * the above copyright notice appear in all copies and that both that 10b09479dcSmrg * copyright notice and this permission notice appear in supporting 11b09479dcSmrg * documentation, and that the name of the author(s) not be used in 12b09479dcSmrg * advertising or publicity pertaining to distribution of the software without 13b09479dcSmrg * specific, written prior permission. The authors make no 14b09479dcSmrg * representations about the suitability of this software for any purpose. It 15b09479dcSmrg * is provided "as is" without express or implied warranty. 16b09479dcSmrg * 17b09479dcSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18b09479dcSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19b09479dcSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 20b09479dcSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21b09479dcSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 22b09479dcSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 23b09479dcSmrg * PERFORMANCE OF THIS SOFTWARE. 24b09479dcSmrg */ 25a32e9e42Smrg#ifdef HAVE_CONFIG_H 26a32e9e42Smrg#include "config.h" 27a32e9e42Smrg#endif 286fc018e4Smrg#include <stdio.h> 296fc018e4Smrg#include <stdlib.h> 306fc018e4Smrg#include <string.h> 316fc018e4Smrg#include <unistd.h> 326fc018e4Smrg#include <sys/types.h> 336fc018e4Smrg#include <dirent.h> 34b09479dcSmrg#ifndef HAVE_STRUCT_DIRENT_D_TYPE 35b09479dcSmrg#include <sys/types.h> 36b09479dcSmrg#include <sys/stat.h> 37b09479dcSmrg#include <unistd.h> 38b09479dcSmrg#endif 396fc018e4Smrg#include <fontconfig/fontconfig.h> 406fc018e4Smrg 41b09479dcSmrg#ifdef HAVE_MKDTEMP 42b09479dcSmrg#define fc_mkdtemp mkdtemp 43b09479dcSmrg#else 44b09479dcSmrgchar * 45b09479dcSmrgfc_mkdtemp (char *template) 46b09479dcSmrg{ 47b09479dcSmrg if (!mktemp (template) || mkdir (template, 0700)) 48b09479dcSmrg return NULL; 49b09479dcSmrg 50b09479dcSmrg return template; 51b09479dcSmrg} 52b09479dcSmrg#endif 53b09479dcSmrg 546fc018e4SmrgFcBool 556fc018e4Smrgmkdir_p(const char *dir) 566fc018e4Smrg{ 576fc018e4Smrg char *parent; 586fc018e4Smrg FcBool ret; 596fc018e4Smrg 606fc018e4Smrg if (strlen (dir) == 0) 616fc018e4Smrg return FcFalse; 62953daebaSmrg parent = (char *) FcStrDirname ((const FcChar8 *)dir); 636fc018e4Smrg if (!parent) 646fc018e4Smrg return FcFalse; 656fc018e4Smrg if (access (parent, F_OK) == 0) 666fc018e4Smrg ret = mkdir (dir, 0755) == 0 && chmod (dir, 0755) == 0; 676fc018e4Smrg else if (access (parent, F_OK) == -1) 686fc018e4Smrg ret = mkdir_p (parent) && (mkdir (dir, 0755) == 0) && chmod (dir, 0755) == 0; 696fc018e4Smrg else 706fc018e4Smrg ret = FcFalse; 716fc018e4Smrg free (parent); 726fc018e4Smrg 736fc018e4Smrg return ret; 746fc018e4Smrg} 756fc018e4Smrg 766fc018e4SmrgFcBool 776fc018e4Smrgunlink_dirs(const char *dir) 786fc018e4Smrg{ 796fc018e4Smrg DIR *d = opendir (dir); 806fc018e4Smrg struct dirent *e; 816fc018e4Smrg size_t len = strlen (dir); 826fc018e4Smrg char *n = NULL; 836fc018e4Smrg FcBool ret = FcTrue; 84b09479dcSmrg#ifndef HAVE_STRUCT_DIRENT_D_TYPE 85b09479dcSmrg struct stat statb; 86b09479dcSmrg#endif 876fc018e4Smrg 886fc018e4Smrg if (!d) 896fc018e4Smrg return FcFalse; 906fc018e4Smrg while ((e = readdir(d)) != NULL) 916fc018e4Smrg { 926fc018e4Smrg size_t l; 936fc018e4Smrg 946fc018e4Smrg if (strcmp (e->d_name, ".") == 0 || 956fc018e4Smrg strcmp (e->d_name, "..") == 0) 966fc018e4Smrg continue; 976fc018e4Smrg l = strlen (e->d_name) + 1; 986fc018e4Smrg if (n) 996fc018e4Smrg free (n); 1006fc018e4Smrg n = malloc (l + len + 1); 1016fc018e4Smrg strcpy (n, dir); 1026fc018e4Smrg n[len] = '/'; 1036fc018e4Smrg strcpy (&n[len + 1], e->d_name); 104b09479dcSmrg#ifdef HAVE_STRUCT_DIRENT_D_TYPE 1056fc018e4Smrg if (e->d_type == DT_DIR) 106b09479dcSmrg#else 107b09479dcSmrg if (stat (n, &statb) == -1) 108b09479dcSmrg { 109b09479dcSmrg fprintf (stderr, "E: %s\n", n); 110b09479dcSmrg ret = FcFalse; 111b09479dcSmrg break; 112b09479dcSmrg } 113b09479dcSmrg if (S_ISDIR (statb.st_mode)) 114b09479dcSmrg#endif 1156fc018e4Smrg { 1166fc018e4Smrg if (!unlink_dirs (n)) 1176fc018e4Smrg { 1186fc018e4Smrg fprintf (stderr, "E: %s\n", n); 1196fc018e4Smrg ret = FcFalse; 1206fc018e4Smrg break; 1216fc018e4Smrg } 1226fc018e4Smrg } 1236fc018e4Smrg else 1246fc018e4Smrg { 1256fc018e4Smrg if (unlink (n) == -1) 1266fc018e4Smrg { 1276fc018e4Smrg fprintf (stderr, "E: %s\n", n); 1286fc018e4Smrg ret = FcFalse; 1296fc018e4Smrg break; 1306fc018e4Smrg } 1316fc018e4Smrg } 1326fc018e4Smrg } 1336fc018e4Smrg if (n) 1346fc018e4Smrg free (n); 1356fc018e4Smrg closedir (d); 1366fc018e4Smrg 1376fc018e4Smrg if (rmdir (dir) == -1) 1386fc018e4Smrg { 1396fc018e4Smrg fprintf (stderr, "E: %s\n", dir); 1406fc018e4Smrg return FcFalse; 1416fc018e4Smrg } 1426fc018e4Smrg 1436fc018e4Smrg return ret; 1446fc018e4Smrg} 1456fc018e4Smrg 1466fc018e4Smrgint 1476fc018e4Smrgmain(void) 1486fc018e4Smrg{ 1496fc018e4Smrg char template[32] = "fontconfig-XXXXXXXX"; 150b09479dcSmrg char *tmp = fc_mkdtemp (template); 1516fc018e4Smrg size_t len = strlen (tmp), xlen, dlen; 1526fc018e4Smrg char xdg[256], confd[256], fn[256], nfn[256], ud[256], nud[256]; 1536fc018e4Smrg int ret = -1; 1546fc018e4Smrg FILE *fp; 1556fc018e4Smrg char *content = "<fontconfig></fontconfig>"; 1566fc018e4Smrg 1576fc018e4Smrg strcpy (xdg, tmp); 1586fc018e4Smrg strcpy (&xdg[len], "/.config"); 1596fc018e4Smrg setenv ("HOME", tmp, 1); 1606fc018e4Smrg setenv ("XDG_CONFIG_HOME", xdg, 1); 1616fc018e4Smrg xlen = strlen (xdg); 1626fc018e4Smrg strcpy (confd, xdg); 1636fc018e4Smrg strcpy (&confd[xlen], "/fontconfig"); 1646fc018e4Smrg dlen = strlen (confd); 1656fc018e4Smrg /* In case there are no configuration files nor directory */ 1666fc018e4Smrg FcInit (); 1676fc018e4Smrg if (access (confd, F_OK) == 0) 1686fc018e4Smrg { 1696fc018e4Smrg fprintf (stderr, "%s unexpectedly exists\n", confd); 1706fc018e4Smrg goto bail; 1716fc018e4Smrg } 1726fc018e4Smrg FcFini (); 1736fc018e4Smrg if (!unlink_dirs (tmp)) 1746fc018e4Smrg { 1756fc018e4Smrg fprintf (stderr, "Unable to clean up\n"); 1766fc018e4Smrg goto bail; 1776fc018e4Smrg } 1786fc018e4Smrg /* In case there are the user configuration file */ 1796fc018e4Smrg strcpy (fn, tmp); 1806fc018e4Smrg strcpy (&fn[len], "/.fonts.conf"); 1816fc018e4Smrg strcpy (nfn, confd); 1826fc018e4Smrg strcpy (&nfn[dlen], "/fonts.conf"); 1836fc018e4Smrg if (!mkdir_p (confd)) 1846fc018e4Smrg { 1856fc018e4Smrg fprintf (stderr, "Unable to create a config dir: %s\n", confd); 1866fc018e4Smrg goto bail; 1876fc018e4Smrg } 1886fc018e4Smrg if ((fp = fopen (fn, "wb")) == NULL) 1896fc018e4Smrg { 1906fc018e4Smrg fprintf (stderr, "Unable to create a config file: %s\n", fn); 1916fc018e4Smrg goto bail; 1926fc018e4Smrg } 1936fc018e4Smrg fwrite (content, sizeof (char), strlen (content), fp); 1946fc018e4Smrg fclose (fp); 1956fc018e4Smrg FcInit (); 1966fc018e4Smrg if (access (nfn, F_OK) != 0) 1976fc018e4Smrg { 1986fc018e4Smrg fprintf (stderr, "migration failed for %s\n", nfn); 1996fc018e4Smrg goto bail; 2006fc018e4Smrg } 2016fc018e4Smrg FcFini (); 2026fc018e4Smrg if (!unlink_dirs (tmp)) 2036fc018e4Smrg { 2046fc018e4Smrg fprintf (stderr, "Unable to clean up\n"); 2056fc018e4Smrg goto bail; 2066fc018e4Smrg } 2076fc018e4Smrg /* In case there are the user configuration dir */ 2086fc018e4Smrg strcpy (ud, tmp); 2096fc018e4Smrg strcpy (&ud[len], "/.fonts.conf.d"); 2106fc018e4Smrg strcpy (nud, confd); 2116fc018e4Smrg strcpy (&nud[dlen], "/conf.d"); 2126fc018e4Smrg if (!mkdir_p (ud)) 2136fc018e4Smrg { 2146fc018e4Smrg fprintf (stderr, "Unable to create a config dir: %s\n", ud); 2156fc018e4Smrg goto bail; 2166fc018e4Smrg } 2176fc018e4Smrg FcInit (); 2186fc018e4Smrg if (access (nud, F_OK) != 0) 2196fc018e4Smrg { 2206fc018e4Smrg fprintf (stderr, "migration failed for %s\n", nud); 2216fc018e4Smrg goto bail; 2226fc018e4Smrg } 2236fc018e4Smrg FcFini (); 2246fc018e4Smrg 2256fc018e4Smrg ret = 0; 2266fc018e4Smrgbail: 2276fc018e4Smrg unlink_dirs (tmp); 2286fc018e4Smrg 2296fc018e4Smrg return ret; 2306fc018e4Smrg} 231