Add tethering support. For WiFi also set the SSID and passphrase if they have been specified on the command line. Check that setting both SSID and passphrase succeed before trying to enable tethering.
After successfully setting SSID and passphrase for WiFi, use the boolean value parsing helper function return value to decide whether WiFi tethering is to be enabled, disabled or not modified. Fixes BMC#25886 --- v2: Add wifi ssid/passphrase setting to help output although the help text looks less good now... Update commit message also client/commands.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/client/commands.c b/client/commands.c index 5096809..f407c53 100644 --- a/client/commands.c +++ b/client/commands.c @@ -330,6 +330,176 @@ static int cmd_technologies(char *args[], int num, struct option *options) technology_print, NULL, DBUS_TYPE_INVALID); } +struct tether_enable { + char *path; + dbus_bool_t enable; +}; + +static void tether_set_return(DBusMessageIter *iter, const char *error, + void *user_data) +{ + struct tether_enable *tether = user_data; + char *str; + + str = strrchr(tether->path, '/'); + if (str != NULL) + str++; + else + str = tether->path; + + if (error == NULL) { + fprintf(stdout, "%s tethering for %s\n", + tether->enable == TRUE ? "Enabled": "Disabled", + str); + } else + fprintf(stderr, "Error %s %s tethering: %s\n", + tether->enable == TRUE ? + "enabling": "disabling", str, error); + + g_free(tether->path); + g_free(user_data); +} + +static int tether_set(char *technology, int set_tethering) +{ + struct tether_enable *tether = g_new(struct tether_enable, 1); + + switch(set_tethering) { + case 1: + tether->enable = TRUE; + break; + case 0: + tether->enable = FALSE; + break; + default: + g_free(tether); + return 0; + } + + tether->path = g_strdup_printf("/net/connman/technology/%s", + technology); + + return __connmanctl_dbus_set_property(connection, tether->path, + "net.connman.Technology", tether_set_return, + tether, "Tethering", DBUS_TYPE_BOOLEAN, + &tether->enable); +} + +struct tether_properties { + int ssid_result; + int passphrase_result; + int set_tethering; +}; + +static void tether_update(struct tether_properties *tether) +{ + printf("%d %d %d\n", tether->ssid_result, tether->passphrase_result, + tether->set_tethering); + + if (tether->ssid_result == 0 && tether->passphrase_result == 0) + tether_set("wifi", tether->set_tethering); + + if (tether->ssid_result != -EINPROGRESS && + tether->passphrase_result != -EINPROGRESS) + g_free(tether); +} + +static void tether_set_ssid_return(DBusMessageIter *iter, const char *error, + void *user_data) +{ + struct tether_properties *tether = user_data; + + if (error == NULL) { + fprintf(stdout, "Wifi SSID set\n"); + tether->ssid_result = 0; + } else { + fprintf(stderr, "Error setting wifi SSID: %s\n", error); + tether->ssid_result = -EINVAL; + } + + tether_update(tether); +} + +static void tether_set_passphrase_return(DBusMessageIter *iter, + const char *error, void *user_data) +{ + struct tether_properties *tether = user_data; + + if (error == NULL) { + fprintf(stdout, "Wifi passphrase set\n"); + tether->passphrase_result = 0; + } else { + fprintf(stderr, "Error setting wifi passphrase: %s\n", error); + tether->passphrase_result = -EINVAL; + } + + tether_update(tether); +} + +static int tether_set_ssid(char *ssid, char *passphrase, int set_tethering) +{ + struct tether_properties *tether = g_new(struct tether_properties, 1); + + tether->set_tethering = set_tethering; + + tether->ssid_result = __connmanctl_dbus_set_property(connection, + "/net/connman/technology/wifi", + "net.connman.Technology", + tether_set_ssid_return, tether, + "TetheringIdentifier", DBUS_TYPE_STRING, &ssid); + + tether->passphrase_result =__connmanctl_dbus_set_property(connection, + "/net/connman/technology/wifi", + "net.connman.Technology", + tether_set_passphrase_return, tether, + "TetheringPassphrase", DBUS_TYPE_STRING, &passphrase); + + if (tether->ssid_result != -EINPROGRESS && + tether->passphrase_result != -EINPROGRESS) { + g_free(tether); + return -ENXIO; + } + + return -EINPROGRESS; +} + +static int cmd_tether(char *args[], int num, struct option *options) +{ + char *ssid, *passphrase; + int set_tethering; + + if (num < 3) + return -EINVAL; + + passphrase = args[num - 1]; + ssid = args[num - 2]; + + set_tethering = parse_boolean(args[2]); + + if (strcmp(args[1], "wifi") == 0) { + + if (num > 5) + return -E2BIG; + + if (num == 5 && set_tethering == -1) + return -EINVAL; + + if (num == 4) + set_tethering = -1; + + if (num > 3) + return tether_set_ssid(ssid, passphrase, set_tethering); + } + + if (num > 3) + return -E2BIG; + + if (set_tethering == -1) + return -EINVAL; + + return tether_set(args[1], set_tethering); +} + static void scan_return(DBusMessageIter *iter, const char *error, void *user_data) { @@ -1020,6 +1190,11 @@ static const struct { cmd_disable, "Disables given technology or offline mode"}, { "state", NULL, NULL, NULL, cmd_state, "Shows if the system is online or offline" }, + { "tether", "<technology> on|off\n" + " wifi [on|off] <ssid> <passphrase> ", + NULL, NULL, + cmd_tether, + "Enable, disable tethering, set SSID and passphrase for wifi" }, { "services", "[<service>]", service_options, &service_desc[0], cmd_services, "Display services" }, { "technologies", NULL, NULL, NULL, -- 1.7.10.4 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman