chiark / gitweb /
hashmap: be a bit more conservative with pre-allocating hash tables and items
[elogind.git] / src / shared / dbus-common.c
index 0e38933d8abba49a65463ad6b46ffa4c6d186375..3ba2d87c4de0042399737223a40be87693fed4c8 100644 (file)
@@ -178,9 +178,9 @@ int bus_connect_system_ssh(const char *user, const char *host, DBusConnection **
         assert(user || host);
 
         if (user && host)
-                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s@%s,argv3=systemd-stdio-bridge", user, host);
+                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s%%40%s,argv3=systemd-stdio-bridge", user, host);
         else if (user)
-                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s@localhost,argv3=systemd-stdio-bridge", user);
+                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s%%40localhost,argv3=systemd-stdio-bridge", user);
         else if (host)
                 asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s,argv3=systemd-stdio-bridge", host);
 
@@ -258,12 +258,11 @@ const char *bus_error_message(const DBusError *error) {
         return error->message;
 }
 
-const char *bus_error_message_or_strerror(const DBusError *error, int err) {
-
+const char *bus_error(const DBusError *error, int err) {
         if (error && dbus_error_is_set(error))
                 return bus_error_message(error);
 
-        return strerror(err);
+        return strerror(err < 0 ? -err : err);
 }
 
 DBusHandlerResult bus_default_message_handler(
@@ -935,7 +934,7 @@ int bus_parse_strv_iter(DBusMessageIter *iter, char ***_l) {
 int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
         DBusMessageIter sub, sub2;
         unsigned n = 0, i = 0;
-        char **l;
+        _cleanup_strv_free_ char **l = NULL;
 
         assert(iter);
         assert(_l);
@@ -954,6 +953,7 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
         l = new(char*, n*2+1);
         if (!l)
                 return -ENOMEM;
+        l[0] = NULL; /* make sure that l is properly terminated at all times */
 
         dbus_message_iter_recurse(iter, &sub);
 
@@ -969,26 +969,25 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) {
                         return -EINVAL;
 
                 l[i] = strdup(a);
-                if (!l[i]) {
-                        strv_free(l);
+                if (!l[i])
                         return -ENOMEM;
-                }
+                i++;
 
-                l[++i] = strdup(b);
-                if (!l[i]) {
-                        strv_free(l);
+                l[i] = strdup(b);
+                if (!l[i])
                         return -ENOMEM;
-                }
-
                 i++;
+
                 dbus_message_iter_next(&sub);
         }
 
         assert(i == n*2);
         l[i] = NULL;
 
-        if (_l)
+        if (_l) {
                 *_l = l;
+                l = NULL; /* avoid freeing */
+        }
 
         return 0;
 }
@@ -1097,7 +1096,7 @@ int generic_print_property(const char *name, DBusMessageIter *iter, bool all) {
                 } else if (strstr(name, "USec")) {
                         char timespan[FORMAT_TIMESPAN_MAX];
 
-                        printf("%s=%s\n", name, format_timespan(timespan, sizeof(timespan), u));
+                        printf("%s=%s\n", name, format_timespan(timespan, sizeof(timespan), u, 0));
                 } else
                         printf("%s=%llu\n", name, (unsigned long long) u);
 
@@ -1384,6 +1383,8 @@ int bus_method_call_with_reply(
                         r = -EACCES;
                 else if (dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY))
                         r = -ETIMEDOUT;
+                else if (dbus_error_has_name(&error, DBUS_ERROR_DISCONNECTED))
+                        r = -ECONNRESET;
                 else
                         r = -EIO;
                 goto finish;