diff --git a/src/common/util.c b/src/common/util.c index 5c3a85ec23..02a638e4ca 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -3832,6 +3832,27 @@ process_environment_make(struct smartlist_t *env_vars) return env; } +/** Return a newly allocated smartlist containing every variable in + * this process's environment, as a NUL-terminated string of the form + * "NAME=VALUE". Note that on some/many/most/all OSes, the parent + * process can put strings not of that form in our environment; + * callers should try to not get crashed by that. + * + * The returned strings are statically allocated, and must be treated + * as read-only. */ +struct smartlist_t * +get_current_process_environment_variables(void) +{ + smartlist_t *sl = smartlist_new(); + + char **environ_tmp; /* Not const char ** ? Really? */ + for (environ_tmp = environ; *environ_tmp; ++environ_tmp) { + smartlist_add(sl, (void *)(*environ_tmp)); + } + + return sl; +} + #ifdef _WIN32 /** Read from a handle h into buf, up to count bytes. If * hProcess is NULL, the function will return immediately if there is diff --git a/src/common/util.h b/src/common/util.h index 3989cb4a1b..f485446069 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -394,6 +394,8 @@ typedef struct process_environment_t process_environment_t; process_environment_t *process_environment_make(struct smartlist_t *env_vars); void process_environment_free(process_environment_t *env); +struct smartlist_t *get_current_process_environment_variables(void); + /* Values of process_handle_t.status. PROCESS_STATUS_NOTRUNNING must be * 0 because tor_check_port_forwarding depends on this being the initial * statue of the static instance of process_handle_t */