Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : : 3 : : #include "sd-path.h" 4 : : 5 : : #include "conf-files.h" 6 : : #include "def.h" 7 : : #include "env-file.h" 8 : : #include "escape.h" 9 : : #include "log.h" 10 : : #include "path-lookup.h" 11 : : #include "strv.h" 12 : : 13 : 0 : static int environment_dirs(char ***ret) { 14 : 0 : _cleanup_strv_free_ char **dirs = NULL; 15 : 0 : _cleanup_free_ char *c = NULL; 16 : : int r; 17 : : 18 : 0 : dirs = strv_new(CONF_PATHS_USR("environment.d"), NULL); 19 [ # # ]: 0 : if (!dirs) 20 : 0 : return -ENOMEM; 21 : : 22 : : /* ~/.config/systemd/environment.d */ 23 : 0 : r = sd_path_home(SD_PATH_USER_CONFIGURATION, "environment.d", &c); 24 [ # # ]: 0 : if (r < 0) 25 : 0 : return r; 26 : : 27 : 0 : r = strv_extend_front(&dirs, c); 28 [ # # ]: 0 : if (r < 0) 29 : 0 : return r; 30 : : 31 : 0 : *ret = TAKE_PTR(dirs); 32 : 0 : return 0; 33 : : } 34 : : 35 : 0 : static int load_and_print(void) { 36 : 0 : _cleanup_strv_free_ char **dirs = NULL, **files = NULL, **env = NULL; 37 : : char **i; 38 : : int r; 39 : : 40 : 0 : r = environment_dirs(&dirs); 41 [ # # ]: 0 : if (r < 0) 42 : 0 : return r; 43 : : 44 : 0 : r = conf_files_list_strv(&files, ".conf", NULL, 0, (const char **) dirs); 45 [ # # ]: 0 : if (r < 0) 46 : 0 : return r; 47 : : 48 : : /* This will mutate the existing environment, based on the presumption 49 : : * that in case of failure, a partial update is better than none. */ 50 : : 51 [ # # # # ]: 0 : STRV_FOREACH(i, files) { 52 : 0 : r = merge_env_file(&env, NULL, *i); 53 [ # # ]: 0 : if (r == -ENOMEM) 54 : 0 : return r; 55 : : } 56 : : 57 [ # # # # ]: 0 : STRV_FOREACH(i, env) { 58 : : char *t; 59 [ # # ]: 0 : _cleanup_free_ char *q = NULL; 60 : : 61 : 0 : t = strchr(*i, '='); 62 [ # # ]: 0 : assert(t); 63 : : 64 : 0 : q = shell_maybe_quote(t + 1, ESCAPE_BACKSLASH); 65 [ # # ]: 0 : if (!q) 66 : 0 : return log_oom(); 67 : : 68 : 0 : printf("%.*s=%s\n", (int) (t - *i), *i, q); 69 : : } 70 : : 71 : 0 : return 0; 72 : : } 73 : : 74 : 0 : int main(int argc, char *argv[]) { 75 : : int r; 76 : : 77 : 0 : log_parse_environment(); 78 : 0 : log_open(); 79 : : 80 [ # # ]: 0 : if (argc > 1) { 81 [ # # ]: 0 : log_error("This program takes no arguments."); 82 : 0 : return EXIT_FAILURE; 83 : : } 84 : : 85 : 0 : r = load_and_print(); 86 [ # # ]: 0 : if (r < 0) 87 [ # # ]: 0 : log_error_errno(r, "Failed to load environment.d: %m"); 88 : : 89 : 0 : return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; 90 : : }