]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
Add new functions _dbus_hash_table_to_array() and _dbus_hash_table_from_array() from...
authorRalf Habacker <ralf.habacker@freenet.de>
Tue, 9 Feb 2016 14:23:39 +0000 (15:23 +0100)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Fri, 12 Feb 2016 15:26:39 +0000 (15:26 +0000)
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>
bus/activation.c
dbus/dbus-hash.c
dbus/dbus-hash.h

index 67b353fe4230593ffbd776d52ba55eeab47144fc..614ce656a9f291b6c027c5ffb895db59d066ff44 100644 (file)
@@ -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
index 8f7d04bbf17a9e7c60c9c47b888d215c6ae48064..8858bafd74e5c2a535188400d1bac9417513e551 100644 (file)
@@ -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 */
index 2898f51c93a117dabc41f5694d620e80f2b5909c..93f717a9b34d9c5d3446d2315ad834be733d1ccf 100644 (file)
@@ -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 */