X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fgenviron.c;h=0a83ac941862fa0253d36340a794b1539fdbfeed;hb=49b59e5ac4428a6a99a85d699c3662f96efc4e9d;hp=b876451af8d9bacd4ea7224fe785124bf9d3c286;hpb=7e9aed94deb6d6b9f25af539d84bb1e66c958cbc;p=platform%2Fupstream%2Fglib.git
diff --git a/glib/genviron.c b/glib/genviron.c
index b876451..0a83ac9 100644
--- a/glib/genviron.c
+++ b/glib/genviron.c
@@ -12,9 +12,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see .
*/
/*
@@ -30,9 +28,6 @@
#include
#include
-#ifdef HAVE_UNISTD_H
-#include
-#endif
#ifdef HAVE_CRT_EXTERNS_H
#include /* for _NSGetEnviron */
#endif
@@ -40,6 +35,7 @@
#include
#endif
+#include "glib-private.h"
#include "gmem.h"
#include "gmessages.h"
#include "gstrfuncs.h"
@@ -54,6 +50,9 @@ g_environ_find (gchar **envp,
{
gint len, i;
+ if (envp == NULL)
+ return -1;
+
len = strlen (variable);
for (i = 0; envp[i]; i++)
@@ -68,22 +67,16 @@ g_environ_find (gchar **envp,
/**
* g_environ_getenv:
- * @envp: (array zero-terminated=1) (transfer none): an environment
- * list (eg, as returned from g_get_environ())
+ * @envp: (allow-none) (array zero-terminated=1) (transfer none): an environment
+ * list (eg, as returned from g_get_environ()), or %NULL
+ * for an empty environment list
* @variable: the environment variable to get, in the GLib file name
* encoding
*
* Returns the value of the environment variable @variable in the
* provided list @envp.
*
- * The name and value are in the GLib file name encoding.
- * On UNIX, this means the actual bytes which might or might not
- * be in some consistent character set and encoding. On Windows,
- * it is in UTF-8. On Windows, in case the environment variable's
- * value contains references to other environment variables, they
- * are expanded.
- *
- * Return value: the value of the environment variable, or %NULL if
+ * Returns: the value of the environment variable, or %NULL if
* the environment variable is not set in @envp. The returned
* string is owned by @envp, and will be freed if @variable is
* set or unset again.
@@ -96,7 +89,6 @@ g_environ_getenv (gchar **envp,
{
gint index;
- g_return_val_if_fail (envp != NULL, NULL);
g_return_val_if_fail (variable != NULL, NULL);
index = g_environ_find (envp, variable);
@@ -108,8 +100,10 @@ g_environ_getenv (gchar **envp,
/**
* g_environ_setenv:
- * @envp: (array zero-terminated=1) (transfer full): an environment
- * list (eg, as returned from g_get_environ())
+ * @envp: (allow-none) (array zero-terminated=1) (transfer full): an
+ * environment list that can be freed using g_strfreev() (e.g., as
+ * returned from g_get_environ()), or %NULL for an empty
+ * environment list
* @variable: the environment variable to set, must not contain '='
* @value: the value for to set the variable to
* @overwrite: whether to change the variable if it already exists
@@ -117,12 +111,8 @@ g_environ_getenv (gchar **envp,
* Sets the environment variable @variable in the provided list
* @envp to @value.
*
- * Both the variable's name and value should be in the GLib
- * file name encoding. On UNIX, this means that they can be
- * arbitrary byte strings. On Windows, they should be in UTF-8.
- *
- * Return value: (array zero-terminated=1) (transfer full): the
- * updated environment
+ * Returns: (array zero-terminated=1) (transfer full): the
+ * updated environment list. Free it using g_strfreev().
*
* Since: 2.32
*/
@@ -134,9 +124,9 @@ g_environ_setenv (gchar **envp,
{
gint index;
- g_return_val_if_fail (envp != NULL, NULL);
g_return_val_if_fail (variable != NULL, NULL);
g_return_val_if_fail (strchr (variable, '=') == NULL, NULL);
+ g_return_val_if_fail (value != NULL, NULL);
index = g_environ_find (envp, variable);
if (index != -1)
@@ -151,7 +141,7 @@ g_environ_setenv (gchar **envp,
{
gint length;
- length = g_strv_length (envp);
+ length = envp ? g_strv_length (envp) : 0;
envp = g_renew (gchar *, envp, length + 2);
envp[length] = g_strdup_printf ("%s=%s", variable, value);
envp[length + 1] = NULL;
@@ -160,31 +150,14 @@ g_environ_setenv (gchar **envp,
return envp;
}
-/**
- * g_environ_unsetenv:
- * @envp: (array zero-terminated=1) (transfer full): an environment
- * list (eg, as returned from g_get_environ())
- * @variable: the environment variable to remove, must not contain '='
- *
- * Removes the environment variable @variable from the provided
- * environment @envp.
- *
- * Return value: (array zero-terminated=1) (transfer full): the
- * updated environment
- *
- * Since: 2.32
- */
-gchar **
-g_environ_unsetenv (gchar **envp,
- const gchar *variable)
+static gchar **
+g_environ_unsetenv_internal (gchar **envp,
+ const gchar *variable,
+ gboolean free_value)
{
gint len;
gchar **e, **f;
- g_return_val_if_fail (envp != NULL, NULL);
- g_return_val_if_fail (variable != NULL, NULL);
- g_return_val_if_fail (strchr (variable, '=') == NULL, NULL);
-
len = strlen (variable);
/* Note that we remove *all* environment entries for
@@ -198,6 +171,12 @@ g_environ_unsetenv (gchar **envp,
*f = *e;
f++;
}
+ else
+ {
+ if (free_value)
+ g_free (*e);
+ }
+
e++;
}
*f = NULL;
@@ -205,6 +184,35 @@ g_environ_unsetenv (gchar **envp,
return envp;
}
+
+/**
+ * g_environ_unsetenv:
+ * @envp: (allow-none) (array zero-terminated=1) (transfer full): an environment
+ * list that can be freed using g_strfreev() (e.g., as returned from g_get_environ()),
+ * or %NULL for an empty environment list
+ * @variable: the environment variable to remove, must not contain '='
+ *
+ * Removes the environment variable @variable from the provided
+ * environment @envp.
+ *
+ * Returns: (array zero-terminated=1) (transfer full): the
+ * updated environment list. Free it using g_strfreev().
+ *
+ * Since: 2.32
+ */
+gchar **
+g_environ_unsetenv (gchar **envp,
+ const gchar *variable)
+{
+ g_return_val_if_fail (variable != NULL, NULL);
+ g_return_val_if_fail (strchr (variable, '=') == NULL, NULL);
+
+ if (envp == NULL)
+ return NULL;
+
+ return g_environ_unsetenv_internal (envp, variable, TRUE);
+}
+
/* UNIX implemention {{{1 */
#ifndef G_OS_WIN32
@@ -221,7 +229,7 @@ g_environ_unsetenv (gchar **envp,
* On Windows, in case the environment variable's value contains
* references to other environment variables, they are expanded.
*
- * Return value: the value of the environment variable, or %NULL if
+ * Returns: the value of the environment variable, or %NULL if
* the environment variable is not found. The returned string
* may be overwritten by the next call to g_getenv(), g_setenv()
* or g_unsetenv().
@@ -248,20 +256,18 @@ g_getenv (const gchar *variable)
* Note that on some systems, when variables are overwritten, the memory
* used for the previous variables and its value isn't reclaimed.
*
- *
- * Environment variable handling in UNIX is not thread-safe, and your
- * program may crash if one thread calls g_setenv() while another
- * thread is calling getenv(). (And note that many functions, such as
- * gettext(), call getenv() internally.) This function is only safe to
- * use at the very start of your program, before creating any other
- * threads (or creating objects that create worker threads of their
- * own).
- *
+ * You should be mindful of the fact that environment variable handling
+ * in UNIX is not thread-safe, and your program may crash if one thread
+ * calls g_setenv() while another thread is calling getenv(). (And note
+ * that many functions, such as gettext(), call getenv() internally.)
+ * This function is only safe to use at the very start of your program,
+ * before creating any other threads (or creating objects that create
+ * worker threads of their own).
+ *
* If you need to set up the environment for a child process, you can
* use g_get_environ() to get an environment array, modify that with
* g_environ_setenv() and g_environ_unsetenv(), and then pass that
* array directly to execvpe(), g_spawn_async(), or the like.
- *
*
* Returns: %FALSE if the environment variable couldn't be set.
*
@@ -279,6 +285,7 @@ g_setenv (const gchar *variable,
g_return_val_if_fail (variable != NULL, FALSE);
g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
#ifdef HAVE_SETENV
result = setenv (variable, value, overwrite);
@@ -314,39 +321,34 @@ extern char **environ;
* Note that on some systems, when variables are overwritten, the
* memory used for the previous variables and its value isn't reclaimed.
*
- *
- * Environment variable handling in UNIX is not thread-safe, and your
- * program may crash if one thread calls g_unsetenv() while another
- * thread is calling getenv(). (And note that many functions, such as
- * gettext(), call getenv() internally.) This function is only safe
- * to use at the very start of your program, before creating any other
- * threads (or creating objects that create worker threads of their
- * own).
- *
+ * You should be mindful of the fact that environment variable handling
+ * in UNIX is not thread-safe, and your program may crash if one thread
+ * calls g_unsetenv() while another thread is calling getenv(). (And note
+ * that many functions, such as gettext(), call getenv() internally.) This
+ * function is only safe to use at the very start of your program, before
+ * creating any other threads (or creating objects that create worker
+ * threads of their own).
+ *
* If you need to set up the environment for a child process, you can
* use g_get_environ() to get an environment array, modify that with
* g_environ_setenv() and g_environ_unsetenv(), and then pass that
* array directly to execvpe(), g_spawn_async(), or the like.
- *
*
* Since: 2.4
*/
void
g_unsetenv (const gchar *variable)
{
-#ifdef HAVE_UNSETENV
g_return_if_fail (variable != NULL);
g_return_if_fail (strchr (variable, '=') == NULL);
+#ifdef HAVE_UNSETENV
unsetenv (variable);
#else /* !HAVE_UNSETENV */
- g_return_if_fail (variable != NULL);
- g_return_if_fail (strchr (variable, '=') == NULL);
-
/* Mess directly with the environ array.
* This seems to be the only portable way to do this.
*/
- g_environ_unsetenv (environ, variable);
+ g_environ_unsetenv_internal (environ, variable, FALSE);
#endif /* !HAVE_UNSETENV */
}
@@ -445,7 +447,11 @@ g_getenv (const gchar *variable)
if (len == 0)
{
g_free (wname);
- return NULL;
+ if (GetLastError () == ERROR_ENVVAR_NOT_FOUND)
+ return NULL;
+
+ quark = g_quark_from_static_string ("");
+ return g_quark_to_string (quark);
}
else if (len == 1)
len = 2;
@@ -501,6 +507,7 @@ g_setenv (const gchar *variable,
g_return_val_if_fail (variable != NULL, FALSE);
g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE);
g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
@@ -612,10 +619,15 @@ g_get_environ (void)
gint i, n;
strings = GetEnvironmentStringsW ();
- for (n = 0; strings[n]; n += wcslen (strings + n) + 1);
- result = g_new (char *, n + 1);
- for (i = 0; strings[i]; i += wcslen (strings + i) + 1)
- result[i] = g_utf16_to_utf8 (strings + i, -1, NULL, NULL, NULL);
+ for (n = 0, i = 0; strings[n]; i++)
+ n += wcslen (strings + n) + 1;
+
+ result = g_new (char *, i + 1);
+ for (n = 0, i = 0; strings[n]; i++)
+ {
+ result[i] = g_utf16_to_utf8 (strings + n, -1, NULL, NULL, NULL);
+ n += wcslen (strings + n) + 1;
+ }
FreeEnvironmentStringsW (strings);
result[i] = NULL;