📄 wpa_cli.c
字号:
if (ret < 0 || ret >= end - pos) { printf("Too long PIN command.\n"); return -1; } pos += ret; for (i = 2; i < argc; i++) { ret = os_snprintf(pos, end - pos, " %s", argv[i]); if (ret < 0 || ret >= end - pos) { printf("Too long PIN command.\n"); return -1; } pos += ret; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256], *pos, *end; int i, ret; if (argc < 2) { printf("Invalid OTP command: needs two arguments (network " "id and password)\n"); return -1; } end = cmd + sizeof(cmd); pos = cmd; ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s", argv[0], argv[1]); if (ret < 0 || ret >= end - pos) { printf("Too long OTP command.\n"); return -1; } pos += ret; for (i = 2; i < argc; i++) { ret = os_snprintf(pos, end - pos, " %s", argv[i]); if (ret < 0 || ret >= end - pos) { printf("Too long OTP command.\n"); return -1; } pos += ret; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256], *pos, *end; int i, ret; if (argc < 2) { printf("Invalid PASSPHRASE command: needs two arguments " "(network id and passphrase)\n"); return -1; } end = cmd + sizeof(cmd); pos = cmd; ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s", argv[0], argv[1]); if (ret < 0 || ret >= end - pos) { printf("Too long PASSPHRASE command.\n"); return -1; } pos += ret; for (i = 2; i < argc; i++) { ret = os_snprintf(pos, end - pos, " %s", argv[i]); if (ret < 0 || ret >= end - pos) { printf("Too long PASSPHRASE command.\n"); return -1; } pos += ret; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256], *pos, *end; int i, ret; if (argc < 2) { printf("Invalid BSSID command: needs two arguments (network " "id and BSSID)\n"); return -1; } end = cmd + sizeof(cmd); pos = cmd; ret = os_snprintf(pos, end - pos, "BSSID"); if (ret < 0 || ret >= end - pos) { printf("Too long BSSID command.\n"); return -1; } pos += ret; for (i = 0; i < argc; i++) { ret = os_snprintf(pos, end - pos, " %s", argv[i]); if (ret < 0 || ret >= end - pos) { printf("Too long BSSID command.\n"); return -1; } pos += ret; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "LIST_NETWORKS");}static int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[32]; if (argc < 1) { printf("Invalid SELECT_NETWORK command: needs one argument " "(network id)\n"); return -1; } os_snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[0]); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[32]; if (argc < 1) { printf("Invalid ENABLE_NETWORK command: needs one argument " "(network id)\n"); return -1; } os_snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[0]); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[32]; if (argc < 1) { printf("Invalid DISABLE_NETWORK command: needs one argument " "(network id)\n"); return -1; } os_snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[0]); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "ADD_NETWORK");}static int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[32]; if (argc < 1) { printf("Invalid REMOVE_NETWORK command: needs one argument " "(network id)\n"); return -1; } os_snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[0]); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}static void wpa_cli_show_network_variables(void){ printf("set_network variables:\n" " ssid (network name, SSID)\n" " psk (WPA passphrase or pre-shared key)\n" " key_mgmt (key management protocol)\n" " identity (EAP identity)\n" " password (EAP password)\n" " ...\n" "\n" "Note: Values are entered in the same format as the " "configuration file is using,\n" "i.e., strings values need to be inside double quotation " "marks.\n" "For example: set_network 1 ssid \"network name\"\n" "\n" "Please see wpa_supplicant.conf documentation for full list " "of\navailable variables.\n");}static int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256]; int res; if (argc == 0) { wpa_cli_show_network_variables(); return 0; } if (argc != 3) { printf("Invalid SET_NETWORK command: needs three arguments\n" "(network id, variable name, and value)\n"); return -1; } res = os_snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s", argv[0], argv[1], argv[2]); if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { printf("Too long SET_NETWORK command.\n"); return -1; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256]; int res; if (argc == 0) { wpa_cli_show_network_variables(); return 0; } if (argc != 2) { printf("Invalid GET_NETWORK command: needs two arguments\n" "(network id and variable name)\n"); return -1; } res = os_snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s", argv[0], argv[1]); if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { printf("Too long GET_NETWORK command.\n"); return -1; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "DISCONNECT");}static int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "RECONNECT");}static int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "SAVE_CONFIG");}static int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "SCAN");}static int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "SCAN_RESULTS");}static int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[64]; if (argc < 1 || argc > 2) { printf("Invalid GET_CAPABILITY command: need either one or " "two arguments\n"); return -1; } if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) { printf("Invalid GET_CAPABILITY command: second argument, " "if any, must be 'strict'\n"); return -1; } os_snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s%s", argv[0], (argc == 2) ? " strict" : ""); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl){ printf("Available interfaces:\n"); return wpa_ctrl_command(ctrl, "INTERFACES");}static int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[]){ if (argc < 1) { wpa_cli_list_interfaces(ctrl); return 0; } wpa_cli_close_connection(); os_free(ctrl_ifname); ctrl_ifname = os_strdup(argv[0]); if (wpa_cli_open_connection(ctrl_ifname)) { printf("Connected to interface '%s.\n", ctrl_ifname); if (wpa_ctrl_attach(ctrl_conn) == 0) { wpa_cli_attached = 1; } else { printf("Warning: Failed to attach to " "wpa_supplicant.\n"); } } else { printf("Could not connect to interface '%s' - re-trying\n", ctrl_ifname); } return 0;}static int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "RECONFIGURE");}static int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc, char *argv[]){ return wpa_ctrl_command(ctrl, "TERMINATE");}static int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256]; if (argc < 1) { printf("Invalid INTERFACE_ADD command: needs at least one " "argument (interface name)\n" "All arguments: ifname confname driver ctrl_interface " "driver_param bridge_name\n"); return -1; } /* * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB * <driver_param>TAB<bridge_name> */ os_snprintf(cmd, sizeof(cmd), "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s", argv[0], argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "", argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "", argc > 5 ? argv[5] : ""); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[128]; if (argc != 1) { printf("Invalid INTERFACE_REMOVE command: needs one argument " "(interface name)\n"); return -1; } os_snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[0]); cmd[sizeof(cmd) - 1] = '\0'; return wpa_ctrl_command(ctrl, cmd);}struct wpa_cli_cmd { const char *cmd; int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);};static struct wpa_cli_cmd wpa_cli_commands[] = { { "status", wpa_cli_cmd_status }, { "ping", wpa_cli_cmd_ping }, { "mib", wpa_cli_cmd_mib }, { "help", wpa_cli_cmd_help }, { "interface", wpa_cli_cmd_interface }, { "level", wpa_cli_cmd_level }, { "license", wpa_cli_cmd_license }, { "quit", wpa_cli_cmd_quit }, { "set", wpa_cli_cmd_set }, { "logon", wpa_cli_cmd_logon }, { "logoff", wpa_cli_cmd_logoff }, { "pmksa", wpa_cli_cmd_pmksa }, { "reassociate", wpa_cli_cmd_reassociate }, { "preauthenticate", wpa_cli_cmd_preauthenticate }, { "identity", wpa_cli_cmd_identity }, { "password", wpa_cli_cmd_password }, { "new_password", wpa_cli_cmd_new_password }, { "pin", wpa_cli_cmd_pin }, { "otp", wpa_cli_cmd_otp }, { "passphrase", wpa_cli_cmd_passphrase }, { "bssid", wpa_cli_cmd_bssid }, { "list_networks", wpa_cli_cmd_list_networks }, { "select_network", wpa_cli_cmd_select_network }, { "enable_network", wpa_cli_cmd_enable_network }, { "disable_network", wpa_cli_cmd_disable_network }, { "add_network", wpa_cli_cmd_add_network }, { "remove_network", wpa_cli_cmd_remove_network }, { "set_network", wpa_cli_cmd_set_network }, { "get_network", wpa_cli_cmd_get_network }, { "save_config", wpa_cli_cmd_save_config }, { "disconnect", wpa_cli_cmd_disconnect }, { "reconnect", wpa_cli_cmd_reconnect }, { "scan", wpa_cli_cmd_scan }, { "scan_results", wpa_cli_cmd_scan_results }, { "get_capability", wpa_cli_cmd_get_capability }, { "reconfigure", wpa_cli_cmd_reconfigure }, { "terminate", wpa_cli_cmd_terminate }, { "interface_add", wpa_cli_cmd_interface_add }, { "interface_remove", wpa_cli_cmd_interface_remove }, { "ap_scan", wpa_cli_cmd_ap_scan }, { "stkstart", wpa_cli_cmd_stkstart }, { NULL, NULL }};static int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[]){ struct wpa_cli_cmd *cmd, *match = NULL; int count; int ret = 0; count = 0; cmd = wpa_cli_commands; while (cmd->cmd) { if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0) { match = cmd; if (os_strcasecmp(cmd->cmd, argv[0]) == 0) { /* we have an exact match */ count = 1; break; } count++; } cmd++; } if (count > 1) { printf("Ambiguous command '%s'; possible commands:", argv[0]); cmd = wpa_cli_commands; while (cmd->cmd) { if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0) { printf(" %s", cmd->cmd); } cmd++; } printf("\n"); ret = 1; } else if (count == 0) { printf("Unknown command '%s'\n", argv[0]); ret = 1; } else { ret = match->handler(ctrl, argc - 1, &argv[1]); } return ret;}static int str_match(const char *a, const char *b){ return os_strncmp(a, b, os_strlen(b)) == 0;}static int wpa_cli_exec(const char *program, const char *arg1, const char *arg2){ char *cmd; size_t len; len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3; cmd = os_malloc(len); if (cmd == NULL) return -1; os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2); cmd[len - 1] = '\0';#ifndef _WIN32_WCE system(cmd);#endif /* _WIN32_WCE */ os_free(cmd); return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -