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