32 static gchar *environment_expand(gchar *param)
39 gchar *expanded = NULL;
45 result = g_strdup (
"x");
49 opening_brace = g_strstr_len (search_start, -1,
"{");
50 closing_brace = g_strstr_len (search_start, -1,
"}");
58 while ( opening_brace && closing_brace && (closing_brace > opening_brace) )
65 if (opening_brace > search_start)
67 gchar *prefix = g_strndup (search_start, opening_brace - search_start);
69 tmp = g_strconcat (result, prefix, NULL);
76 to_expand = g_strndup (opening_brace + 1, closing_brace - opening_brace - 1);
77 env_val = g_getenv (to_expand);
78 tmp = g_strconcat (result, env_val, NULL);
84 search_start = closing_brace + 1;
85 opening_brace = g_strstr_len (search_start, -1,
"{");
86 closing_brace = g_strstr_len (search_start, -1,
"}");
90 tmp = g_strconcat (result, search_start, NULL);
95 if (g_strcmp0 (result,
"x"))
96 expanded = g_strdup (result + 1);
103 char_array_contains(
const char **array,
unsigned num_keys,
const char *key)
105 for (
unsigned i = 0; i < num_keys; ++i)
107 if (strcmp(key, array[i]) == 0)
114 gnc_environment_parse_one (
const gchar *env_path)
116 GKeyFile *keyfile = g_key_file_new();
120 gboolean got_keyfile;
121 const unsigned num_keys = 6;
122 const char *reserved_keys[] = {
"GNC_HOME",
"GNC_BIN",
"GNC_LIB",
123 "GNC_DATA",
"GNC_CONF",
"SYS_LIB"};
125 got_keyfile = g_key_file_load_from_file (keyfile, env_path, G_KEY_FILE_NONE, NULL);
128 g_key_file_free(keyfile);
133 env_vars = g_key_file_get_keys(keyfile,
"Variables", ¶m_count, NULL);
134 for ( i = 0; i < param_count; i++ )
139 gchar *new_val = NULL, *tmp_val;
140 if (char_array_contains(reserved_keys, num_keys, env_vars[i]))
144 val_list = g_key_file_get_string_list (keyfile,
"Variables",
145 env_vars[i], &val_count,
147 if ( val_count == 0 )
148 g_unsetenv (env_vars[i]);
152 tmp_val = g_strdup (
"x");
153 for ( j = 0; j < val_count; j++ )
155 gchar *expanded = environment_expand (val_list[j]);
156 if (expanded && strlen(expanded))
158 new_val = g_build_path (G_SEARCHPATH_SEPARATOR_S, tmp_val, expanded, NULL);
164 g_strfreev (val_list);
167 if (g_strcmp0 (tmp_val,
"x"))
169 new_val = g_strdup (tmp_val +
sizeof (G_SEARCHPATH_SEPARATOR_S));
172 if (!g_setenv (env_vars[i], new_val, TRUE))
173 g_warning (
"Couldn't properly override environment variable \"%s\". " 174 "This may lead to unexpected results", env_vars[i]);
179 g_strfreev(env_vars);
180 g_key_file_free(keyfile);
191 env_parm = gnc_path_get_prefix();
192 if (!g_setenv(
"GNC_HOME", env_parm, TRUE))
193 g_warning (
"Couldn't set/override environment variable GNC_HOME.");
195 env_parm = gnc_path_get_bindir();
196 if (!g_setenv(
"GNC_BIN", env_parm, TRUE))
197 g_warning (
"Couldn't set/override environment variable GNC_BIN.");
199 env_parm = gnc_path_get_pkglibdir();
200 if (!g_setenv(
"GNC_LIB", env_parm, TRUE))
201 g_warning (
"Couldn't set/override environment variable GNC_LIB.");
203 env_parm = gnc_path_get_pkgdatadir();
204 if (!g_setenv(
"GNC_DATA", env_parm, TRUE))
205 g_warning (
"Couldn't set/override environment variable GNC_DATA.");
207 env_parm = gnc_path_get_pkgsysconfdir();
208 if (!g_setenv(
"GNC_CONF", env_parm, TRUE))
209 g_warning (
"Couldn't set/override environment variable GNC_CONF.");
211 env_parm = gnc_path_get_libdir();
212 if (!g_setenv(
"SYS_LIB", env_parm, TRUE))
213 g_warning (
"Couldn't set/override environment variable SYS_LIB.");
216 config_path = gnc_path_get_pkgsysconfdir();
220 gchar *pathext = g_build_path(
";",
".", g_getenv(
"PATHEXT"),
222 g_setenv(
"PATHEXT", pathext, TRUE);
228 env_path = g_build_filename (config_path,
"environment", NULL);
229 gnc_environment_parse_one(env_path);
233 env_path = g_build_filename (config_path,
"environment.local", NULL);
234 gnc_environment_parse_one(env_path);
236 g_free (config_path);
code to set up the environment for proper gnucash functioning.
void gnc_environment_setup(void)
Parse <prefix>/etc/gnucash/environment and set environment variables based on the contents of that fi...