From 4f99d163cb8a993f176f305566dbd8a93c79144c Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Thu, 12 Jul 2018 18:18:43 +0200 Subject: [PATCH] Retrieve directory list from environment variables This adds a function able to retrieve from a prefix and suffix an environment variable. This is meant to search config or plugin files from potentially several sources, environment and source code. This tries to get 2 environments variables: - prefix+binderName+suffix (eg: AFT_LOWCAN_CONFIG_PATH) - prefix+suffix (eg: AFT_CONFIG_PATH) Then it returns the one found or both if they exist with the most accurate one (with the binder name) first followed by the other. Change-Id: Ic448ff017e6158bec05895d63688b8968b5c6434 Signed-off-by: Romain Forlot --- filescan-utils.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ filescan-utils.h | 22 +++++++++++++--- 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/filescan-utils.c b/filescan-utils.c index 6b3cf65..6c443ea 100644 --- a/filescan-utils.c +++ b/filescan-utils.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#include #include #include #include @@ -169,3 +170,80 @@ char* GetBindingDirPath(struct afb_dynapi* dynapi) return strndup(retdir, sizeof(retdir)); } + + +/** + * @brief Takes an input string and makes it upper case. The output buffer + * should be able to contains the whole input string else it will be truncated + * at the output_size. + * + * @param input the input string to transform in an upper case version + * @param output the upper case version of the input string + * @param output_size the output buffer size, if size < to strlen of input then + * the output will be truncated. + * + * @return size_t the string length of the resulting output variable, which should + * be equal to the size of input string length. + */ +static size_t toUpperString(const char *input, char *output, size_t output_size) { + int i = 0; + + if(input && output) { + while(input[i] && i <= output_size) { + output[i] = (char)toupper(input[i]); + i++; + } + output[i] = '\0'; + return strlen(output); + } + + return 0; +} + +const char *getEnvDirList(const char *prefix, const char *suffix) { + size_t lenSimple = 0, lenFull = 0, plen = 0, slen = 0, blen = 0; + char *envConfigPathSimple = NULL, *envConfigPathFull = NULL; + char *upperPrefix = NULL, *upperSuffix = NULL, *upperBinderName = NULL; + char *envDirList = NULL; + const char *binderName = GetBinderName(), *envDirListSimple = NULL; + const char *envDirListFull = NULL; + + if(! prefix || ! suffix) + return NULL; + + plen = strlen(prefix); + upperPrefix = alloca(plen + 1); + + slen = strlen(suffix); + upperSuffix = alloca(slen + 1); + + blen = strlen(binderName); + upperBinderName = alloca(blen + 1); + + lenSimple = plen + slen + 1; + envConfigPathSimple = alloca(lenSimple + 1); + + lenFull = slen + blen + slen + 2; + envConfigPathFull = alloca(lenFull + 1); + + if(toUpperString(prefix, upperPrefix, plen) != plen || + toUpperString(suffix, upperSuffix, slen) != slen || + toUpperString(binderName, upperBinderName, blen) != blen || + (snprintf(envConfigPathSimple, lenSimple + 1, "%s_%s", upperPrefix, upperSuffix) >= lenSimple + 1) || + (snprintf(envConfigPathFull, lenFull + 1, "%s_%s_%s", upperPrefix, upperBinderName, upperSuffix) >= lenFull + 1)) { + return NULL; + } + + envDirListFull = getenv(envConfigPathFull); + envDirListSimple = getenv(envConfigPathSimple); + if(envDirListSimple && envDirListFull) { + lenFull = strlen(envDirListSimple) + strlen(envDirListFull) + 1; + envDirList = malloc(lenFull + 1); + snprintf(envDirList, lenFull + 1, "%s:%s", envDirListFull, envDirListSimple); + } + else { + envDirList = envDirListSimple ? strdup(envDirListSimple) : envDirListFull ? strdup(envDirListFull) : NULL; + } + + return envDirList; +} diff --git a/filescan-utils.h b/filescan-utils.h index 317ee7e..bf8fb53 100644 --- a/filescan-utils.h +++ b/filescan-utils.h @@ -55,14 +55,14 @@ typedef enum { * * @return const char* */ -const char *GetMiddleName(const char *name); +extern const char *GetMiddleName(const char *name); /** * @brief Get the Binder Name without the prefix set by the AGL appfw 'afbd-' * * @return const char* the Binder name without the prefix. */ -const char *GetBinderName(); +extern const char *GetBinderName(); /** * @brief Scan a directory searching all files matching pattern: @@ -77,7 +77,7 @@ const char *GetBinderName(); * describing the fullpath to reach the file and 'filename' containing the * matched files. */ -json_object* ScanForConfig (const char* searchPath, CtlScanDirModeT mode, const char *prefix, const char *extension); +extern json_object* ScanForConfig (const char* searchPath, CtlScanDirModeT mode, const char *prefix, const char *extension); /** * @brief Get the Binding root directory file descriptor object @@ -86,7 +86,21 @@ json_object* ScanForConfig (const char* searchPath, CtlScanDirModeT mode, const * * @return char* string representing the path to binding root directory. */ -char *GetBindingDirPath(struct afb_dynapi *dynapi); +extern char *GetBindingDirPath(struct afb_dynapi *dynapi); + +/** + * @brief Get the environment directory colon separated path list. This take the + * prefix add the binder's name then the suffix as environment variable name and + * also search for another variable without the binder's name (so only + * prefix+suffix). + * + * @param prefix Environment variable prefix + * @param suffix Environment variable suffix + * + * @return const char* a string representing a colon separated path list or NULL + * is case of error or none environment variables found. + */ +extern const char *getEnvDirList(const char *prefix, const char *suffix); #ifdef __cplusplus } -- 2.16.6