1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/****************************************************************************
2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** ui.h extension file, included from the uic-generated form implementation.
3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt**
4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** If you want to add, delete, or rename functions or slots, use
5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** Qt Designer to update this file, preserving your code.
6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt**
7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** You should not define a constructor or destructor in this file.
8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** Instead, write your code in functions called init() and destroy().
9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** These will automatically be called by the form's constructor and
10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** destructor.
11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt*****************************************************************************/
12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef __MINGW32__
15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* Need to get getopt() */
16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <unistd.h>
17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif
18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <stdlib.h>
20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::init()
22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eh = NULL;
24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    scanres = NULL;
25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    udr = NULL;
26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrl_iface = NULL;
27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrl_conn = NULL;
28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    monitor_conn = NULL;
29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    msgNotifier = NULL;
30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrl_iface_dir = strdup("/var/run/wpa_supplicant");
31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    parse_argv();
33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    textStatus->setText("connecting to wpa_supplicant");
35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    timer = new QTimer(this);
36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    connect(timer, SIGNAL(timeout()), SLOT(ping()));
37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    timer->start(1000, FALSE);
38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (openCtrlConnection(ctrl_iface) < 0) {
40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Failed to open control connection to wpa_supplicant.\n");
41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    updateStatus();
44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    networkMayHaveChanged = true;
45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    updateNetworks();
46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::destroy()
50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    delete msgNotifier;
52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (monitor_conn) {
54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_detach(monitor_conn);
55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(monitor_conn);
56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	monitor_conn = NULL;
57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_conn) {
59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(ctrl_conn);
60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_conn = NULL;
61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (eh) {
64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eh->close();
65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete eh;
66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eh = NULL;
67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (scanres) {
70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	scanres->close();
71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete scanres;
72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	scanres = NULL;
73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (udr) {
76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	udr->close();
77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete udr;
78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	udr = NULL;
79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    free(ctrl_iface);
82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrl_iface = NULL;
83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    free(ctrl_iface_dir);
85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrl_iface_dir = NULL;
86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::parse_argv()
90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int c;
92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    for (;;) {
93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	c = getopt(qApp->argc(), qApp->argv(), "i:p:");
94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (c < 0)
95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	switch (c) {
97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 'i':
98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    free(ctrl_iface);
99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    ctrl_iface = strdup(optarg);
100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 'p':
102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    free(ctrl_iface_dir);
103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    ctrl_iface_dir = strdup(optarg);
104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint WpaGui::openCtrlConnection(const char *ifname)
111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char *cfile;
113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int flen;
114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char buf[2048], *pos, *pos2;
115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t len;
116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ifname) {
118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ifname != ctrl_iface) {
119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    free(ctrl_iface);
120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    ctrl_iface = strdup(ifname);
121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else {
123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UDP
124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	free(ctrl_iface);
125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_iface = strdup("udp");
126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP */
127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct dirent *dent;
129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	free(ctrl_iface);
131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_iface = NULL;
132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (dir) {
133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    while ((dent = readdir(dir))) {
134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/* Skip the file if it is not a socket.
136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * Also accept DT_UNKNOWN (0) in case
137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * the C library or underlying file
138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		 * system does not support d_type. */
139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (dent->d_type != DT_SOCK &&
140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    dent->d_type != DT_UNKNOWN)
141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    continue;
142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (strcmp(dent->d_name, ".") == 0 ||
145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    strcmp(dent->d_name, "..") == 0)
146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    continue;
147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ctrl_iface = strdup(dent->d_name);
149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		break;
150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    }
151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    closedir(dir);
152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpa_ctrl *ctrl;
156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int ret;
157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	free(ctrl_iface);
159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_iface = NULL;
160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ctrl) {
163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    len = sizeof(buf) - 1;
164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    if (ret >= 0) {
166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		buf[len] = '\0';
167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos = strchr(buf, '\n');
168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (pos)
169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    *pos = '\0';
170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ctrl_iface = strdup(buf);
171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    }
172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wpa_ctrl_close(ctrl);
173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_iface == NULL)
178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    flen = strlen(ctrl_iface_dir) + strlen(ctrl_iface) + 2;
182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    cfile = (char *) malloc(flen);
183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (cfile == NULL)
184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ctrl_iface);
186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_CTRL_IFACE_UNIX */
187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    flen = strlen(ctrl_iface) + 1;
188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    cfile = (char *) malloc(flen);
189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (cfile == NULL)
190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cfile, flen, "%s", ctrl_iface);
192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_conn) {
195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(ctrl_conn);
196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_conn = NULL;
197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (monitor_conn) {
200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete msgNotifier;
201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	msgNotifier = NULL;
202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_detach(monitor_conn);
203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(monitor_conn);
204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	monitor_conn = NULL;
205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    printf("Trying to connect to '%s'\n", cfile);
208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrl_conn = wpa_ctrl_open(cfile);
209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_conn == NULL) {
210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	free(cfile);
211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    monitor_conn = wpa_ctrl_open(cfile);
214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    free(cfile);
215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (monitor_conn == NULL) {
216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(ctrl_conn);
217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpa_ctrl_attach(monitor_conn)) {
220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Failed to attach to wpa_supplicant\n");
221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(monitor_conn);
222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	monitor_conn = NULL;
223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_ctrl_close(ctrl_conn);
224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ctrl_conn = NULL;
225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -1;
226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP)
229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    msgNotifier = new QSocketNotifier(wpa_ctrl_get_fd(monitor_conn),
230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				      QSocketNotifier::Read, this);
231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    connect(msgNotifier, SIGNAL(activated(int)), SLOT(receiveMsgs()));
232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif
233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    adapterSelect->clear();
235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    adapterSelect->insertItem(ctrl_iface);
236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    adapterSelect->setCurrentItem(0);
237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    len = sizeof(buf) - 1;
239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpa_ctrl_request(ctrl_conn, "INTERFACES", 10, buf, &len, NULL) >= 0) {
240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf[len] = '\0';
241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = buf;
242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while (*pos) {
243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos2 = strchr(pos, '\n');
244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (pos2)
245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			*pos2 = '\0';
246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (strcmp(pos, ctrl_iface) != 0)
247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			adapterSelect->insertItem(pos);
248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (pos2)
249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pos = pos2 + 1;
250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		else
251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			break;
252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    return 0;
256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_gui_msg_cb(char *msg, size_t)
260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    /* This should not happen anymore since two control connections are used. */
262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    printf("missed message: %s\n", msg);
263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint WpaGui::ctrlRequest(const char *cmd, char *buf, size_t *buflen)
267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int ret;
269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_conn == NULL)
271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return -3;
272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ret = wpa_ctrl_request(ctrl_conn, cmd, strlen(cmd), buf, buflen,
273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			   wpa_gui_msg_cb);
274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ret == -2) {
275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("'%s' command timed out.\n", cmd);
276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else if (ret < 0) {
277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("'%s' command failed.\n", cmd);
278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    return ret;
281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::updateStatus()
285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char buf[2048], *start, *end, *pos;
287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t len;
288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    pingsToStatusUpdate = 10;
290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    len = sizeof(buf) - 1;
292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_conn == NULL || ctrlRequest("STATUS", buf, &len) < 0) {
293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textStatus->setText("Could not get status from wpa_supplicant");
294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textAuthentication->clear();
295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textEncryption->clear();
296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textSsid->clear();
297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textBssid->clear();
298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textIpAddress->clear();
299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    buf[len] = '\0';
303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    bool auth_updated = false, ssid_updated = false;
305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    bool bssid_updated = false, ipaddr_updated = false;
306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    bool status_updated = false;
307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char *pairwise_cipher = NULL, *group_cipher = NULL;
308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    start = buf;
310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    while (*start) {
311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	bool last = false;
312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = strchr(start, '\n');
313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (end == NULL) {
314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    last = true;
315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    end = start;
316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    while (end[0] && end[1])
317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		end++;
318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	*end = '\0';
320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(start, '=');
322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos) {
323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos++ = '\0';
324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    if (strcmp(start, "bssid") == 0) {
325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		bssid_updated = true;
326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		textBssid->setText(pos);
327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    } else if (strcmp(start, "ssid") == 0) {
328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ssid_updated = true;
329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		textSsid->setText(pos);
330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    } else if (strcmp(start, "ip_address") == 0) {
331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		ipaddr_updated = true;
332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		textIpAddress->setText(pos);
333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    } else if (strcmp(start, "wpa_state") == 0) {
334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		status_updated = true;
335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		textStatus->setText(pos);
336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    } else if (strcmp(start, "key_mgmt") == 0) {
337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		auth_updated = true;
338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		textAuthentication->setText(pos);
339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		/* TODO: could add EAP status to this */
340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    } else if (strcmp(start, "pairwise_cipher") == 0) {
341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pairwise_cipher = pos;
342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    } else if (strcmp(start, "group_cipher") == 0) {
343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		group_cipher = pos;
344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    }
345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (last)
348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	start = end + 1;
350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (pairwise_cipher || group_cipher) {
353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	QString encr;
354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pairwise_cipher && group_cipher &&
355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    strcmp(pairwise_cipher, group_cipher) != 0) {
356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr.append(pairwise_cipher);
357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr.append(" + ");
358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr.append(group_cipher);
359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (pairwise_cipher) {
360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr.append(pairwise_cipher);
361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else {
362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr.append(group_cipher);
363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr.append(" [group key only]");
364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textEncryption->setText(encr);
366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else
367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textEncryption->clear();
368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!status_updated)
370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textStatus->clear();
371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!auth_updated)
372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textAuthentication->clear();
373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!ssid_updated)
374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textSsid->clear();
375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!bssid_updated)
376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textBssid->clear();
377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!ipaddr_updated)
378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	textIpAddress->clear();
379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::updateNetworks()
383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char buf[2048], *start, *end, *id, *ssid, *bssid, *flags;
385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t len;
386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int first_active = -1;
387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    bool selected = false;
388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!networkMayHaveChanged)
390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    networkSelect->clear();
393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrl_conn == NULL)
395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    len = sizeof(buf) - 1;
398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrlRequest("LIST_NETWORKS", buf, &len) < 0)
399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    buf[len] = '\0';
402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    start = strchr(buf, '\n');
403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (start == NULL)
404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    start++;
406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    while (*start) {
408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	bool last = false;
409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	end = strchr(start, '\n');
410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (end == NULL) {
411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    last = true;
412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    end = start;
413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    while (end[0] && end[1])
414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		end++;
415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	*end = '\0';
417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	id = start;
419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ssid = strchr(id, '\t');
420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ssid == NULL)
421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	*ssid++ = '\0';
423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	bssid = strchr(ssid, '\t');
424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (bssid == NULL)
425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	*bssid++ = '\0';
427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	flags = strchr(bssid, '\t');
428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (flags == NULL)
429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	*flags++ = '\0';
431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	QString network(id);
433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	network.append(": ");
434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	network.append(ssid);
435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	networkSelect->insertItem(network);
436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (strstr(flags, "[CURRENT]")) {
438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    networkSelect->setCurrentItem(networkSelect->count() - 1);
439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    selected = true;
440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (first_active < 0 && strstr(flags, "[DISABLED]") == NULL)
441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    first_active = networkSelect->count() - 1;
442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (last)
444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	start = end + 1;
446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!selected && first_active >= 0)
449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	networkSelect->setCurrentItem(first_active);
450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    networkMayHaveChanged = false;
452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::helpIndex()
456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    printf("helpIndex\n");
458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::helpContents()
462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    printf("helpContents\n");
464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::helpAbout()
468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QMessageBox::about(this, "wpa_gui for wpa_supplicant",
470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "Copyright (c) 2003-2008,\n"
471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "Jouni Malinen <j@w1.fi>\n"
472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "and contributors.\n"
473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "\n"
474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "This program is free software. You can\n"
475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "distribute it and/or modify it under the terms of\n"
476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "the GNU General Public License version 2.\n"
477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "\n"
478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "Alternatively, this software may be distributed\n"
479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "under the terms of the BSD license.\n"
480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "\n"
481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "This product includes software developed\n"
482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "by the OpenSSL Project for use in the\n"
483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       "OpenSSL Toolkit (http://www.openssl.org/)\n");
484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::disconnect()
488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[10];
490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len = sizeof(reply);
491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrlRequest("DISCONNECT", reply, &reply_len);
492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::scan()
496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (scanres) {
498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	scanres->close();
499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete scanres;
500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    scanres = new ScanResults();
503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (scanres == NULL)
504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    scanres->setWpaGui(this);
506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    scanres->show();
507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    scanres->exec();
508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::eventHistory()
512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (eh) {
514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eh->close();
515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete eh;
516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eh = new EventHistory();
519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (eh == NULL)
520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eh->addEvents(msgs);
522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eh->show();
523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eh->exec();
524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::ping()
528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
529526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char buf[10];
530526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t len;
531526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
532526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
533526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    /*
534526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt     * QSocketNotifier cannot be used with Windows named pipes, so use a timer
535526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt     * to check for received messages for now. This could be optimized be doing
536526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt     * something specific to named pipes or Windows events, but it is not clear
537526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt     * what would be the best way of doing that in Qt.
538526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt     */
539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    receiveMsgs();
540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (scanres && !scanres->isVisible()) {
543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete scanres;
544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	scanres = NULL;
545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (eh && !eh->isVisible()) {
548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete eh;
549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eh = NULL;
550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (udr && !udr->isVisible()) {
553526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete udr;
554526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	udr = NULL;
555526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
556526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
557526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    len = sizeof(buf) - 1;
558526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (ctrlRequest("PING", buf, &len) < 0) {
559526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("PING failed - trying to reconnect\n");
560526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (openCtrlConnection(ctrl_iface) >= 0) {
561526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    printf("Reconnected successfully\n");
562526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pingsToStatusUpdate = 0;
563526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
564526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
565526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
566526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    pingsToStatusUpdate--;
567526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (pingsToStatusUpdate <= 0) {
568526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	updateStatus();
569526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	updateNetworks();
570526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
571526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
572526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
573526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
574526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int str_match(const char *a, const char *b)
575526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
576526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    return strncmp(a, b, strlen(b)) == 0;
577526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
578526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
579526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
580526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::processMsg(char *msg)
581526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
582526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char *pos = msg, *pos2;
583526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int priority = 2;
584526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
585526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (*pos == '<') {
586526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	/* skip priority */
587526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos++;
588526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	priority = atoi(pos);
589526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(pos, '>');
590526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
591526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pos++;
592526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
593526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pos = msg;
594526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
595526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
596526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    WpaMsg wm(pos, priority);
597526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (eh)
598526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	eh->addEvent(wm);
599526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    msgs.append(wm);
600526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    while (msgs.count() > 100)
601526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	msgs.pop_front();
602526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
603526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    /* Update last message with truncated version of the event */
604526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (strncmp(pos, "CTRL-", 5) == 0) {
605526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos2 = strchr(pos, str_match(pos, WPA_CTRL_REQ) ? ':' : ' ');
606526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos2)
607526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pos2++;
608526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
609526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pos2 = pos;
610526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else
611526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos2 = pos;
612526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QString lastmsg = pos2;
613526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    lastmsg.truncate(40);
614526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    textLastMessage->setText(lastmsg);
615526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
616526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    pingsToStatusUpdate = 0;
617526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    networkMayHaveChanged = true;
618526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
619526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (str_match(pos, WPA_CTRL_REQ))
620526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	processCtrlReq(pos + strlen(WPA_CTRL_REQ));
621526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
622526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
623526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
624526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::processCtrlReq(const char *req)
625526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
626526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (udr) {
627526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	udr->close();
628526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete udr;
629526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
630526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    udr = new UserDataRequest();
631526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (udr == NULL)
632526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
633526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (udr->setParams(this, req) < 0) {
634526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	delete udr;
635526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	udr = NULL;
636526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
637526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
638526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    udr->show();
639526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    udr->exec();
640526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
641526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
642526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
643526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::receiveMsgs()
644526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
645526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char buf[256];
646526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t len;
647526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
648526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    while (monitor_conn && wpa_ctrl_pending(monitor_conn) > 0) {
649526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	len = sizeof(buf) - 1;
650526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (wpa_ctrl_recv(monitor_conn, buf, &len) == 0) {
651526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    buf[len] = '\0';
652526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    processMsg(buf);
653526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
654526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
655526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
656526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
657526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
658526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::connectB()
659526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
660526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[10];
661526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len = sizeof(reply);
662526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrlRequest("REASSOCIATE", reply, &reply_len);
663526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
664526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
665526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
666526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::selectNetwork( const QString &sel )
667526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
668526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QString cmd(sel);
669526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[10];
670526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len = sizeof(reply);
671526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
672526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int pos = cmd.find(':');
673526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (pos < 0) {
674526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Invalid selectNetwork '%s'\n", cmd.ascii());
675526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
676526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
677526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    cmd.truncate(pos);
678526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    cmd.prepend("SELECT_NETWORK ");
679526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ctrlRequest(cmd.ascii(), reply, &reply_len);
680526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
681526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
682526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
683526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::editNetwork()
684526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
685526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QString sel(networkSelect->currentText());
686526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int pos = sel.find(':');
687526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (pos < 0) {
688526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Invalid selectNetwork '%s'\n", sel.ascii());
689526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
690526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
691526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    sel.truncate(pos);
692526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
693526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    NetworkConfig *nc = new NetworkConfig();
694526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (nc == NULL)
695526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
696526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->setWpaGui(this);
697526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
698526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->paramsFromConfig(sel.toInt());
699526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->show();
700526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->exec();
701526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
702526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
703526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
704526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::triggerUpdate()
705526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
706526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    updateStatus();
707526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    networkMayHaveChanged = true;
708526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    updateNetworks();
709526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
710526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
711526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
712526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::addNetwork()
713526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
714526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    NetworkConfig *nc = new NetworkConfig();
715526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (nc == NULL)
716526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
717526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->setWpaGui(this);
718526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->newNetwork();
719526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->show();
720526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    nc->exec();
721526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
722526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
723526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
724526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid WpaGui::selectAdapter( const QString & sel )
725526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
726526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (openCtrlConnection(sel.ascii()) < 0)
727526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("Failed to open control connection to wpa_supplicant.\n");
728526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    updateStatus();
729526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    updateNetworks();
730526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
731