Preparations for v0.7.1 release
[libeap.git] / hostapd / hostapd_cli.c
index e5285ae..2cfaf58 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * hostapd - command line interface for hostapd daemon
- * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
 #include "includes.h"
 #include <dirent.h>
 
-#include "wpa_ctrl.h"
+#include "common/wpa_ctrl.h"
 #include "common.h"
-#include "version.h"
+#include "common/version.h"
 
 
 static const char *hostapd_cli_version =
 "hostapd_cli v" VERSION_STR "\n"
-"Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi> and contributors";
+"Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi> and contributors";
 
 
 static const char *hostapd_cli_license =
@@ -83,9 +83,15 @@ static const char *commands_help =
 "   sta <addr>           get MIB variables for one station\n"
 "   all_sta              get MIB variables for all stations\n"
 "   new_sta <addr>       add a new station\n"
+#ifdef CONFIG_IEEE80211W
+"   sa_query <addr>      send SA Query to a station\n"
+#endif /* CONFIG_IEEE80211W */
 #ifdef CONFIG_WPS
-"   wps_pin <uuid> <pin> add WPS Enrollee PIN (Device Password)\n"
+"   wps_pin <uuid> <pin> [timeout]  add WPS Enrollee PIN (Device Password)\n"
 "   wps_pbc              indicate button pushed to initiate PBC\n"
+#ifdef CONFIG_WPS_OOB
+"   wps_oob <type> <path> <method>  use WPS with out-of-band (UFD)\n"
+#endif /* CONFIG_WPS_OOB */
 #endif /* CONFIG_WPS */
 "   help                 show this usage help\n"
 "   interface [ifname]   show interfaces/select interface\n"
@@ -98,6 +104,7 @@ static int hostapd_cli_quit = 0;
 static int hostapd_cli_attached = 0;
 static const char *ctrl_iface_dir = "/var/run/hostapd";
 static char *ctrl_ifname = NULL;
+static int ping_interval = 5;
 
 
 static void usage(void)
@@ -106,7 +113,8 @@ static void usage(void)
        fprintf(stderr, 
                "\n"    
                "usage: hostapd_cli [-p<path>] [-i<ifname>] [-hv] "
-               "[command..]\n"
+               "[-G<ping interval>] \\\n"
+               "        [command..]\n"
                "\n"
                "Options:\n"
                "   -h           help (show this usage text)\n"
@@ -234,17 +242,37 @@ static int hostapd_cli_cmd_new_sta(struct wpa_ctrl *ctrl, int argc,
 }
 
 
+#ifdef CONFIG_IEEE80211W
+static int hostapd_cli_cmd_sa_query(struct wpa_ctrl *ctrl, int argc,
+                                   char *argv[])
+{
+       char buf[64];
+       if (argc != 1) {
+               printf("Invalid 'sa_query' command - exactly one argument, "
+                      "STA address, is required.\n");
+               return -1;
+       }
+       snprintf(buf, sizeof(buf), "SA_QUERY %s", argv[0]);
+       return wpa_ctrl_command(ctrl, buf);
+}
+#endif /* CONFIG_IEEE80211W */
+
+
 #ifdef CONFIG_WPS
 static int hostapd_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc,
                                   char *argv[])
 {
        char buf[64];
-       if (argc != 2) {
-               printf("Invalid 'wps_pin' command - exactly two arguments, "
+       if (argc < 2) {
+               printf("Invalid 'wps_pin' command - at least two arguments, "
                       "UUID and PIN, are required.\n");
                return -1;
        }
-       snprintf(buf, sizeof(buf), "WPS_PIN %s %s", argv[0], argv[1]);
+       if (argc > 2)
+               snprintf(buf, sizeof(buf), "WPS_PIN %s %s %s",
+                        argv[0], argv[1], argv[2]);
+       else
+               snprintf(buf, sizeof(buf), "WPS_PIN %s %s", argv[0], argv[1]);
        return wpa_ctrl_command(ctrl, buf);
 }
 
@@ -254,6 +282,40 @@ static int hostapd_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc,
 {
        return wpa_ctrl_command(ctrl, "WPS_PBC");
 }
+
+
+#ifdef CONFIG_WPS_OOB
+static int hostapd_cli_cmd_wps_oob(struct wpa_ctrl *ctrl, int argc,
+                                  char *argv[])
+{
+       char cmd[256];
+       int res;
+
+       if (argc != 3 && argc != 4) {
+               printf("Invalid WPS_OOB command: need three or four "
+                      "arguments:\n"
+                      "- DEV_TYPE: use 'ufd' or 'nfc'\n"
+                      "- PATH: path of OOB device like '/mnt'\n"
+                      "- METHOD: OOB method 'pin-e' or 'pin-r', "
+                      "'cred'\n"
+                      "- DEV_NAME: (only for NFC) device name like "
+                      "'pn531'\n");
+               return -1;
+       }
+
+       if (argc == 3)
+               res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s",
+                                 argv[0], argv[1], argv[2]);
+       else
+               res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s %s",
+                                 argv[0], argv[1], argv[2], argv[3]);
+       if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
+               printf("Too long WPS_OOB command.\n");
+               return -1;
+       }
+       return wpa_ctrl_command(ctrl, cmd);
+}
+#endif /* CONFIG_WPS_OOB */
 #endif /* CONFIG_WPS */
 
 
@@ -405,9 +467,15 @@ static struct hostapd_cli_cmd hostapd_cli_commands[] = {
        { "sta", hostapd_cli_cmd_sta },
        { "all_sta", hostapd_cli_cmd_all_sta },
        { "new_sta", hostapd_cli_cmd_new_sta },
+#ifdef CONFIG_IEEE80211W
+       { "sa_query", hostapd_cli_cmd_sa_query },
+#endif /* CONFIG_IEEE80211W */
 #ifdef CONFIG_WPS
        { "wps_pin", hostapd_cli_cmd_wps_pin },
        { "wps_pbc", hostapd_cli_cmd_wps_pbc },
+#ifdef CONFIG_WPS_OOB
+       { "wps_oob", hostapd_cli_cmd_wps_oob },
+#endif /* CONFIG_WPS_OOB */
 #endif /* CONFIG_WPS */
        { "help", hostapd_cli_cmd_help },
        { "interface", hostapd_cli_cmd_interface },
@@ -485,7 +553,7 @@ static void hostapd_cli_interactive(void)
        do {
                hostapd_cli_recv_pending(ctrl_conn, 0);
                printf("> ");
-               alarm(1);
+               alarm(ping_interval);
                res = fgets(cmd, sizeof(cmd), stdin);
                alarm(0);
                if (res == NULL)
@@ -547,7 +615,7 @@ static void hostapd_cli_alarm(int sig)
        }
        if (ctrl_conn)
                hostapd_cli_recv_pending(ctrl_conn, 1);
-       alarm(1);
+       alarm(ping_interval);
 }
 
 
@@ -557,11 +625,17 @@ int main(int argc, char *argv[])
        int warning_displayed = 0;
        int c;
 
+       if (os_program_init())
+               return -1;
+
        for (;;) {
-               c = getopt(argc, argv, "hi:p:v");
+               c = getopt(argc, argv, "hG:i:p:v");
                if (c < 0)
                        break;
                switch (c) {
+               case 'G':
+                       ping_interval = atoi(optarg);
+                       break;
                case 'h':
                        usage();
                        return 0;
@@ -642,5 +716,6 @@ int main(int argc, char *argv[])
 
        free(ctrl_ifname);
        hostapd_cli_close_connection();
+       os_program_deinit();
        return 0;
 }