Commit 4ab00885 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

xdg-dirs: falls back correctly if configuration is missing

parent 01b57344
...@@ -121,78 +121,84 @@ static char *config_GetTypeDir (const char *xdg_name) ...@@ -121,78 +121,84 @@ static char *config_GetTypeDir (const char *xdg_name)
FILE *stream = fopen (path, "rt"); FILE *stream = fopen (path, "rt");
free (path); free (path);
if (stream == NULL) path = NULL;
return NULL; if (stream != NULL)
char *linebuf = NULL;
size_t linelen = 0;
while (getline (&linebuf, &linelen, stream) != -1)
{ {
char *ptr = linebuf; char *linebuf = NULL;
ptr += strspn (ptr, " \t"); /* Skip whites */ size_t linelen = 0;
if (strncmp (ptr, "XDG_", 4))
continue; while (getline (&linebuf, &linelen, stream) != -1)
ptr += 4; /* Skip XDG_ */
if (strncmp (ptr, xdg_name, namelen))
continue;
ptr += namelen; /* Skip XDG type name */
if (strncmp (ptr, "_DIR", 4))
continue;
ptr += 4; /* Skip _DIR */
ptr += strspn (ptr, " \t"); /* Skip whites */
if (*ptr != '=')
continue;
ptr++; /* Skip equality sign */
ptr += strspn (ptr, " \t"); /* Skip whites */
if (*ptr != '"')
continue;
ptr++; /* Skip quote */
linelen -= ptr - linebuf;
char *out;
if (strncmp (ptr, "$HOME", 5))
{ {
path = malloc (linelen); char *ptr = linebuf;
if (path == NULL) ptr += strspn (ptr, " \t"); /* Skip whites */
if (strncmp (ptr, "XDG_", 4))
continue; continue;
out = path; ptr += 4; /* Skip XDG_ */
} if (strncmp (ptr, xdg_name, namelen))
else
{ /* Prefix with $HOME */
ptr += 5;
path = malloc (homelen + linelen - 5);
if (path == NULL)
continue; continue;
memcpy (path, home, homelen); ptr += namelen; /* Skip XDG type name */
out = path + homelen; if (strncmp (ptr, "_DIR", 4))
} continue;
ptr += 4; /* Skip _DIR */
while (*ptr != '"') ptr += strspn (ptr, " \t"); /* Skip whites */
{ if (*ptr != '=')
if (*ptr == '\\') continue;
ptr++; ptr++; /* Skip equality sign */
if (*ptr == '\0') ptr += strspn (ptr, " \t"); /* Skip whites */
goto skip; if (*ptr != '"')
*(out++) = *(ptr++); continue;
ptr++; /* Skip quote */
linelen -= ptr - linebuf;
char *out;
if (strncmp (ptr, "$HOME", 5))
{
path = malloc (linelen);
if (path == NULL)
continue;
out = path;
}
else
{ /* Prefix with $HOME */
ptr += 5;
path = malloc (homelen + linelen - 5);
if (path == NULL)
continue;
memcpy (path, home, homelen);
out = path + homelen;
}
while (*ptr != '"')
{
if (*ptr == '\\')
ptr++;
if (*ptr == '\0')
{
free (path);
path = NULL;
continue;
}
*(out++) = *(ptr++);
}
*out = '\0';
break;
} }
*out = '\0'; free (linebuf);
goto done; fclose (stream);
skip:
free (path);
} }
/* Default! */ /* Default! */
if (strcmp (xdg_name, "DESKTOP") == 0) if (path == NULL)
{ {
if (asprintf (&path, "%s/Desktop", home) == -1) if (strcmp (xdg_name, "DESKTOP") == 0)
path = NULL; {
if (asprintf (&path, "%s/Desktop", home) == -1)
path = NULL;
}
else
path = strdup (home);
} }
else
path = strdup (home);
done:
free (linebuf);
char *ret = FromLocaleDup (path); char *ret = FromLocaleDup (path);
free (path); free (path);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment