00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <cstdio>
00016 #include "common/wpa_ctrl.h"
00017
00018 #include <QMessageBox>
00019
00020 #include "wpagui.h"
00021 #include "addinterface.h"
00022
00023 #ifdef CONFIG_NATIVE_WINDOWS
00024 #include <windows.h>
00025
00026 #ifndef WPA_KEY_ROOT
00027 #define WPA_KEY_ROOT HKEY_LOCAL_MACHINE
00028 #endif
00029 #ifndef WPA_KEY_PREFIX
00030 #define WPA_KEY_PREFIX TEXT("SOFTWARE\\wpa_supplicant")
00031 #endif
00032 #endif
00033
00034
00035 AddInterface::AddInterface(WpaGui *_wpagui, QWidget *parent)
00036 : QDialog(parent), wpagui(_wpagui)
00037 {
00038 setWindowTitle(tr("Select network interface to add"));
00039 resize(400, 200);
00040 vboxLayout = new QVBoxLayout(this);
00041
00042 interfaceWidget = new QTreeWidget(this);
00043 interfaceWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
00044 interfaceWidget->setUniformRowHeights(true);
00045 interfaceWidget->setSortingEnabled(true);
00046 interfaceWidget->setColumnCount(3);
00047 interfaceWidget->headerItem()->setText(0, tr("driver"));
00048 interfaceWidget->headerItem()->setText(1, tr("interface"));
00049 interfaceWidget->headerItem()->setText(2, tr("description"));
00050 interfaceWidget->setItemsExpandable(FALSE);
00051 interfaceWidget->setRootIsDecorated(FALSE);
00052 vboxLayout->addWidget(interfaceWidget);
00053
00054 connect(interfaceWidget,
00055 SIGNAL(itemActivated(QTreeWidgetItem *, int)), this,
00056 SLOT(interfaceSelected(QTreeWidgetItem *)));
00057
00058 addInterfaces();
00059 }
00060
00061
00062 void AddInterface::addInterfaces()
00063 {
00064 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
00065 struct wpa_ctrl *ctrl;
00066 int ret;
00067 char buf[2048];
00068 size_t len;
00069
00070 ctrl = wpa_ctrl_open(NULL);
00071 if (ctrl == NULL)
00072 return;
00073
00074 len = sizeof(buf) - 1;
00075 ret = wpa_ctrl_request(ctrl, "INTERFACE_LIST", 14, buf, &len, NULL);
00076 if (ret < 0) {
00077 wpa_ctrl_close(ctrl);
00078 return;
00079 }
00080 buf[len] = '\0';
00081
00082 wpa_ctrl_close(ctrl);
00083
00084 QString ifaces(buf);
00085 QStringList lines = ifaces.split(QRegExp("\\n"));
00086 for (QStringList::Iterator it = lines.begin();
00087 it != lines.end(); it++) {
00088 QStringList arg = (*it).split(QChar('\t'));
00089 if (arg.size() < 3)
00090 continue;
00091 QTreeWidgetItem *item = new QTreeWidgetItem(interfaceWidget);
00092 if (!item)
00093 break;
00094
00095 item->setText(0, arg[0]);
00096 item->setText(1, arg[1]);
00097 item->setText(2, arg[2]);
00098 }
00099
00100 interfaceWidget->resizeColumnToContents(0);
00101 interfaceWidget->resizeColumnToContents(1);
00102 interfaceWidget->resizeColumnToContents(2);
00103 #endif
00104 }
00105
00106
00107 #ifdef CONFIG_NATIVE_WINDOWS
00108 bool AddInterface::addRegistryInterface(const QString &ifname)
00109 {
00110 HKEY hk, ihk;
00111 LONG ret;
00112 int id, tmp;
00113 TCHAR name[10];
00114 DWORD val, i;
00115
00116 ret = RegOpenKeyEx(WPA_KEY_ROOT, WPA_KEY_PREFIX TEXT("\\interfaces"),
00117 0, KEY_ENUMERATE_SUB_KEYS | KEY_CREATE_SUB_KEY,
00118 &hk);
00119 if (ret != ERROR_SUCCESS)
00120 return false;
00121
00122 id = -1;
00123
00124 for (i = 0; ; i++) {
00125 TCHAR name[255];
00126 DWORD namelen;
00127
00128 namelen = 255;
00129 ret = RegEnumKeyEx(hk, i, name, &namelen, NULL, NULL, NULL,
00130 NULL);
00131
00132 if (ret == ERROR_NO_MORE_ITEMS)
00133 break;
00134
00135 if (ret != ERROR_SUCCESS)
00136 break;
00137
00138 if (namelen >= 255)
00139 namelen = 255 - 1;
00140 name[namelen] = '\0';
00141
00142 #ifdef UNICODE
00143 QString s((QChar *) name, namelen);
00144 #else
00145 QString s(name);
00146 #endif
00147 tmp = s.toInt();
00148 if (tmp > id)
00149 id = tmp;
00150 }
00151
00152 id += 1;
00153
00154 #ifdef UNICODE
00155 wsprintf(name, L"%04d", id);
00156 #else
00157 os_snprintf(name, sizeof(name), "%04d", id);
00158 #endif
00159 ret = RegCreateKeyEx(hk, name, 0, NULL, 0, KEY_WRITE, NULL, &ihk,
00160 NULL);
00161 RegCloseKey(hk);
00162 if (ret != ERROR_SUCCESS)
00163 return false;
00164
00165 #ifdef UNICODE
00166 RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
00167 (LPBYTE) ifname.unicode(),
00168 (ifname.length() + 1) * sizeof(TCHAR));
00169
00170 #else
00171 RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
00172 (LPBYTE) ifname.toLocal8Bit(), ifname.length() + 1);
00173 #endif
00174 RegSetValueEx(ihk, TEXT("config"), 0, REG_SZ,
00175 (LPBYTE) TEXT("default"), 8 * sizeof(TCHAR));
00176 RegSetValueEx(ihk, TEXT("ctrl_interface"), 0, REG_SZ,
00177 (LPBYTE) TEXT(""), 1 * sizeof(TCHAR));
00178 val = 1;
00179 RegSetValueEx(ihk, TEXT("skip_on_error"), 0, REG_DWORD, (LPBYTE) &val,
00180 sizeof(val));
00181
00182 RegCloseKey(ihk);
00183 return true;
00184 }
00185 #endif
00186
00187
00188 void AddInterface::interfaceSelected(QTreeWidgetItem *sel)
00189 {
00190 if (!sel)
00191 return;
00192
00193 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
00194 struct wpa_ctrl *ctrl;
00195 int ret;
00196 char buf[20], cmd[256];
00197 size_t len;
00198
00199
00200
00201
00202
00203 snprintf(cmd, sizeof(cmd),
00204 "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
00205 sel->text(1).toAscii().constData(),
00206 "default",
00207 sel->text(0).toAscii().constData(),
00208 "yes", "", "");
00209 cmd[sizeof(cmd) - 1] = '\0';
00210
00211 ctrl = wpa_ctrl_open(NULL);
00212 if (ctrl == NULL)
00213 return;
00214
00215 len = sizeof(buf) - 1;
00216 ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len, NULL);
00217 wpa_ctrl_close(ctrl);
00218
00219 if (ret < 0) {
00220 QMessageBox::warning(this, "wpa_gui",
00221 tr("Add interface command could not be "
00222 "completed."));
00223 return;
00224 }
00225
00226 buf[len] = '\0';
00227 if (buf[0] != 'O' || buf[1] != 'K') {
00228 QMessageBox::warning(this, "wpa_gui",
00229 tr("Failed to add the interface."));
00230 return;
00231 }
00232
00233 #endif
00234
00235 #ifdef CONFIG_NATIVE_WINDOWS
00236 if (!addRegistryInterface(sel->text(1))) {
00237 QMessageBox::information(this, "wpa_gui",
00238 tr("Failed to add the interface into "
00239 "registry."));
00240 }
00241 #endif
00242
00243 wpagui->selectAdapter(sel->text(1));
00244 close();
00245 }