📄 wpa_cli.c
字号:
for (i = 2; i < argc; i++) pos += snprintf(pos, end - pos, " %s", argv[i]); 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; if (argc < 2) { printf("Invalid OTP command: needs two arguments (network " "id and password)\n"); return 0; } end = cmd + sizeof(cmd); pos = cmd; pos += snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s", argv[0], argv[1]); for (i = 2; i < argc; i++) pos += snprintf(pos, end - pos, " %s", argv[i]); 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; if (argc < 2) { printf("Invalid PASSPHRASE command: needs two arguments " "(network id and passphrase)\n"); return 0; } end = cmd + sizeof(cmd); pos = cmd; pos += snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s", argv[0], argv[1]); for (i = 2; i < argc; i++) pos += snprintf(pos, end - pos, " %s", argv[i]); 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; if (argc < 2) { printf("Invalid BSSID command: needs two arguments (network " "id and BSSID)\n"); return 0; } end = cmd + sizeof(cmd); pos = cmd; pos += snprintf(pos, end - pos, "BSSID"); for (i = 0; i < argc; i++) pos += snprintf(pos, end - pos, " %s", argv[i]); 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 0; } snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[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 0; } snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[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 0; } snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[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 0; } snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[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]; 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 0; } if (snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s", argv[0], argv[1], argv[2]) >= sizeof(cmd) - 1) { printf("Too long SET_NETWORK command.\n"); return 0; } return wpa_ctrl_command(ctrl, cmd);}static int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc, char *argv[]){ char cmd[256]; 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 0; } if (snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s", argv[0], argv[1]) >= sizeof(cmd) - 1) { printf("Too long GET_NETWORK command.\n"); return 0; } 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_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) { printf("Invalid GET_CAPABILITY command: needs one argument\n"); return 0; } snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s", argv[0]); return wpa_ctrl_command(ctrl, cmd);}static void wpa_cli_list_interfaces(struct wpa_ctrl *ctrl){ struct dirent *dent; DIR *dir; dir = opendir(ctrl_iface_dir); if (dir == NULL) { printf("Control interface directory '%s' could not be " "openned.\n", ctrl_iface_dir); return; } printf("Available interfaces:\n"); while ((dent = readdir(dir))) { if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0) continue; printf("%s\n", dent->d_name); } closedir(dir);}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(); free(ctrl_ifname); ctrl_ifname = 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\n"); return 0; } /* * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB * <driver_param> */ snprintf(cmd, sizeof(cmd), "INTERFACE_ADD %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] : ""); 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 0; } snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[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 }, { "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 }, { NULL, NULL }};static void wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[]){ struct wpa_cli_cmd *cmd, *match = NULL; int count; count = 0; cmd = wpa_cli_commands; while (cmd->cmd) { if (strncasecmp(cmd->cmd, argv[0], strlen(argv[0])) == 0) { match = cmd; if (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 (strncasecmp(cmd->cmd, argv[0], strlen(argv[0])) == 0) { printf(" %s", cmd->cmd); } cmd++; } printf("\n"); } else if (count == 0) { printf("Unknown command '%s'\n", argv[0]); } else { match->handler(ctrl, argc - 1, &argv[1]); }}static int str_match(const char *a, const char *b){ return strncmp(a, b, strlen(b)) == 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -