#include "../libvlc.h"
#include <vlc_charset.h>
+#include "config/configuration.h"
#include <unistd.h>
#include <pwd.h>
/**
* Determines the shared data directory
*
+ * @return a nul-terminated string or NULL. Use free() to release it.
+ */
+char *config_GetDataDirDefault (void)
+{
+ return strdup (DATA_PATH);
+}
+
+/**
+ * Determines the architecture-dependent data directory
+ *
* @return a string (always succeeds).
*/
-const char *config_GetDataDir( void )
+const char *config_GetLibDir (void)
{
- return DATA_PATH;
+ return PKGLIBDIR;
}
/**
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;
}
-/**
- * Get the user's VLC cache directory
- * (used for stuff like the modules cache, the album art cache, ...)
- */
-char *config_GetCacheDir( void )
-{
- return config_GetAppDir ("CACHE", ".cache");
-}
-
char *config_GetUserDir (vlc_userdir_t type)
{
switch (type)
{
case VLC_HOME_DIR:
- return config_GetHomeDir ();
+ break;
case VLC_CONFIG_DIR:
return config_GetAppDir ("CONFIG", ".config");
case VLC_DATA_DIR:
return config_GetAppDir ("DATA", ".local/share");
+ case VLC_CACHE_DIR:
+ return config_GetAppDir ("CACHE", ".cache");
+
case VLC_DESKTOP_DIR:
return config_GetTypeDir ("DESKTOP");
case VLC_DOWNLOAD_DIR:
case VLC_VIDEOS_DIR:
return config_GetTypeDir ("VIDEOS");
}
- assert (0);
+ return config_GetHomeDir ();
}