From 5acf93221176ebc83e5b097e4ae78b5f8014836b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 3 Mar 2018 18:01:11 +0200 Subject: [PATCH] config: add more generic config_GetSysDir() A quick survey of used installation directories yields those: datadir, libdir, localedir, pkgdatadir, pkglibdir, pkglibexecdir. The current pair of functions is up to the requirements. This provides a more generic function prototype, similar to what is done for user directories. Refs #19748, #19894. --- include/vlc_configuration.h | 27 ++++++++++++++++++++++++++- src/darwin/dirs.c | 25 +++++++++++++++++++++++++ src/libvlccore.sym | 1 + src/os2/dirs.c | 25 +++++++++++++++++++++++++ src/posix/dirs.c | 26 ++++++++++++++++++++++++++ src/win32/dirs.c | 26 ++++++++++++++++++++++++++ 6 files changed, 129 insertions(+), 1 deletion(-) diff --git a/include/vlc_configuration.h b/include/vlc_configuration.h index 8421c370f4..f0906da03a 100644 --- a/include/vlc_configuration.h +++ b/include/vlc_configuration.h @@ -297,7 +297,32 @@ VLC_API char *config_GetDataDir(void) VLC_USED VLC_MALLOC; */ VLC_API char *config_GetLibDir(void) VLC_USED VLC_MALLOC; -typedef enum vlc_userdir +/** + * System directory identifiers + */ +typedef enum vlc_system_dir +{ + VLC_PKG_DATA_DIR, /**< Package-specific architecture-independent read-only + data directory (e.g. /usr/local/data/vlc). */ + VLC_PKG_LIB_DIR, /**< Package-specific architecture-dependent read-only + data directory (e.g. /usr/local/lib/vlc). */ +} vlc_sysdir_t; + +/** + * Gets an installation directory. + * + * This function determines one of the installation directory. + * + * @param dir identifier of the directory (see \ref vlc_sysdir_t) + * @param filename name of a file or other object within the directory + * (or NULL to obtain the plain directory) + * + * @return a heap-allocated string (use free() to release it), or NULL on error + */ +VLC_API char *config_GetSysPath(vlc_sysdir_t dir, const char *filename) +VLC_USED VLC_MALLOC; + +typedef enum vlc_user_dir { VLC_HOME_DIR, /* User's home */ VLC_CONFIG_DIR, /* VLC-specific configuration directory */ diff --git a/src/darwin/dirs.c b/src/darwin/dirs.c index 9fb15b6dcf..59d60c0fd6 100644 --- a/src/darwin/dirs.c +++ b/src/darwin/dirs.c @@ -108,6 +108,31 @@ char *config_GetDataDir (void) return datadir; } +char *config_GetSysPath(vlc_sysdir_t type, const char *filename) +{ + char *dir; + + switch (type) + { + case VLC_PKG_DATA_DIR: + dir = config_GetDataDir(); + break; + case VLC_PKG_LIB_DIR: + dir = config_GetLibDir(); + break; + default: + vlc_assert_unreachable(); + } + + if (filename == NULL || unlikely(dir == NULL)) + return dir; + + char *path; + asprintf(&path, "%s/%s", dir, filename); + free(dir); + return path; +} + static char *config_GetHomeDir (void) { const char *home = getenv ("HOME"); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 740b3b53f8..6ed142207e 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -54,6 +54,7 @@ config_FindConfig config_GetDataDir config_GetLibDir config_GetFloat +config_GetSysPath config_GetUserDir config_GetInt config_GetIntChoices diff --git a/src/os2/dirs.c b/src/os2/dirs.c index f5753df209..27a1d8a7c6 100644 --- a/src/os2/dirs.c +++ b/src/os2/dirs.c @@ -64,6 +64,31 @@ char *config_GetDataDir (void) return datadir; } +char *config_GetSysPath(vlc_sysdir_t type, const char *filename) +{ + char *dir; + + switch (type) + { + case VLC_PKG_DATA_DIR: + dir = config_GetDataDir(); + break; + case VLC_PKG_LIB_DIR: + dir = config_GetLibDir(); + break; + default: + vlc_assert_unreachable(); + } + + if (filename == NULL || unlikely(dir == NULL)) + return dir; + + char *path; + asprintf(&path, "%s/%s", dir, filename); + free(dir); + return path; +} + static char *config_GetHomeDir (void) { const char *home = getenv ("HOME"); diff --git a/src/posix/dirs.c b/src/posix/dirs.c index 0514a41a6a..493a67190d 100644 --- a/src/posix/dirs.c +++ b/src/posix/dirs.c @@ -57,6 +57,32 @@ VLC_WEAK char *config_GetLibDir(void) return strdup((path != NULL) ? path : PKGLIBDIR); } +char *config_GetSysPath(vlc_sysdir_t type, const char *filename) +{ + char *dir; + + switch (type) + { + case VLC_PKG_DATA_DIR: + dir = config_GetDataDir(); + break; + case VLC_PKG_LIB_DIR: + dir = config_GetLibDir(); + break; + default: + vlc_assert_unreachable(); + } + + if (filename == NULL || unlikely(dir == NULL)) + return dir; + + char *path; + if (unlikely(asprintf(&path, "%s/%s", dir, filename) == -1)) + path = NULL; + free(dir); + return path; +} + static char *config_GetHomeDir (void) { /* 1/ Try $HOME */ diff --git a/src/win32/dirs.c b/src/win32/dirs.c index 5e5dd09570..0cbb063780 100644 --- a/src/win32/dirs.c +++ b/src/win32/dirs.c @@ -212,6 +212,32 @@ char *config_GetDataDir (void) return (path != NULL) ? strdup (path) : config_GetLibDir (); } +char *config_GetSysPath(vlc_sysdir_t type, const char *filename) +{ + char *dir; + + switch (type) + { + case VLC_PKG_DATA_DIR: + dir = config_GetDataDir(); + break; + case VLC_PKG_LIB_DIR: + dir = config_GetLibDir(); + break; + default: + vlc_assert_unreachable(); + } + + if (filename == NULL || unlikely(dir == NULL)) + return dir; + + char *path; + if (unlikely(asprintf(&path, "%s/%s", dir, filename) == -1)) + path = NULL; + free(dir); + return path; +} + static char *config_GetShellDir (int csidl) { wchar_t wdir[MAX_PATH];