void WpaGui::receiveMsgs() { char buf[256]; size_t len; while (monitor_conn && wpa_ctrl_pending(monitor_conn) > 0) { len = sizeof(buf) - 1; if (wpa_ctrl_recv(monitor_conn, buf, &len) == 0) { buf[len] = '\0'; processMsg(buf); } } }
int wifi_wait_for_event(char *buf, size_t buflen) { size_t nread = buflen - 1; int fd; fd_set rfds; int result; struct timeval tval; struct timeval *tptr; if (monitor_conn == NULL) { LOGD("Connection closed\n"); strncpy(buf, WPA_EVENT_TERMINATING " - connection closed", buflen-1); buf[buflen-1] = '\0'; return strlen(buf); } result = wpa_ctrl_recv(monitor_conn, buf, &nread); if (result < 0) { LOGD("wpa_ctrl_recv failed: %s\n", strerror(errno)); strncpy(buf, WPA_EVENT_TERMINATING " - recv error", buflen-1); buf[buflen-1] = '\0'; return strlen(buf); } buf[nread] = '\0'; /* LOGD("wait_for_event: result=%d nread=%d string=\"%s\"\n", result, nread, buf); */ /* Check for EOF on the socket */ if (result == 0 && nread == 0) { /* Fabricate an event to pass up */ LOGD("Received EOF on supplicant socket\n"); strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1); buf[buflen-1] = '\0'; return strlen(buf); } /* * Events strings are in the format * * <N>CTRL-EVENT-XXX * * where N is the message level in numerical form (0=VERBOSE, 1=DEBUG, * etc.) and XXX is the event name. The level information is not useful * to us, so strip it off. */ if (buf[0] == '<') { char *match = strchr(buf, '>'); if (match != NULL) { nread -= (match+1-buf); memmove(buf, match+1, nread+1); } } return nread; }
static void hostapd_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read) { int first = 1; if (ctrl_conn == NULL) return; while (wpa_ctrl_pending(ctrl)) { char buf[256]; size_t len = sizeof(buf) - 1; if (wpa_ctrl_recv(ctrl, buf, &len) == 0) { buf[len] = '\0'; if (in_read && first) printf("\n"); first = 0; printf("%s\n", buf); } else { printf("Could not read pending message.\n"); break; } } }
int wifi_ctrl_recv(int index, char *reply, size_t *reply_len) { int res; int ctrlfd = wpa_ctrl_get_fd(monitor_conn[index]); struct pollfd rfds[2]; memset(rfds, 0, 2 * sizeof(struct pollfd)); rfds[0].fd = ctrlfd; rfds[0].events |= POLLIN; rfds[1].fd = exit_sockets[index][1]; rfds[1].events |= POLLIN; res = TEMP_FAILURE_RETRY(poll(rfds, 2, -1)); if (res < 0) { ALOGE("Error poll = %d", res); return res; } if (rfds[0].revents & POLLIN) { return wpa_ctrl_recv(monitor_conn[index], reply, reply_len); } else { return -2; } return 0; }
int WiFiNode::waitFor(const char *waitStr, const int &timeoutMs) { int result = -1; int retry = timeoutMs ? timeoutMs : 1000; if (!wpaCtrl || !waitStr) { DBGMSG_ERR("Input is Null"); return result; } char replyBuff[1024] = {0}; const size_t replySize = sizeof(replyBuff) - 1; do { if (!wpa_ctrl_pending(wpaCtrl)) { usleep(1000); } else { size_t replyLen = replySize; int readRes = wpa_ctrl_recv(wpaCtrl, replyBuff, &replyLen); if (readRes) { DBGMSG_ERR("Read failed %d", readRes); return readRes; } replyBuff[replyLen] = '\0'; DBGMSG_M("Read %d [%s]", replyLen, replyBuff); if (strstr(replyBuff, waitStr)) { DBGMSG_H("Compare Hit!"); result = 0; DBGMSG_M("wpa_ctrl_pending %d", wpa_ctrl_pending(wpaCtrl)); break; } DBGMSG_M("Continue waiting. Elapsed %d from %d", timeoutMs - retry, timeoutMs); } } while (retry--); if (!retry) { DBGMSG_M("Exit by Timeout"); } return result; }
int wifi_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len) { int res; int ctrlfd = wpa_ctrl_get_fd(ctrl); struct pollfd rfds[2]; memset(rfds, 0, 2 * sizeof(struct pollfd)); rfds[0].fd = ctrlfd; rfds[0].events |= POLLIN; rfds[1].fd = exit_sockets[1]; rfds[1].events |= POLLIN; res = poll(rfds, 2, -1); if (res < 0) { LOGE("Error poll = %d", res); return res; } if (rfds[0].revents & POLLIN) { return wpa_ctrl_recv(ctrl, reply, reply_len); } else { LOGD("Received on exit socket, terminate"); return -1; } return 0; }
/* -------------------------------------------------------------------------------- WPACtrl_recv */ static PyObject* WPACtrl_recv(WPACtrl* self) { int ret; char buf[256]; size_t buflen = sizeof(buf) - 1; Py_BEGIN_ALLOW_THREADS ret = wpa_ctrl_recv(self->ctrl_iface, buf, &buflen); Py_END_ALLOW_THREADS switch (ret) { case 0: buf[buflen] = '\0'; return Py_BuildValue("s", buf); case -1: PyErr_SetString(WPACtrl_error, "wpa_ctrl_recv failed"); break; default: PyErr_SetString(WPACtrl_error, "wpa_ctrl_recv returned unknown error"); break; } return NULL; }
static void wpa_cli_reconnect(void) { wpa_cli_close_connection(); ctrl_conn = wpa_cli_open_connection(ctrl_ifname); if (ctrl_conn) { printf("Connection to wpa_supplicant re-established\n"); #ifdef ANDROID if (wpa_ctrl_attach(monitor_conn) == 0) { #else if (wpa_ctrl_attach(ctrl_conn) == 0) { #endif wpa_cli_attached = 1; } else { printf("Warning: Failed to attach to " "wpa_supplicant.\n"); } } } static void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read, int action_monitor) { int first = 1; #ifdef ANDROID if (ctrl == NULL) { #else if (ctrl_conn == NULL) { #endif wpa_cli_reconnect(); return; } while (wpa_ctrl_pending(ctrl) > 0) { char buf[256]; size_t len = sizeof(buf) - 1; if (wpa_ctrl_recv(ctrl, buf, &len) == 0) { buf[len] = '\0'; if (action_monitor) wpa_cli_action_process(buf); else { if (in_read && first) printf("\n"); first = 0; printf("%s\n", buf); } } else { printf("Could not read pending message.\n"); break; } } if (wpa_ctrl_pending(ctrl) < 0) { printf("Connection to wpa_supplicant lost - trying to " "reconnect\n"); wpa_cli_reconnect(); } } #ifdef CONFIG_READLINE static char * wpa_cli_cmd_gen(const char *text, int state) { static int i, len; const char *cmd; if (state == 0) { i = 0; len = os_strlen(text); } while ((cmd = wpa_cli_commands[i].cmd)) { i++; if (os_strncasecmp(cmd, text, len) == 0) return os_strdup(cmd); } return NULL; } static char * wpa_cli_dummy_gen(const char *text, int state) { return NULL; } static char ** wpa_cli_completion(const char *text, int start, int end) { return rl_completion_matches(text, start == 0 ? wpa_cli_cmd_gen : wpa_cli_dummy_gen); } #endif /* CONFIG_READLINE */ static void wpa_cli_interactive(void) { #define max_args 10 char cmdbuf[256], *cmd, *argv[max_args], *pos; int argc; #ifdef CONFIG_READLINE char *home, *hfile = NULL; #endif /* CONFIG_READLINE */ printf("\nInteractive mode\n\n"); #ifdef CONFIG_READLINE rl_attempted_completion_function = wpa_cli_completion; home = getenv("HOME"); if (home) { const char *fname = ".wpa_cli_history"; int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1; hfile = os_malloc(hfile_len); if (hfile) { int res; res = os_snprintf(hfile, hfile_len, "%s/%s", home, fname); if (res >= 0 && res < hfile_len) { hfile[hfile_len - 1] = '\0'; read_history(hfile); stifle_history(100); } } } #endif /* CONFIG_READLINE */ do { #ifdef ANDROID wpa_cli_recv_pending(monitor_conn, 0, 0); #else wpa_cli_recv_pending(ctrl_conn, 0, 0); #endif #ifndef CONFIG_NATIVE_WINDOWS alarm(ping_interval); #endif /* CONFIG_NATIVE_WINDOWS */ #ifdef CONFIG_READLINE cmd = readline("> "); if (cmd && *cmd) { HIST_ENTRY *h; while (next_history()) ; h = previous_history(); if (h == NULL || os_strcmp(cmd, h->line) != 0) add_history(cmd); next_history(); } #else /* CONFIG_READLINE */ printf("> "); cmd = fgets(cmdbuf, sizeof(cmdbuf), stdin); #endif /* CONFIG_READLINE */ #ifndef CONFIG_NATIVE_WINDOWS alarm(0); #endif /* CONFIG_NATIVE_WINDOWS */ if (cmd == NULL) break; #ifdef ANDROID wpa_cli_recv_pending(monitor_conn, 0, 0); #else wpa_cli_recv_pending(ctrl_conn, 0, 0); #endif pos = cmd; while (*pos != '\0') { if (*pos == '\n') { *pos = '\0'; break; } pos++; } argc = 0; pos = cmd; for (;;) { while (*pos == ' ') pos++; if (*pos == '\0') break; argv[argc] = pos; argc++; if (argc == max_args) break; if (*pos == '"') { char *pos2 = os_strrchr(pos, '"'); if (pos2) pos = pos2 + 1; } while (*pos != '\0' && *pos != ' ') pos++; if (*pos == ' ') *pos++ = '\0'; } if (argc) wpa_request(ctrl_conn, argc, argv); if (cmd != cmdbuf) os_free(cmd); } while (!wpa_cli_quit); #ifdef CONFIG_READLINE if (hfile) { /* Save command history, excluding lines that may contain * passwords. */ HIST_ENTRY *h; history_set_pos(0); while ((h = current_history())) { char *p = h->line; while (*p == ' ' || *p == '\t') p++; if (cmd_has_sensitive_data(p)) { h = remove_history(where_history()); if (h) { os_free(h->line); os_free(h->data); os_free(h); } else next_history(); } else next_history(); } write_history(hfile); os_free(hfile); } #endif /* CONFIG_READLINE */ }