From abbde8d76fecee69f4757b12bc3c02656ff4dd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 19 Nov 2012 17:10:56 +0100 Subject: [PATCH] cli: add 'nmcli device wifi scan' command This requests NetworkManager to perform scanning for Wi-Fi networks. NetworkManager scans periodically, but this command can be used by impatient users who don't want to wait for the next scan. Direct D-Bus API call example: gdbus call --system -d org.freedesktop.NetworkManager \ -o /org/freedesktop/NetworkManager/Devices/2 \ -m org.freedesktop.NetworkManager.Device.Wireless.RequestScan {} --- cli/src/devices.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/cli/src/devices.c b/cli/src/devices.c index 9267c9f1fe..42c6f741a4 100644 --- a/cli/src/devices.c +++ b/cli/src/devices.c @@ -267,6 +267,7 @@ usage (void) " wifi [list [iface ] [bssid ]]\n" " wifi connect <(B)SSID> [password ] [wep-key-type key|phrase] [iface ] [bssid ] [name ]\n" " [--private] [--nowait] [--timeout ]\n" + " wifi scan [[iface] ]\n" #if WITH_WIMAX " wimax [list [iface ] [nsp ]]\n" #endif @@ -1883,6 +1884,64 @@ error: return nmc->return_value; } +static void +request_scan_cb (NMDeviceWifi *device, GError *error, gpointer user_data) +{ + NmCli *nmc = (NmCli *) user_data; + + if (error) { + g_string_printf (nmc->return_text, _("Error: %s."), + error->message ? error->message : _("unknown")); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + } + quit (); +} + +static NMCResultCode +do_device_wifi_scan (NmCli *nmc, int argc, char **argv) +{ + NMDevice *device; + const char *iface = NULL; + const GPtrArray *devices; + int devices_idx; + + nmc->should_wait = TRUE; + + /* Get the parameters */ + if (argc > 0) { + if (strcmp (*argv, "iface") == 0) { + if (next_arg (&argc, &argv) != 0) { + g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1)); + nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; + goto error; + } + } + iface = *argv; + } + + /* Find Wi-Fi device to scan on. When no iface is provided, the first Wi-Fi is used. */ + nmc->get_client (nmc); + devices = nm_client_get_devices (nmc->client); + devices_idx = 0; + device = find_wifi_device_by_iface (devices, iface, &devices_idx); + + if (!device) { + if (iface) + g_string_printf (nmc->return_text, _("Error: Device '%s' is not a Wi-Fi device."), iface); + else + g_string_printf (nmc->return_text, _("Error: No Wi-Fi device found.")); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + goto error; + } + + nm_device_wifi_request_scan_simple (NM_DEVICE_WIFI (device), request_scan_cb, nmc); + + return nmc->return_value; +error: + nmc->should_wait = FALSE; + return nmc->return_value; +} + static NMCResultCode do_device_wifi (NmCli *nmc, int argc, char **argv) { @@ -1893,6 +1952,8 @@ do_device_wifi (NmCli *nmc, int argc, char **argv) nmc->return_value = do_device_wifi_list (nmc, argc-1, argv+1); } else if (matches (*argv, "connect") == 0) { nmc->return_value = do_device_wifi_connect_network (nmc, argc-1, argv+1); + } else if (matches (*argv, "scan") == 0) { + nmc->return_value = do_device_wifi_scan (nmc, argc-1, argv+1); } else { g_string_printf (nmc->return_text, _("Error: 'dev wifi' command '%s' is not valid."), *argv); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;