summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiří Klimeš <jklimes@redhat.com>2012-11-19 17:10:56 +0100
committerDan Williams <dcbw@redhat.com>2013-04-08 16:09:23 -0500
commitabbde8d76fecee69f4757b12bc3c02656ff4dd10 (patch)
tree6aebda74c06b2b1759fdb20ec074f37895f7b01f
parent831b7e23523809543ea56d85de58fce80a7d8cea (diff)
downloadNetworkManager-abbde8d76fecee69f4757b12bc3c02656ff4dd10.tar.gz
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 {}
-rw-r--r--cli/src/devices.c61
1 files changed, 61 insertions, 0 deletions
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 <iface>] [bssid <BSSID>]]\n"
" wifi connect <(B)SSID> [password <password>] [wep-key-type key|phrase] [iface <iface>] [bssid <BSSID>] [name <name>]\n"
" [--private] [--nowait] [--timeout <timeout>]\n"
+ " wifi scan [[iface] <iface>]\n"
#if WITH_WIMAX
" wimax [list [iface <iface>] [nsp <name>]]\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;