wireguard: Regular reresolve endpoint address
[platform/upstream/connman.git] / client / dbus_helpers.c
index 826111f..1c68a28 100644 (file)
 
 #include <stdio.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <glib.h>
 
 #include "input.h"
 #include "dbus_helpers.h"
 
-#define TIMEOUT         60000
+#define TIMEOUT         120000
+
+#ifndef DBUS_ERROR_UNKNOWN_METHOD
+#define DBUS_ERROR_UNKNOWN_METHOD "org.freedesktop.DBus.Error.UnknownMethod"
+#endif
+
+#ifndef DBUS_ERROR_UNKNOWN_PROPERTY
+#define DBUS_ERROR_UNKNOWN_PROPERTY "org.freedesktop.DBus.Error.UnknownProperty"
+#endif
+
+#ifndef DBUS_ERROR_UNKNOWN_OBJECT
+#define DBUS_ERROR_UNKNOWN_OBJECT "org.freedesktop.DBus.Error.UnknownObject"
+#endif
+
+static int string2errno(const char *error)
+{
+       if (!g_strcmp0(error, DBUS_ERROR_UNKNOWN_METHOD))
+               return -ENOTSUP;
+       if (!g_strcmp0(error, DBUS_ERROR_UNKNOWN_PROPERTY))
+               return -ENOENT;
+       if (!g_strcmp0(error, DBUS_ERROR_UNKNOWN_OBJECT))
+               return -ENODEV;
+       if (!g_strcmp0(error, "net.connman.Error.AlreadyEnabled"))
+               return -EALREADY;
+       if (!g_strcmp0(error, "net.connman.Error.AlreadyDisabled"))
+               return -EALREADY;
+
+       return -EINVAL;
+}
 
 void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
                const char *dict, const char *sep)
@@ -38,6 +67,7 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
        dbus_uint16_t u16;
        dbus_uint32_t u;
        dbus_int32_t i;
+       dbus_uint64_t u64;
        double d;
 
        char *str;
@@ -113,6 +143,11 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
                        fprintf(stdout, "%d", i);
                        break;
 
+               case DBUS_TYPE_UINT64:
+                       dbus_message_iter_get_basic(iter, &u64);
+                       fprintf(stdout, "%"PRIu64, u64);
+                       break;
+
                case DBUS_TYPE_DOUBLE:
                        dbus_message_iter_get_basic(iter, &d);
                        fprintf(stdout, "%f", d);
@@ -145,20 +180,22 @@ static void dbus_method_reply(DBusPendingCall *call, void *user_data)
        __connmanctl_save_rl();
 
        reply = dbus_pending_call_steal_reply(call);
+       dbus_pending_call_unref(call);
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                DBusError err;
 
                dbus_error_init(&err);
                dbus_set_error_from_message(&err, reply);
 
-               callback->cb(NULL, err.message, callback->user_data);
+               callback->cb(NULL, string2errno(err.name), err.message,
+                       callback->user_data);
 
                dbus_error_free(&err);
                goto end;
        }
 
        dbus_message_iter_init(reply, &iter);
-       res = callback->cb(&iter, NULL, callback->user_data);
+       res = callback->cb(&iter, 0, NULL, callback->user_data);
 
 end:
        __connmanctl_redraw_rl();
@@ -213,6 +250,14 @@ static int append_variant(DBusMessageIter *iter, const char *property,
         case DBUS_TYPE_STRING:
                 type_str = DBUS_TYPE_STRING_AS_STRING;
                 break;
+       case DBUS_TYPE_INT32:
+               type_str = DBUS_TYPE_INT32_AS_STRING;
+               break;
+#if defined TIZEN_EXT_WIFI_MESH
+       case DBUS_TYPE_UINT16:
+               type_str = DBUS_TYPE_UINT16_AS_STRING;
+               break;
+#endif
        default:
                return -EOPNOTSUPP;
        }
@@ -343,6 +388,50 @@ int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
        return send_method_call(connection, message, cb, user_data);
 }
 
+#if defined TIZEN_EXT_WIFI_MESH
+int __connmanctl_dbus_mesh_dict(DBusConnection *connection,
+               const char *path, const char *interface,
+               connmanctl_dbus_method_return_func_t cb, void *user_data,
+               const char *property, int type,
+               connmanctl_dbus_append_func_t append_fn,
+               void *append_user_data)
+{
+       DBusMessage *message;
+       DBusMessageIter iter, variant, dict;
+
+       message = dbus_message_new_method_call(CONNMAN_SERVICE, path,
+                       interface, "MeshCommands");
+
+       if (!message)
+               return -ENOMEM;
+
+       dbus_message_iter_init_append(message, &iter);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &property);
+       dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+                       DBUS_TYPE_ARRAY_AS_STRING
+                               DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+                                       DBUS_TYPE_STRING_AS_STRING
+                                       DBUS_TYPE_VARIANT_AS_STRING
+                               DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+                       &variant);
+
+       dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
+                       DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+                               DBUS_TYPE_STRING_AS_STRING
+                               DBUS_TYPE_VARIANT_AS_STRING
+                       DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+                       &dict);
+
+       if (append_fn)
+               append_fn(&dict, append_user_data);
+
+       dbus_message_iter_close_container(&variant, &dict);
+       dbus_message_iter_close_container(&iter, &variant);
+
+       return send_method_call(connection, message, cb, user_data);
+}
+#endif
+
 static void append_variant_array(DBusMessageIter *iter, const char *property,
                connmanctl_dbus_append_func_t append_fn,
                void *append_user_data)