diff options
Diffstat (limited to 'client/agent.c')
-rw-r--r-- | client/agent.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/client/agent.c b/client/agent.c index 01182e68..ad6ac2f8 100644 --- a/client/agent.c +++ b/client/agent.c @@ -39,6 +39,7 @@ #include "agent.h" #define AGENT_INTERFACE "net.connman.Agent" +#define VPN_AGENT_INTERFACE "net.connman.vpn.Agent" struct agent_data { char *interface; @@ -52,6 +53,9 @@ struct agent_data { static struct agent_data agent_request = { AGENT_INTERFACE, }; +static struct agent_data vpn_agent_request = { + VPN_AGENT_INTERFACE, +}; static void request_input_ssid_return(char *input, void *user_data); static void request_input_passphrase_return(char *input, void *user_data); @@ -140,6 +144,9 @@ static DBusMessage *agent_release(DBusConnection *connection, if (strcmp(request->interface, AGENT_INTERFACE) == 0) pending_command_complete("Agent unregistered by ConnMan\n"); + else + pending_command_complete("VPN Agent unregistered by ConnMan " + "VPNd\n"); if (__connmanctl_is_interactive() == false) __connmanctl_quit(); @@ -157,6 +164,9 @@ static DBusMessage *agent_cancel(DBusConnection *connection, if (strcmp(request->interface, AGENT_INTERFACE) == 0) pending_command_complete("Agent request cancelled by " "ConnMan\n"); + else + pending_command_complete("VPN Agent request cancelled by " + "ConnMan VPNd\n"); return dbus_message_new_method_return(message); } @@ -219,6 +229,10 @@ static void report_error_return(char *input, void *user_data) if (strcmp(request->interface, AGENT_INTERFACE) == 0) g_dbus_send_error(agent_connection, request->message, "net.connman.Agent.Error.Retry", NULL); + else + g_dbus_send_error(agent_connection, request->message, + "net.connman.vpn.Agent.Error.Retry", + NULL); break; case 0: g_dbus_send_reply(agent_connection, request->message, @@ -250,6 +264,8 @@ static DBusMessage *agent_report_error(DBusConnection *connection, __connmanctl_save_rl(); if (strcmp(request->interface, AGENT_INTERFACE) == 0) fprintf(stdout, "Agent ReportError %s\n", service); + else + fprintf(stdout, "VPN Agent ReportError %s\n", service); fprintf(stdout, " %s\n", error); __connmanctl_redraw_rl(); @@ -563,3 +579,103 @@ int __connmanctl_agent_unregister(DBusConnection *connection) return result; } + +static const GDBusMethodTable vpn_agent_methods[] = { + { GDBUS_METHOD("Release", NULL, NULL, agent_release) }, + { GDBUS_METHOD("Cancel", NULL, NULL, agent_cancel) }, + { GDBUS_ASYNC_METHOD("ReportError", + GDBUS_ARGS({ "service", "o" }, + { "error", "s" }), + NULL, agent_report_error) }, + { }, +}; + +static int vpn_agent_register_return(DBusMessageIter *iter, const char *error, + void *user_data) +{ + DBusConnection *connection = user_data; + + if (error != NULL) { + g_dbus_unregister_interface(connection, agent_path(), + VPN_AGENT_INTERFACE); + fprintf(stderr, "Error registering VPN Agent: %s\n", error); + return 0; + } + + vpn_agent_request.registered = true; + fprintf(stdout, "VPN Agent registered\n"); + + return -EINPROGRESS; +} + +int __connmanctl_vpn_agent_register(DBusConnection *connection) +{ + char *path = agent_path(); + int result; + + if (vpn_agent_request.registered == true) { + fprintf(stderr, "VPN Agent already registered\n"); + return -EALREADY; + } + + if (g_dbus_register_interface(connection, path, + VPN_AGENT_INTERFACE, vpn_agent_methods, + NULL, NULL, &vpn_agent_request, + NULL) == FALSE) { + fprintf(stderr, "Error: Failed to register VPN Agent " + "callbacks\n"); + return 0; + } + + result = __connmanctl_dbus_method_call(connection, VPN_SERVICE, + VPN_PATH, "net.connman.vpn.Manager", "RegisterAgent", + vpn_agent_register_return, connection, + DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + + if (result != -EINPROGRESS) { + g_dbus_unregister_interface(connection, agent_path(), + VPN_AGENT_INTERFACE); + + fprintf(stderr, "Error: Failed to register VPN Agent\n"); + } + + return result; +} + +static int vpn_agent_unregister_return(DBusMessageIter *iter, + const char *error, void *user_data) +{ + if (error != NULL) { + fprintf(stderr, "Error unregistering VPN Agent: %s\n", error); + return 0; + } + + vpn_agent_request.registered = false; + fprintf(stdout, "VPN Agent unregistered\n"); + + return 0; +} + +int __connmanctl_vpn_agent_unregister(DBusConnection *connection) +{ + char *path = agent_path(); + int result; + + if (vpn_agent_request.registered == false) { + fprintf(stderr, "VPN Agent not registered\n"); + return -EALREADY; + } + + g_dbus_unregister_interface(connection, agent_path(), + VPN_AGENT_INTERFACE); + + result = __connmanctl_dbus_method_call(connection, VPN_SERVICE, + VPN_PATH, "net.connman.vpn.Manager", "UnregisterAgent", + vpn_agent_unregister_return, NULL, + DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + + if (result != -EINPROGRESS) + fprintf(stderr, "Error: Failed to unregister VPN Agent\n"); + + return result; +} |