diff options
author | Havoc Pennington <hp@redhat.com> | 2003-04-03 05:22:49 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-04-03 05:22:49 +0000 |
commit | eeb88949d8d2ca84d9cbe54c07e73b9907d3163e (patch) | |
tree | 9520b0d32fd0c105f41619f8d247a298f93caf9c /dbus/dbus-sysdeps.c | |
parent | 5364beac6cbfa8793fd34c7a634528a2112787f8 (diff) |
2003-04-03 Havoc Pennington <hp@pobox.com>
* bus/config-parser.c (bus_config_parser_unref): free
list of mechanisms, bug discovered by test suite enhancements
(putting system.conf and session.conf into suite)
* test/Makefile.am, test/test-service.c: add placeholder for a
test service that we'll activate as part of test suite. Doesn't
do anything yet.
* dbus/dbus-sysdeps.c (_dbus_setenv): support unsetenv by
setting NULL value, and use system malloc not dbus_malloc()
when we have unavoidable memleakage.
* dbus/dbus-bus.c (dbus_bus_get): fix bug where bus type of 0
didn't work, and support DBUS_BUS_ACTIVATION.
* bus/activation.c (child_setup): pass our well-known bus type to
the child
* bus/config-parser.c: support <type> to specify well-known type
* doc/dbus-specification.sgml: document the env variables to
locate well-known buses and find service activator
Diffstat (limited to 'dbus/dbus-sysdeps.c')
-rw-r--r-- | dbus/dbus-sysdeps.c | 73 |
1 files changed, 56 insertions, 17 deletions
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 4798aa73..17da1fbe 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -82,37 +82,76 @@ _dbus_abort (void) } /** - * Wrapper for setenv(). + * Wrapper for setenv(). If the value is #NULL, unsets + * the environment variable. + * + * @todo if someone can verify it's safe, we could avoid the + * memleak when doing an unset. * * @param varname name of environment variable * @param value value of environment variable * @returns #TRUE on success. */ dbus_bool_t -_dbus_setenv (const char *varname, const char *value) +_dbus_setenv (const char *varname, + const char *value) { -#ifdef HAVE_SETENV - return (setenv (varname, value, TRUE) == 0); + _dbus_assert (varname != NULL); + + if (value == NULL) + { +#ifdef HAVE_UNSETENV + unsetenv (varname); + return TRUE; #else - DBusString str; - char *putenv_value; + char *putenv_value; + size_t len; - if (!_dbus_string_init (&str)) - return FALSE; + len = strlen (varname); - if (!_dbus_string_append (&str, varname) || - !_dbus_string_append (&str, "=") || - !_dbus_string_append (&str, value) || - !_dbus_string_steal_data (&str, &putenv_value)) - { - _dbus_string_free (&str); - return FALSE; + /* Use system malloc to avoid memleaks that dbus_malloc + * will get upset about. + */ + + putenv_value = malloc (len + 1); + if (putenv_value == NULL) + return FALSE; + + strcpy (putenv_value, varname); + + return (putenv (putenv_value) == 0); +#endif } + else + { +#ifdef HAVE_SETENV + return (setenv (varname, value, TRUE) == 0); +#else + char *putenv_value; + size_t len; + size_t varname_len; + size_t value_len; + + varname_len = strlen (varname); + value_len = strlen (value); + + len = varname_len + value_len + 1 /* '=' */ ; - _dbus_string_free (&str); + /* Use system malloc to avoid memleaks that dbus_malloc + * will get upset about. + */ + + putenv_value = malloc (len + 1); + if (putenv_value == NULL) + return FALSE; - return (putenv (putenv_value) == 0); + strcpy (putenv_value, varname); + strcpy (putenv_value + varname_len, "="); + strcpy (putenv_value + varname_len + 1, value); + + return (putenv (putenv_value) == 0); #endif + } } /** |