Retrieve directory list from environment variables 77/15377/4
authorRomain Forlot <romain.forlot@iot.bzh>
Thu, 12 Jul 2018 16:18:43 +0000 (18:18 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Mon, 16 Jul 2018 22:51:53 +0000 (00:51 +0200)
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 <romain.forlot@iot.bzh>
filescan-utils.c
filescan-utils.h

index 6b3cf65..6c443ea 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #define _GNU_SOURCE
+#include <ctype.h>
 #include <dirent.h>
 #include <stdio.h>
 #include <string.h>
@@ -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;
+}
index 317ee7e..bf8fb53 100644 (file)
@@ -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
     }