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)
FILE *stream = fopen (path, "rt");
free (path);
if (stream == NULL)
return NULL;
char *linebuf = NULL;
size_t linelen = 0;
while (getline (&linebuf, &linelen, stream) != -1)
path = NULL;
if (stream != NULL)
{
char *ptr = linebuf;
ptr += strspn (ptr, " \t"); /* Skip whites */
if (strncmp (ptr, "XDG_", 4))
continue;
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))
char *linebuf = NULL;
size_t linelen = 0;
while (getline (&linebuf, &linelen, stream) != -1)
{
path = malloc (linelen);
if (path == NULL)
char *ptr = linebuf;
ptr += strspn (ptr, " \t"); /* Skip whites */
if (strncmp (ptr, "XDG_", 4))
continue;
out = path;
}
else
{ /* Prefix with $HOME */
ptr += 5;
path = malloc (homelen + linelen - 5);
if (path == NULL)
ptr += 4; /* Skip XDG_ */
if (strncmp (ptr, xdg_name, namelen))
continue;
memcpy (path, home, homelen);
out = path + homelen;
}
while (*ptr != '"')
{
if (*ptr == '\\')
ptr++;
if (*ptr == '\0')
goto skip;
*(out++) = *(ptr++);
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);
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';
goto done;
skip:
free (path);
free (linebuf);
fclose (stream);
}
/* Default! */
if (strcmp (xdg_name, "DESKTOP") == 0)
if (path == NULL)
{
if (asprintf (&path, "%s/Desktop", home) == -1)
path = NULL;
if (strcmp (xdg_name, "DESKTOP") == 0)
{
if (asprintf (&path, "%s/Desktop", home) == -1)
path = NULL;
}
else
path = strdup (home);
}
else
path = strdup (home);
done:
free (linebuf);
char *ret = FromLocaleDup (path);
free (path);
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