/Users/alexjokela/projects/lattice/src/env_ops.c
Line | Count | Source |
1 | | #include "env_ops.h" |
2 | | #include <stdlib.h> |
3 | | #include <string.h> |
4 | | #include <stdio.h> |
5 | | |
6 | | #ifndef __EMSCRIPTEN__ |
7 | | |
8 | 9 | char *envvar_get(const char *name) { |
9 | 9 | const char *val = getenv(name); |
10 | 9 | if (!val) return NULL; |
11 | 6 | return strdup(val); |
12 | 9 | } |
13 | | |
14 | 6 | bool envvar_set(const char *name, const char *value, char **err) { |
15 | 6 | if (setenv(name, value, 1) != 0) { |
16 | 0 | char buf[256]; |
17 | 0 | snprintf(buf, sizeof(buf), "envvar_set: failed to set '%s'", name); |
18 | 0 | *err = strdup(buf); |
19 | 0 | return false; |
20 | 0 | } |
21 | 6 | return true; |
22 | 6 | } |
23 | | |
24 | | extern char **environ; |
25 | | |
26 | 3 | void envvar_keys(char ***out_keys, size_t *out_count) { |
27 | 3 | size_t count = 0; |
28 | 3 | if (environ) { |
29 | 228 | for (char **e = environ; *e; e++) |
30 | 225 | count++; |
31 | 3 | } |
32 | | |
33 | 3 | char **keys = malloc(count * sizeof(char *)); |
34 | 3 | if (!keys) { |
35 | 0 | *out_keys = NULL; |
36 | 0 | *out_count = 0; |
37 | 0 | return; |
38 | 0 | } |
39 | | |
40 | 228 | for (size_t i = 0; i < count; i++) { |
41 | 225 | const char *eq = strchr(environ[i], '='); |
42 | 225 | if (eq) { |
43 | 225 | size_t klen = (size_t)(eq - environ[i]); |
44 | 225 | keys[i] = malloc(klen + 1); |
45 | 225 | memcpy(keys[i], environ[i], klen); |
46 | 225 | keys[i][klen] = '\0'; |
47 | 225 | } else { |
48 | 0 | keys[i] = strdup(environ[i]); |
49 | 0 | } |
50 | 225 | } |
51 | | |
52 | 3 | *out_keys = keys; |
53 | 3 | *out_count = count; |
54 | 3 | } |
55 | | |
56 | | #else /* __EMSCRIPTEN__ */ |
57 | | |
58 | | char *envvar_get(const char *name) { |
59 | | (void)name; |
60 | | return NULL; |
61 | | } |
62 | | |
63 | | bool envvar_set(const char *name, const char *value, char **err) { |
64 | | (void)name; (void)value; |
65 | | *err = strdup("env_set: not available in browser"); |
66 | | return false; |
67 | | } |
68 | | |
69 | | void envvar_keys(char ***out_keys, size_t *out_count) { |
70 | | *out_keys = NULL; |
71 | | *out_count = 0; |
72 | | } |
73 | | |
74 | | #endif /* __EMSCRIPTEN__ */ |