aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ransom <rransom.8774@gmail.com>2012-02-12 21:17:11 -0800
committerNick Mathewson <nickm@torproject.org>2012-02-17 11:42:20 -0500
commitd37a1ec8c678d80072c0299515547343bd1c8a07 (patch)
treec086364309c04b3f05deed8783809b4f83a60473
parent0ba93e184ad6216f886d7347dd81fe08edbb99c7 (diff)
downloadtor-d37a1ec8c678d80072c0299515547343bd1c8a07.tar
tor-d37a1ec8c678d80072c0299515547343bd1c8a07.tar.gz
Add set_environment_variable_in_smartlist
-rw-r--r--src/common/util.c24
-rw-r--r--src/common/util.h5
2 files changed, 29 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
index 02a638e4c..c8af6029e 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -3853,6 +3853,30 @@ get_current_process_environment_variables(void)
return sl;
}
+/** For each string s in <b>env_vars</b> such that
+ * environment_variable_names_equal(s, <b>new_var</b>), remove it; if
+ * <b>free_p</b> is non-zero, call <b>free_old</b>(s). If
+ * <b>new_var</b> contains '=', insert it into <b>env_vars</b>. */
+void
+set_environment_variable_in_smartlist(struct smartlist_t *env_vars,
+ const char *new_var,
+ void (*free_old)(void*),
+ int free_p)
+{
+ SMARTLIST_FOREACH_BEGIN(env_vars, const char *, s) {
+ if (environment_variable_names_equal(s, new_var)) {
+ SMARTLIST_DEL_CURRENT(env_vars, s);
+ if (free_p) {
+ free_old((void *)s);
+ }
+ }
+ } SMARTLIST_FOREACH_END(s);
+
+ if (strchr(new_var, '=') != NULL) {
+ smartlist_add(env_vars, (void *)new_var);
+ }
+}
+
#ifdef _WIN32
/** Read from a handle <b>h</b> into <b>buf</b>, up to <b>count</b> bytes. If
* <b>hProcess</b> is NULL, the function will return immediately if there is
diff --git a/src/common/util.h b/src/common/util.h
index f48544606..9d1baf0a2 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -396,6 +396,11 @@ void process_environment_free(process_environment_t *env);
struct smartlist_t *get_current_process_environment_variables(void);
+void set_environment_variable_in_smartlist(struct smartlist_t *env_vars,
+ const char *new_var,
+ void (*free_old)(void*),
+ int free_p);
+
/* 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 */