diff options
-rw-r--r-- | src/blogc/funcvars.c | 1 | ||||
-rw-r--r-- | src/blogc/sysinfo.c | 39 | ||||
-rw-r--r-- | src/blogc/sysinfo.h | 3 | ||||
-rw-r--r-- | src/common/file.c | 2 |
4 files changed, 44 insertions, 1 deletions
diff --git a/src/blogc/funcvars.c b/src/blogc/funcvars.c index beb5f8a..25a22bf 100644 --- a/src/blogc/funcvars.c +++ b/src/blogc/funcvars.c @@ -38,6 +38,7 @@ static const struct func_map { {"BLOGC_SYSINFO_DATETIME", blogc_sysinfo_inject_datetime}, #endif + {"BLOGC_SYSINFO_INSIDE_DOCKER", blogc_sysinfo_inject_inside_docker}, {NULL, NULL}, }; diff --git a/src/blogc/sysinfo.c b/src/blogc/sysinfo.c index 61c8b1d..9d03b61 100644 --- a/src/blogc/sysinfo.c +++ b/src/blogc/sysinfo.c @@ -26,7 +26,11 @@ #include <time.h> #endif /* HAVE_TIME_H */ +#include <stdbool.h> #include <stdlib.h> +#include <string.h> +#include "../common/error.h" +#include "../common/file.h" #include "../common/utils.h" #include "sysinfo.h" @@ -116,3 +120,38 @@ blogc_sysinfo_inject_datetime(bc_trie_t *global) bc_trie_insert(global, "BLOGC_SYSINFO_DATETIME", t); } + + +// it is obviously impossible that the same process runs inside and outside +// docker at the same time, then an unprotected global variable should be fine +// here +static bool inside_docker_evaluated = false; +static bool inside_docker = false; + +bool +blogc_sysinfo_get_inside_docker(void) +{ + if (inside_docker_evaluated) + return inside_docker; + inside_docker_evaluated = true; + + size_t len; + bc_error_t *err = NULL; + char *contents = bc_file_get_contents("/proc/1/cgroup", false, &len, &err); + if (err != NULL) { + inside_docker = false; + return inside_docker; + } + + bool inside_docker = NULL != strstr(contents, "/docker/"); + free(contents); + return inside_docker; +} + + +void +blogc_sysinfo_inject_inside_docker(bc_trie_t *global) +{ + if (blogc_sysinfo_get_inside_docker()) + bc_trie_insert(global, "BLOGC_SYSINFO_INSIDE_DOCKER", bc_strdup("1")); +} diff --git a/src/blogc/sysinfo.h b/src/blogc/sysinfo.h index 25f2177..783b656 100644 --- a/src/blogc/sysinfo.h +++ b/src/blogc/sysinfo.h @@ -31,6 +31,7 @@ #define HAVE_SYSINFO_DATETIME 1 #endif /* HAVE_TIME_H */ +#include <stdbool.h> #include "../common/utils.h" char* blogc_sysinfo_get_hostname(void); @@ -39,5 +40,7 @@ char* blogc_sysinfo_get_username(void); void blogc_sysinfo_inject_username(bc_trie_t *global); char* blogc_sysinfo_get_datetime(void); void blogc_sysinfo_inject_datetime(bc_trie_t *global); +bool blogc_sysinfo_get_inside_docker(void); +void blogc_sysinfo_inject_inside_docker(bc_trie_t *global); #endif /* ___SYSINFO_H */ diff --git a/src/common/file.c b/src/common/file.c index d64a0d8..1e55f64 100644 --- a/src/common/file.c +++ b/src/common/file.c @@ -20,7 +20,7 @@ char* bc_file_get_contents(const char *path, bool utf8, size_t *len, bc_error_t **err) { - if (path == NULL || err == NULL || *err != NULL) + if (path == NULL || len == NULL || err == NULL || *err != NULL) return NULL; *len = 0; |