]> git.sesse.net Git - vlc/blobdiff - src/config/dirs_xdg.c
config_GetLibDir: return arch-dep package directory
[vlc] / src / config / dirs_xdg.c
index d3a7ea214da71ce83c50c656af1dba12c0dd755f..8dd92cf2c4f7ca28e43accb136856d3a1deb25fc 100644 (file)
@@ -29,6 +29,7 @@
 
 #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;
 }
 
 /**
@@ -121,103 +132,103 @@ 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;
 }
 
 
-/**
- * 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:
@@ -235,5 +246,5 @@ char *config_GetUserDir (vlc_userdir_t type)
         case VLC_VIDEOS_DIR:
             return config_GetTypeDir ("VIDEOS");
     }
-    assert (0);
+    return config_GetHomeDir ();
 }