diff --git a/configure.ac b/configure.ac index 2e7635e29..12beaf5eb 100644 --- a/configure.ac +++ b/configure.ac @@ -379,24 +379,15 @@ AC_FUNC_VPRINTF AC_CHECK_FUNCS(\ atexit \ gettimeofday \ - inet_ntop \ - inet_pton \ - inet_aton \ memmove \ - sigaction \ - sigwait \ - sigsuspend \ - stpcpy \ - strcasecmp \ - strtoul \ - stricmp \ strerror \ + inet_ntop inet_pton inet_aton \ + sigaction sigwait sigsuspend \ + stpcpy strcasecmp strtoul stricmp \ writev \ - utime \ - utimes \ - sem_timedwait \ - pthread_yield \ - sched_yield \ + utime utimes sem_timedwait \ + pthread_yield sched_yield \ + getenv putenv setenv unsetenv \ ) AC_SEARCH_LIBS(gethostbyname, nsl) diff --git a/lib/core/include/core_lib.h b/lib/core/include/core_lib.h index 9cb592a50..67ce22730 100644 --- a/lib/core/include/core_lib.h +++ b/lib/core/include/core_lib.h @@ -114,6 +114,26 @@ CORE_DECLARE(void *) core_buffer_to_bcd(c_uint8_t *in, int in_len, void *out); */ CORE_DECLARE(char *)core_cpystrn(char *dst, const char *src, size_t dst_size); +/** + * Get the value of an environment variable + * @param value the returned value, allocated from @a pool + * @param envvar the name of the environment variable + */ +CORE_DECLARE(char *) core_env_get(const char *envvar); + +/** + * Set the value of an environment variable + * @param envvar the name of the environment variable + * @param value the value to set + */ +CORE_DECLARE(status_t) core_env_set(const char *envvar, const char *value); + +/** + * Delete a variable from the environment + * @param envvar the name of the environment variable + */ +CORE_DECLARE(status_t) core_env_delete(const char *envvar); + /** @} */ #ifdef __cplusplus diff --git a/lib/core/src/misc.c b/lib/core/src/misc.c index dc1a992cf..4734b9c53 100644 --- a/lib/core/src/misc.c +++ b/lib/core/src/misc.c @@ -143,3 +143,56 @@ char *core_cpystrn(char *dst, const char *src, size_t dst_size) return (d); } + +char *core_env_get(const char *envvar) +{ +#ifdef HAVE_GETENV + return getenv(envvar); +#else + return NULL; +#endif +} + + +status_t core_env_set(const char *envvar, const char *value) +{ +#if defined(HAVE_SETENV) + + if (0 > setenv(envvar, value, 1)) + return CORE_ENOMEM; + return CORE_OK; + +#elif defined(HAVE_PUTENV) + + char buf[HUGE_STRING_LEN]; + + if (snprintf(buf, HUGE_STRING_LEN, "%s=%s", envvar, value) < 0) + return CORE_ENOMEM; + if (0 > putenv(buf)) + return CORE_ENOMEM; + return CORE_OK; + +#else + return CORE_ENOTIMPL; +#endif +} + + +status_t core_env_delete(const char *envvar) +{ +#ifdef HAVE_UNSETENV + + unsetenv(envvar); + return CORE_OK; + +#else + /* hint: some platforms allow envvars to be unset via + * putenv("varname")... that isn't Single Unix spec, + * but if your platform doesn't have unsetenv() it is + * worth investigating and potentially adding a + * configure check to decide when to use that form of + * putenv() here + */ + return CORE_ENOTIMPL; +#endif +} diff --git a/lib/core/test/testmisc.c b/lib/core/test/testmisc.c index dc0d005bb..80af4e1aa 100644 --- a/lib/core/test/testmisc.c +++ b/lib/core/test/testmisc.c @@ -137,6 +137,54 @@ static void misc_test7(abts_case *tc, void *data) ABTS_TRUE(tc, strcmp("001010123456819", out) == 0); } +#define TEST_ENVVAR_NAME "core_test_envvar" +#define TEST_ENVVAR2_NAME "core_test_envvar2" +#define TEST_ENVVAR_VALUE "Just a value that we'll check" + +static void misc_test8(abts_case *tc, void *data) +{ + char *value; + status_t rv; + + rv = core_env_set(TEST_ENVVAR_NAME, TEST_ENVVAR_VALUE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + value = core_env_get(TEST_ENVVAR_NAME); + ABTS_PTR_NOTNULL(tc, value); + ABTS_STR_EQUAL(tc, TEST_ENVVAR_VALUE, value); + + rv = core_env_delete(TEST_ENVVAR_NAME); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + value = core_env_get(TEST_ENVVAR_NAME); + ABTS_PTR_NULL(tc, value); + + rv = core_env_set(TEST_ENVVAR_NAME, ""); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + value = core_env_get(TEST_ENVVAR_NAME); + ABTS_PTR_NOTNULL(tc, value); + ABTS_STR_EQUAL(tc, "", value); + + rv = core_env_delete(TEST_ENVVAR_NAME); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + value = core_env_get(TEST_ENVVAR_NAME); + ABTS_PTR_NULL(tc, value); + + rv = core_env_set(TEST_ENVVAR2_NAME, TEST_ENVVAR_VALUE); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + value = core_env_get(TEST_ENVVAR2_NAME); + ABTS_PTR_NOTNULL(tc, value); + ABTS_STR_EQUAL(tc, TEST_ENVVAR_VALUE, value); + value = core_env_get(TEST_ENVVAR_NAME); + ABTS_PTR_NULL(tc, value); + value = core_env_get(TEST_ENVVAR2_NAME); + ABTS_PTR_NOTNULL(tc, value); + ABTS_STR_EQUAL(tc, TEST_ENVVAR_VALUE, value); + + rv = core_env_delete(TEST_ENVVAR2_NAME); + ABTS_INT_EQUAL(tc, CORE_OK, rv); + value = core_env_get(TEST_ENVVAR2_NAME); + ABTS_PTR_NULL(tc, value); +} + abts_suite *testmisc(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -148,6 +196,7 @@ abts_suite *testmisc(abts_suite *suite) abts_run_test(suite, misc_test5, NULL); abts_run_test(suite, misc_test6, NULL); abts_run_test(suite, misc_test7, NULL); + abts_run_test(suite, misc_test8, NULL); return suite; } diff --git a/src/app/init.c b/src/app/init.c index ed04966fc..029e8765e 100644 --- a/src/app/init.c +++ b/src/app/init.c @@ -3,6 +3,7 @@ #include "core_debug.h" #include "core_thread.h" #include "core_file.h" +#include "core_lib.h" #include "context.h" @@ -48,6 +49,10 @@ status_t app_will_initialize(const char *config_path, const char *log_path) if (context_self()->db_uri) { + /* Override configuration if DB_URI environment variable is existed */ + if (core_env_get("DB_URI")) + context_self()->db_uri = core_env_get("DB_URI"); + rv = context_db_init(context_self()->db_uri); if (rv != CORE_OK) return rv; d_print(" MongoDB URI : '%s'\n", context_self()->db_uri);