Commit ca5f51df authored by Ralf Habacker's avatar Ralf Habacker Committed by Simon McVittie

Add new functions _dbus_hash_table_to_array() and...

Add new functions _dbus_hash_table_to_array() and _dbus_hash_table_from_array() from related activation code.

These functions are required for dbus-run-session.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=92899Reviewed-by: default avatarSimon McVittie <simon.mcvittie@collabora.co.uk>
parent c0857fd0
......@@ -740,9 +740,6 @@ update_directory (BusActivation *activation,
static dbus_bool_t
populate_environment (BusActivation *activation)
{
DBusString key;
DBusString value;
int i;
char **environment;
dbus_bool_t retval = FALSE;
......@@ -751,50 +748,7 @@ populate_environment (BusActivation *activation)
if (environment == NULL)
return FALSE;
if (!_dbus_string_init (&key))
{
dbus_free_string_array (environment);
return FALSE;
}
if (!_dbus_string_init (&value))
{
_dbus_string_free (&key);
dbus_free_string_array (environment);
return FALSE;
}
for (i = 0; environment[i] != NULL; i++)
{
if (!_dbus_string_append (&key, environment[i]))
break;
if (_dbus_string_split_on_byte (&key, '=', &value))
{
char *hash_key, *hash_value;
if (!_dbus_string_steal_data (&key, &hash_key))
break;
if (!_dbus_string_steal_data (&value, &hash_value))
break;
if (!_dbus_hash_table_insert_string (activation->environment,
hash_key, hash_value))
break;
}
_dbus_string_set_length (&key, 0);
_dbus_string_set_length (&value, 0);
}
if (environment[i] != NULL)
goto out;
retval = TRUE;
out:
_dbus_string_free (&key);
_dbus_string_free (&value);
retval = _dbus_hash_table_from_array (activation->environment, environment, '=');
dbus_free_string_array (environment);
return retval;
......@@ -1611,51 +1565,7 @@ activation_find_entry (BusActivation *activation,
static char **
bus_activation_get_environment (BusActivation *activation)
{
char **environment;
int i, length;
DBusString entry;
DBusHashIter iter;
length = _dbus_hash_table_get_n_entries (activation->environment);
environment = dbus_new0 (char *, length + 1);
if (environment == NULL)
return NULL;
i = 0;
_dbus_hash_iter_init (activation->environment, &iter);
if (!_dbus_string_init (&entry))
{
dbus_free_string_array (environment);
return NULL;
}
while (_dbus_hash_iter_next (&iter))
{
const char *key, *value;
key = (const char *) _dbus_hash_iter_get_string_key (&iter);
value = (const char *) _dbus_hash_iter_get_value (&iter);
if (!_dbus_string_append_printf (&entry, "%s=%s", key, value))
break;
if (!_dbus_string_steal_data (&entry, environment + i))
break;
i++;
}
_dbus_string_free (&entry);
if (i != length)
{
dbus_free_string_array (environment);
environment = NULL;
}
return environment;
return _dbus_hash_table_to_array (activation->environment, '=');
}
dbus_bool_t
......
......@@ -1828,4 +1828,133 @@ _dbus_hash_test (void)
return ret;
}
/**
* Imports a string array into a hash table
* The hash table needs to be initialized with string keys,
* and dbus_free() as both key and value free-function.
*
* @param table the hash table
* @param array the string array to import
* @param delimiter the delimiter to separate key and value
* @return #TRUE on success.
* @return #FALSE if not enough memory.
*/
dbus_bool_t
_dbus_hash_table_from_array (DBusHashTable *table, char **array, char delimiter)
{
DBusString key;
DBusString value;
int i;
dbus_bool_t retval = FALSE;
_dbus_assert (table != NULL);
_dbus_assert (array != NULL);
if (!_dbus_string_init (&key))
{
return FALSE;
}
if (!_dbus_string_init (&value))
{
_dbus_string_free (&key);
return FALSE;
}
for (i = 0; array[i] != NULL; i++)
{
if (!_dbus_string_append (&key, array[i]))
break;
if (_dbus_string_split_on_byte (&key, delimiter, &value))
{
char *hash_key, *hash_value;
if (!_dbus_string_steal_data (&key, &hash_key))
break;
if (!_dbus_string_steal_data (&value, &hash_value))
break;
if (!_dbus_hash_table_insert_string (table,
hash_key, hash_value))
break;
}
_dbus_string_set_length (&key, 0);
_dbus_string_set_length (&value, 0);
}
if (array[i] != NULL)
goto out;
retval = TRUE;
out:
_dbus_string_free (&key);
_dbus_string_free (&value);
return retval;
}
/**
* Creates a string array from a hash table
*
* @param table the hash table
* @param delimiter the delimiter to join key and value
* @return pointer to created string array (free with dbus_free_string_array)
* @return #FALSE if not enough memory.
*/
char **
_dbus_hash_table_to_array (DBusHashTable *table, char delimiter)
{
int i, length;
DBusString entry;
DBusHashIter iter;
char **array;
_dbus_assert (table != NULL);
length = _dbus_hash_table_get_n_entries (table);
array = dbus_new0 (char *, length + 1);
if (array == NULL)
return NULL;
i = 0;
_dbus_hash_iter_init (table, &iter);
if (!_dbus_string_init (&entry))
{
dbus_free_string_array (array);
return NULL;
}
while (_dbus_hash_iter_next (&iter))
{
const char *key, *value;
key = (const char *) _dbus_hash_iter_get_string_key (&iter);
value = (const char *) _dbus_hash_iter_get_value (&iter);
if (!_dbus_string_append_printf (&entry, "%s%c%s", key, delimiter, value))
break;
if (!_dbus_string_steal_data (&entry, array + i))
break;
i++;
}
_dbus_string_free (&entry);
if (i != length)
{
dbus_free_string_array (array);
array = NULL;
}
return array;
}
#endif /* DBUS_ENABLE_EMBEDDED_TESTS */
......@@ -133,6 +133,14 @@ dbus_bool_t _dbus_hash_table_insert_uintptr (DBusHashTable *table,
DBUS_PRIVATE_EXPORT
int _dbus_hash_table_get_n_entries (DBusHashTable *table);
DBUS_PRIVATE_EXPORT
char ** _dbus_hash_table_to_array (DBusHashTable *table,
char delimiter);
DBUS_PRIVATE_EXPORT
dbus_bool_t _dbus_hash_table_from_array (DBusHashTable *table,
char **array,
char delimiter);
/* Preallocation */
/** A preallocated hash entry */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment