Warn if no <test> nor <edit> elements in <match>
[platform/upstream/fontconfig.git] / test / test-migration.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <dirent.h>
7 #ifndef HAVE_STRUCT_DIRENT_D_TYPE
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <unistd.h>
11 #endif
12 #include <fontconfig/fontconfig.h>
13
14 #ifdef HAVE_MKDTEMP
15 #define fc_mkdtemp      mkdtemp
16 #else
17 char *
18 fc_mkdtemp (char *template)
19 {
20     if (!mktemp (template) || mkdir (template, 0700))
21         return NULL;
22
23     return template;
24 }
25 #endif
26
27 FcBool
28 mkdir_p(const char *dir)
29 {
30     char *parent;
31     FcBool ret;
32
33     if (strlen (dir) == 0)
34         return FcFalse;
35     parent = (char *) FcStrDirname (dir);
36     if (!parent)
37         return FcFalse;
38     if (access (parent, F_OK) == 0)
39         ret = mkdir (dir, 0755) == 0 && chmod (dir, 0755) == 0;
40     else if (access (parent, F_OK) == -1)
41         ret = mkdir_p (parent) && (mkdir (dir, 0755) == 0) && chmod (dir, 0755) == 0;
42     else
43         ret = FcFalse;
44     free (parent);
45
46     return ret;
47 }
48
49 FcBool
50 unlink_dirs(const char *dir)
51 {
52     DIR *d = opendir (dir);
53     struct dirent *e;
54     size_t len = strlen (dir);
55     char *n = NULL;
56     FcBool ret = FcTrue;
57 #ifndef HAVE_STRUCT_DIRENT_D_TYPE
58     struct stat statb;
59 #endif
60
61     if (!d)
62         return FcFalse;
63     while ((e = readdir(d)) != NULL)
64     {
65         size_t l;
66
67         if (strcmp (e->d_name, ".") == 0 ||
68             strcmp (e->d_name, "..") == 0)
69             continue;
70         l = strlen (e->d_name) + 1;
71         if (n)
72             free (n);
73         n = malloc (l + len + 1);
74         strcpy (n, dir);
75         n[len] = '/';
76         strcpy (&n[len + 1], e->d_name);
77 #ifdef HAVE_STRUCT_DIRENT_D_TYPE
78         if (e->d_type == DT_DIR)
79 #else
80         if (stat (n, &statb) == -1)
81         {
82                 fprintf (stderr, "E: %s\n", n);
83                 ret = FcFalse;
84                 break;
85         }
86         if (S_ISDIR (statb.st_mode))
87 #endif
88         {
89             if (!unlink_dirs (n))
90             {
91                 fprintf (stderr, "E: %s\n", n);
92                 ret = FcFalse;
93                 break;
94             }
95         }
96         else
97         {
98             if (unlink (n) == -1)
99             {
100                 fprintf (stderr, "E: %s\n", n);
101                 ret = FcFalse;
102                 break;
103             }
104         }
105     }
106     if (n)
107         free (n);
108     closedir (d);
109
110     if (rmdir (dir) == -1)
111     {
112         fprintf (stderr, "E: %s\n", dir);
113         return FcFalse;
114     }
115
116     return ret;
117 }
118
119 int
120 main(void)
121 {
122     char template[32] = "fontconfig-XXXXXXXX";
123     char *tmp = fc_mkdtemp (template);
124     size_t len = strlen (tmp), xlen, dlen;
125     char xdg[256], confd[256], fn[256], nfn[256], ud[256], nud[256];
126     int ret = -1;
127     FILE *fp;
128     char *content = "<fontconfig></fontconfig>";
129
130     strcpy (xdg, tmp);
131     strcpy (&xdg[len], "/.config");
132     setenv ("HOME", tmp, 1);
133     setenv ("XDG_CONFIG_HOME", xdg, 1);
134     xlen = strlen (xdg);
135     strcpy (confd, xdg);
136     strcpy (&confd[xlen], "/fontconfig");
137     dlen = strlen (confd);
138     /* In case there are no configuration files nor directory */
139     FcInit ();
140     if (access (confd, F_OK) == 0)
141     {
142         fprintf (stderr, "%s unexpectedly exists\n", confd);
143         goto bail;
144     }
145     FcFini ();
146     if (!unlink_dirs (tmp))
147     {
148         fprintf (stderr, "Unable to clean up\n");
149         goto bail;
150     }
151     /* In case there are the user configuration file */
152     strcpy (fn, tmp);
153     strcpy (&fn[len], "/.fonts.conf");
154     strcpy (nfn, confd);
155     strcpy (&nfn[dlen], "/fonts.conf");
156     if (!mkdir_p (confd))
157     {
158         fprintf (stderr, "Unable to create a config dir: %s\n", confd);
159         goto bail;
160     }
161     if ((fp = fopen (fn, "wb")) == NULL)
162     {
163         fprintf (stderr, "Unable to create a config file: %s\n", fn);
164         goto bail;
165     }
166     fwrite (content, sizeof (char), strlen (content), fp);
167     fclose (fp);
168     FcInit ();
169     if (access (nfn, F_OK) != 0)
170     {
171         fprintf (stderr, "migration failed for %s\n", nfn);
172         goto bail;
173     }
174     FcFini ();
175     if (!unlink_dirs (tmp))
176     {
177         fprintf (stderr, "Unable to clean up\n");
178         goto bail;
179     }
180     /* In case there are the user configuration dir */
181     strcpy (ud, tmp);
182     strcpy (&ud[len], "/.fonts.conf.d");
183     strcpy (nud, confd);
184     strcpy (&nud[dlen], "/conf.d");
185     if (!mkdir_p (ud))
186     {
187         fprintf (stderr, "Unable to create a config dir: %s\n", ud);
188         goto bail;
189     }
190     FcInit ();
191     if (access (nud, F_OK) != 0)
192     {
193         fprintf (stderr, "migration failed for %s\n", nud);
194         goto bail;
195     }
196     FcFini ();
197
198     ret = 0;
199 bail:
200     unlink_dirs (tmp);
201
202     return ret;
203 }