summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRalf Habacker <ralf.habacker@freenet.de>2016-02-09 15:23:39 +0100
committerRalf Habacker <ralf.habacker@freenet.de>2016-02-11 23:43:09 +0100
commit610ff8d9646c1bb944bc5e56f22750f1754b308e (patch)
treea116de5691c54947b08e6d4cbe7abd5460f64b66
parent1370b44035da90a7fbcebea17074c66c832de0b1 (diff)
downloaddbus-610ff8d9646c1bb944bc5e56f22750f1754b308e.tar.gz
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=92899 Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
-rw-r--r--bus/activation.c94
-rw-r--r--dbus/dbus-hash.c129
-rw-r--r--dbus/dbus-hash.h8
3 files changed, 139 insertions, 92 deletions
diff --git a/bus/activation.c b/bus/activation.c
index 7b1ab063..8ca3292d 100644
--- a/bus/activation.c
+++ b/bus/activation.c
@@ -729,9 +729,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;
@@ -740,50 +737,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;
@@ -1599,51 +1553,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
diff --git a/dbus/dbus-hash.c b/dbus/dbus-hash.c
index 8f7d04bb..8858bafd 100644
--- a/dbus/dbus-hash.c
+++ b/dbus/dbus-hash.c
@@ -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 */
diff --git a/dbus/dbus-hash.h b/dbus/dbus-hash.h
index 2898f51c..93f717a9 100644
--- a/dbus/dbus-hash.h
+++ b/dbus/dbus-hash.h
@@ -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 */