18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_gui - AddInterface class
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cstdio>
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h"
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QMessageBox>
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpagui.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "addinterface.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <windows.h>
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_KEY_ROOT
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_KEY_ROOT HKEY_LOCAL_MACHINE
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_KEY_PREFIX
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_KEY_PREFIX TEXT("SOFTWARE\\wpa_supplicant")
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddInterface::AddInterface(WpaGui *_wpagui, QWidget *parent)
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	: QDialog(parent), wpagui(_wpagui)
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	setWindowTitle(tr("Select network interface to add"));
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	resize(400, 200);
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	vboxLayout = new QVBoxLayout(this);
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget = new QTreeWidget(this);
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->setUniformRowHeights(true);
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->setSortingEnabled(true);
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->setColumnCount(3);
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->headerItem()->setText(0, tr("driver"));
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->headerItem()->setText(1, tr("interface"));
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->headerItem()->setText(2, tr("description"));
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->setItemsExpandable(FALSE);
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->setRootIsDecorated(FALSE);
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	vboxLayout->addWidget(interfaceWidget);
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	connect(interfaceWidget,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		SIGNAL(itemActivated(QTreeWidgetItem *, int)), this,
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		SLOT(interfaceSelected(QTreeWidgetItem *)));
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	addInterfaces();
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid AddInterface::addInterfaces()
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[2048];
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACE_LIST", 14, buf, &len, NULL);
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0) {
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_close(ctrl);
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString ifaces(buf);
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStringList lines = ifaces.split(QRegExp("\\n"));
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (QStringList::Iterator it = lines.begin();
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	     it != lines.end(); it++) {
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList arg = (*it).split(QChar('\t'));
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (arg.size() < 3)
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QTreeWidgetItem *item = new QTreeWidgetItem(interfaceWidget);
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!item)
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setText(0, arg[0]);
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setText(1, arg[1]);
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setText(2, arg[2]);
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->resizeColumnToContents(0);
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->resizeColumnToContents(1);
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interfaceWidget->resizeColumnToContents(2);
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool AddInterface::addRegistryInterface(const QString &ifname)
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	HKEY hk, ihk;
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	LONG ret;
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id, tmp;
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	TCHAR name[10];
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DWORD val, i;
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = RegOpenKeyEx(WPA_KEY_ROOT, WPA_KEY_PREFIX TEXT("\\interfaces"),
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   0, KEY_ENUMERATE_SUB_KEYS | KEY_CREATE_SUB_KEY,
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   &hk);
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != ERROR_SUCCESS)
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return false;
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = -1;
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; ; i++) {
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		TCHAR name[255];
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		DWORD namelen;
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		namelen = 255;
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = RegEnumKeyEx(hk, i, name, &namelen, NULL, NULL, NULL,
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   NULL);
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret == ERROR_NO_MORE_ITEMS)
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret != ERROR_SUCCESS)
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (namelen >= 255)
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			namelen = 255 - 1;
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		name[namelen] = '\0';
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef UNICODE
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString s((QChar *) name, namelen);
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* UNICODE */
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString s(name);
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* UNICODE */
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp = s.toInt();
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (tmp > id)
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = tmp;
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id += 1;
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef UNICODE
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wsprintf(name, L"%04d", id);
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* UNICODE */
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(name, sizeof(name), "%04d", id);
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* UNICODE */
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = RegCreateKeyEx(hk, name, 0, NULL, 0, KEY_WRITE, NULL, &ihk,
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     NULL);
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegCloseKey(hk);
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != ERROR_SUCCESS)
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return false;
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef UNICODE
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		      (LPBYTE) ifname.unicode(),
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		      (ifname.length() + 1) * sizeof(TCHAR));
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* UNICODE */
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		      (LPBYTE) ifname.toLocal8Bit(), ifname.length() + 1);
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* UNICODE */
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegSetValueEx(ihk, TEXT("config"), 0, REG_SZ,
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		      (LPBYTE) TEXT("default"), 8 * sizeof(TCHAR));
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegSetValueEx(ihk, TEXT("ctrl_interface"), 0, REG_SZ,
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		      (LPBYTE) TEXT(""), 1 * sizeof(TCHAR));
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	val = 1;
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegSetValueEx(ihk, TEXT("skip_on_error"), 0, REG_DWORD, (LPBYTE) &val,
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		      sizeof(val));
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	RegCloseKey(ihk);
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return true;
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid AddInterface::interfaceSelected(QTreeWidgetItem *sel)
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!sel)
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[20], cmd[256];
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * <driver_param>TAB<bridge_name>
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd),
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 sel->text(1).toAscii().constData(),
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 "default",
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 sel->text(0).toAscii().constData(),
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 "yes", "", "");
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len, NULL);
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0) {
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox::warning(this, "wpa_gui",
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     tr("Add interface command could not be "
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					"completed."));
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (buf[0] != 'O' || buf[1] != 'K') {
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox::warning(this, "wpa_gui",
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     tr("Failed to add the interface."));
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!addRegistryInterface(sel->text(1))) {
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox::information(this, "wpa_gui",
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 tr("Failed to add the interface into "
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    "registry."));
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpagui->selectAdapter(sel->text(1));
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	close();
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
240