Fork from wpa_supplicant version 2.6
...containing only the wpa_gui-qt4 sub tree and the bare necessities for a successful compile. The current /src tree conforms wpa_supplicant-2.6/wpa_supplicant/wpa_gui-qt4 whereas current /wpa_supplicant tree conforms wpa_supplicant-2.6/src with the bare necessities to build a Linux vesion. The original source was taken from http://w1.fi/wpa_supplicant
This commit is contained in:
commit
7b6d433368
56 changed files with 16718 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
src/.qmake.stash
|
||||
src/Makefile
|
||||
src/wpa_gui
|
||||
171
CONTRIBUTIONS
Normal file
171
CONTRIBUTIONS
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
Contributions to hostap.git
|
||||
---------------------------
|
||||
|
||||
This software is distributed under a permissive open source license to
|
||||
allow it to be used in any projects, whether open source or proprietary.
|
||||
Contributions to the project are welcome and it is important to maintain
|
||||
clear record of contributions and terms under which they are licensed.
|
||||
To help with this, following procedure is used to allow acceptance and
|
||||
recording of the terms.
|
||||
|
||||
All contributions are expected to be licensed under the modified BSD
|
||||
license (see below). Acknowledgment of the terms is tracked through
|
||||
inclusion of Signed-off-by tag in the contributions at the end of the
|
||||
commit log message. This tag indicates that the contributor agrees with
|
||||
the Developer Certificate of Origin (DCO) version 1.1 terms (see below;
|
||||
also available from http://developercertificate.org/).
|
||||
|
||||
|
||||
The current requirements for contributions to hostap.git
|
||||
--------------------------------------------------------
|
||||
|
||||
To indicate your acceptance of Developer's Certificate of Origin 1.1
|
||||
terms, please add the following line to the end of the commit message
|
||||
for each contribution you make to the project:
|
||||
|
||||
Signed-off-by: Your Name <your@email.example.org>
|
||||
|
||||
using your real name. Pseudonyms or anonymous contributions cannot
|
||||
unfortunately be accepted.
|
||||
|
||||
|
||||
The preferred method of submitting the contribution to the project is by
|
||||
email to the hostap mailing list:
|
||||
hostap@lists.infradead.org
|
||||
Note that the list may require subscription before accepting message
|
||||
without moderation. You can subscribe to the list at this address:
|
||||
http://lists.infradead.org/mailman/listinfo/hostap
|
||||
|
||||
The message should contain an inlined patch against the current
|
||||
development branch (i.e., the master branch of
|
||||
git://w1.fi/hostap.git). Please make sure the software you use for
|
||||
sending the patch does not corrupt whitespace. If that cannot be fixed
|
||||
for some reason, it is better to include an attached version of the
|
||||
patch file than just send a whitespace damaged version in the message
|
||||
body.
|
||||
|
||||
The patches should be separate logical changes rather than doing
|
||||
everything in a single patch. In other words, please keep cleanup, new
|
||||
features, and bug fixes all in their own patches. Each patch needs a
|
||||
commit log that describes the changes (what the changes fix, what
|
||||
functionality is added, why the changes are useful, etc.).
|
||||
|
||||
Please try to follow the coding style used in the project.
|
||||
|
||||
In general, the best way of generating a suitable formatted patch file
|
||||
is by committing the changes to a cloned git repository and using git
|
||||
format-patch. The patch can then be sent, e.g., with git send-email.
|
||||
|
||||
|
||||
History of license and contributions terms
|
||||
------------------------------------------
|
||||
|
||||
Until February 11, 2012, in case of most files in hostap.git, "under the
|
||||
open source license indicated in the file" means that the contribution
|
||||
is licensed both under GPL v2 and modified BSD license (see below) and
|
||||
the choice between these licenses is given to anyone who redistributes
|
||||
or uses the software. As such, the contribution has to be licensed under
|
||||
both options to allow this choice.
|
||||
|
||||
As of February 11, 2012, the project has chosen to use only the BSD
|
||||
license option for future distribution. As such, the GPL v2 license
|
||||
option is no longer used and the contributions are not required to be
|
||||
licensed until GPL v2. In case of most files in hostap.git, "under the
|
||||
open source license indicated in the file" means that the contribution
|
||||
is licensed under the modified BSD license (see below).
|
||||
|
||||
Until February 13, 2014, the project used an extended version of the DCO
|
||||
that included the identical items (a) through (d) from DCO 1.1 and an
|
||||
additional item (e):
|
||||
|
||||
(e) The contribution can be licensed under the modified BSD license
|
||||
as shown below even in case of files that are currently licensed
|
||||
under other terms.
|
||||
|
||||
This was used during the period when some of the files included the old
|
||||
license terms. Acceptance of this extended DCO version was indicated
|
||||
with a Signed-hostap tag in the commit message. This additional item (e)
|
||||
was used to collect explicit approval to license the contribution with
|
||||
only the modified BSD license (see below), i.e., without the GPL v2
|
||||
option. This was done to allow simpler licensing terms to be used in the
|
||||
future. It should be noted that the modified BSD license is compatible
|
||||
with GNU GPL and as such, this possible move to simpler licensing option
|
||||
does not prevent use of this software in GPL projects.
|
||||
|
||||
|
||||
===[ start quote from http://developercertificate.org/ ]=======================
|
||||
|
||||
Developer Certificate of Origin
|
||||
Version 1.1
|
||||
|
||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||
660 York Street, Suite 102,
|
||||
San Francisco, CA 94110 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
|
||||
Developer's Certificate of Origin 1.1
|
||||
|
||||
By making a contribution to this project, I certify that:
|
||||
|
||||
(a) The contribution was created in whole or in part by me and I
|
||||
have the right to submit it under the open source license
|
||||
indicated in the file; or
|
||||
|
||||
(b) The contribution is based upon previous work that, to the best
|
||||
of my knowledge, is covered under an appropriate open source
|
||||
license and I have the right under that license to submit that
|
||||
work with modifications, whether created in whole or in part
|
||||
by me, under the same open source license (unless I am
|
||||
permitted to submit under a different license), as indicated
|
||||
in the file; or
|
||||
|
||||
(c) The contribution was provided directly to me by some other
|
||||
person who certified (a), (b) or (c) and I have not modified
|
||||
it.
|
||||
|
||||
(d) I understand and agree that this project and the contribution
|
||||
are public and that a record of the contribution (including all
|
||||
personal information I submit with it, including my sign-off) is
|
||||
maintained indefinitely and may be redistributed consistent with
|
||||
this project or the open source license(s) involved.
|
||||
|
||||
===[ end quote from http://developercertificate.org/ ]=========================
|
||||
|
||||
|
||||
The license terms used for hostap.git files
|
||||
-------------------------------------------
|
||||
|
||||
Modified BSD license (no advertisement clause):
|
||||
|
||||
Copyright (c) 2002-2016, Jouni Malinen <j@w1.fi> and contributors
|
||||
All Rights Reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name(s) of the above-listed copyright holder(s) nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
22
COPYING
Normal file
22
COPYING
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
wpa_supplicant and hostapd
|
||||
--------------------------
|
||||
|
||||
Copyright (c) 2002-2016, Jouni Malinen <j@w1.fi> and contributors
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
See the README file for the current license terms.
|
||||
|
||||
This software was previously distributed under BSD/GPL v2 dual license
|
||||
terms that allowed either of those license alternatives to be
|
||||
selected. As of February 11, 2012, the project has chosen to use only
|
||||
the BSD license option for future distribution. As such, the GPL v2
|
||||
license option is no longer used. It should be noted that the BSD
|
||||
license option (the one with advertisement clause removed) is compatible
|
||||
with GPL and as such, does not prevent use of this software in projects
|
||||
that use GPL.
|
||||
|
||||
Some of the files may still include pointers to GPL version 2 license
|
||||
terms. However, such copyright and license notifications are maintained
|
||||
only for attribution purposes and any distribution of this software
|
||||
after February 11, 2012 is no longer under the GPL v2 option.
|
||||
56
README
Normal file
56
README
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
wpa_supplicant and hostapd
|
||||
--------------------------
|
||||
|
||||
Copyright (c) 2002-2016, Jouni Malinen <j@w1.fi> and contributors
|
||||
All Rights Reserved.
|
||||
|
||||
These programs are licensed under the BSD license (the one with
|
||||
advertisement clause removed).
|
||||
|
||||
If you are submitting changes to the project, please see CONTRIBUTIONS
|
||||
file for more instructions.
|
||||
|
||||
|
||||
This package may include either wpa_supplicant, hostapd, or both. See
|
||||
README file respective subdirectories (wpa_supplicant/README or
|
||||
hostapd/README) for more details.
|
||||
|
||||
Source code files were moved around in v0.6.x releases and compared to
|
||||
earlier releases, the programs are now built by first going to a
|
||||
subdirectory (wpa_supplicant or hostapd) and creating build
|
||||
configuration (.config) and running 'make' there (for Linux/BSD/cygwin
|
||||
builds).
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
This software may be distributed, used, and modified under the terms of
|
||||
BSD license:
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name(s) of the above-listed copyright holder(s) nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
28
doc/Makefile
Normal file
28
doc/Makefile
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
all: man html pdf
|
||||
|
||||
FILES += wpa_background
|
||||
FILES += wpa_cli
|
||||
FILES += wpa_gui
|
||||
FILES += wpa_passphrase
|
||||
FILES += wpa_priv
|
||||
FILES += wpa_supplicant.conf
|
||||
FILES += wpa_supplicant
|
||||
FILES += eapol_test
|
||||
|
||||
man:
|
||||
for i in $(FILES); do docbook2man $$i.sgml; done
|
||||
|
||||
html:
|
||||
for i in $(FILES); do docbook2html $$i.sgml && \
|
||||
mv index.html $$i.html; done
|
||||
|
||||
pdf:
|
||||
for i in $(FILES); do docbook2pdf $$i.sgml; done
|
||||
|
||||
|
||||
clean:
|
||||
rm -f wpa_background.8 wpa_cli.8 wpa_gui.8 wpa_passphrase.8 wpa_priv.8 wpa_supplicant.8 eapol_test.8
|
||||
rm -f wpa_supplicant.conf.5
|
||||
rm -f manpage.links manpage.refs
|
||||
rm -f $(FILES:%=%.pdf)
|
||||
rm -f $(FILES:%=%.html)
|
||||
102
doc/wpa_gui.sgml
Normal file
102
doc/wpa_gui.sgml
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
|
||||
|
||||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle>wpa_gui</refentrytitle>
|
||||
<manvolnum>8</manvolnum>
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname>wpa_gui</refname>
|
||||
|
||||
<refpurpose>WPA Graphical User Interface</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>wpa_gui</command>
|
||||
<arg>-p <replaceable>path to ctrl sockets</replaceable></arg>
|
||||
<arg>-i <replaceable>ifname</replaceable></arg>
|
||||
<arg>-m <replaceable>seconds</replaceable></arg>
|
||||
<arg>-t</arg>
|
||||
<arg>-q</arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Overview</title>
|
||||
|
||||
<para>wpa_gui is a QT graphical frontend program for interacting
|
||||
with wpa_supplicant. It is used to query current status, change
|
||||
configuration and request interactive user input.</para>
|
||||
|
||||
<para>wpa_gui supports (almost) all of the interactive status and
|
||||
configuration features of the command line client, wpa_cli. Refer
|
||||
to the wpa_cli manpage for a comprehensive list of the
|
||||
interactive mode features.</para>
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
<title>Command Arguments</title>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>-p path</term>
|
||||
|
||||
<listitem><para>Change the path where control sockets should
|
||||
be found.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>-i ifname</term>
|
||||
|
||||
<listitem><para>Specify the interface that is being
|
||||
configured. By default, choose the first interface found with
|
||||
a control socket in the socket path.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>-m seconds</term>
|
||||
|
||||
<listitem><para>Set the update interval in seconds for the signal
|
||||
strength meter. This value must be a positive integer, otherwise
|
||||
meter is not enabled (default behavior).</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>-t</term>
|
||||
|
||||
<listitem><para>Start program in the system tray only (if the window
|
||||
manager supports it). By default the main status window is
|
||||
shown.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>-q</term>
|
||||
|
||||
<listitem><para>Run program in the quiet mode - do not display tray
|
||||
icon pop-up messages.</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
<title>See Also</title>
|
||||
<para>
|
||||
<citerefentry>
|
||||
<refentrytitle>wpa_cli</refentrytitle>
|
||||
<manvolnum>8</manvolnum>
|
||||
</citerefentry>
|
||||
<citerefentry>
|
||||
<refentrytitle>wpa_supplicant</refentrytitle>
|
||||
<manvolnum>8</manvolnum>
|
||||
</citerefentry>
|
||||
</para>
|
||||
</refsect1>
|
||||
<refsect1>
|
||||
<title>Legal</title>
|
||||
<para>wpa_supplicant is copyright (c) 2003-2016,
|
||||
Jouni Malinen <email>j@w1.fi</email> and
|
||||
contributors.
|
||||
All Rights Reserved.</para>
|
||||
|
||||
<para>This program is licensed under the BSD license (the one with
|
||||
advertisement clause removed).</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
239
src/addinterface.cpp
Normal file
239
src/addinterface.cpp
Normal file
|
|
@ -0,0 +1,239 @@
|
|||
/*
|
||||
* wpa_gui - AddInterface class
|
||||
* Copyright (c) 2008, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include "common/wpa_ctrl.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "wpagui.h"
|
||||
#include "addinterface.h"
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
#include <windows.h>
|
||||
|
||||
#ifndef WPA_KEY_ROOT
|
||||
#define WPA_KEY_ROOT HKEY_LOCAL_MACHINE
|
||||
#endif
|
||||
#ifndef WPA_KEY_PREFIX
|
||||
#define WPA_KEY_PREFIX TEXT("SOFTWARE\\wpa_supplicant")
|
||||
#endif
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
|
||||
AddInterface::AddInterface(WpaGui *_wpagui, QWidget *parent)
|
||||
: QDialog(parent), wpagui(_wpagui)
|
||||
{
|
||||
setWindowTitle(tr("Select network interface to add"));
|
||||
resize(400, 200);
|
||||
vboxLayout = new QVBoxLayout(this);
|
||||
|
||||
interfaceWidget = new QTreeWidget(this);
|
||||
interfaceWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
interfaceWidget->setUniformRowHeights(true);
|
||||
interfaceWidget->setSortingEnabled(true);
|
||||
interfaceWidget->setColumnCount(3);
|
||||
interfaceWidget->headerItem()->setText(0, tr("driver"));
|
||||
interfaceWidget->headerItem()->setText(1, tr("interface"));
|
||||
interfaceWidget->headerItem()->setText(2, tr("description"));
|
||||
interfaceWidget->setItemsExpandable(false);
|
||||
interfaceWidget->setRootIsDecorated(false);
|
||||
vboxLayout->addWidget(interfaceWidget);
|
||||
|
||||
connect(interfaceWidget,
|
||||
SIGNAL(itemActivated(QTreeWidgetItem *, int)), this,
|
||||
SLOT(interfaceSelected(QTreeWidgetItem *)));
|
||||
|
||||
addInterfaces();
|
||||
}
|
||||
|
||||
|
||||
void AddInterface::addInterfaces()
|
||||
{
|
||||
#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
struct wpa_ctrl *ctrl;
|
||||
int ret;
|
||||
char buf[2048];
|
||||
size_t len;
|
||||
|
||||
ctrl = wpa_ctrl_open(NULL);
|
||||
if (ctrl == NULL)
|
||||
return;
|
||||
|
||||
len = sizeof(buf) - 1;
|
||||
ret = wpa_ctrl_request(ctrl, "INTERFACE_LIST", 14, buf, &len, NULL);
|
||||
if (ret < 0) {
|
||||
wpa_ctrl_close(ctrl);
|
||||
return;
|
||||
}
|
||||
buf[len] = '\0';
|
||||
|
||||
wpa_ctrl_close(ctrl);
|
||||
|
||||
QString ifaces(buf);
|
||||
QStringList lines = ifaces.split(QRegExp("\\n"));
|
||||
for (QStringList::Iterator it = lines.begin();
|
||||
it != lines.end(); it++) {
|
||||
QStringList arg = (*it).split(QChar('\t'));
|
||||
if (arg.size() < 3)
|
||||
continue;
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(interfaceWidget);
|
||||
if (!item)
|
||||
break;
|
||||
|
||||
item->setText(0, arg[0]);
|
||||
item->setText(1, arg[1]);
|
||||
item->setText(2, arg[2]);
|
||||
}
|
||||
|
||||
interfaceWidget->resizeColumnToContents(0);
|
||||
interfaceWidget->resizeColumnToContents(1);
|
||||
interfaceWidget->resizeColumnToContents(2);
|
||||
#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
bool AddInterface::addRegistryInterface(const QString &ifname)
|
||||
{
|
||||
HKEY hk, ihk;
|
||||
LONG ret;
|
||||
int id, tmp;
|
||||
TCHAR name[10];
|
||||
DWORD val, i;
|
||||
|
||||
ret = RegOpenKeyEx(WPA_KEY_ROOT, WPA_KEY_PREFIX TEXT("\\interfaces"),
|
||||
0, KEY_ENUMERATE_SUB_KEYS | KEY_CREATE_SUB_KEY,
|
||||
&hk);
|
||||
if (ret != ERROR_SUCCESS)
|
||||
return false;
|
||||
|
||||
id = -1;
|
||||
|
||||
for (i = 0; ; i++) {
|
||||
TCHAR name[255];
|
||||
DWORD namelen;
|
||||
|
||||
namelen = 255;
|
||||
ret = RegEnumKeyEx(hk, i, name, &namelen, NULL, NULL, NULL,
|
||||
NULL);
|
||||
|
||||
if (ret == ERROR_NO_MORE_ITEMS)
|
||||
break;
|
||||
|
||||
if (ret != ERROR_SUCCESS)
|
||||
break;
|
||||
|
||||
if (namelen >= 255)
|
||||
namelen = 255 - 1;
|
||||
name[namelen] = '\0';
|
||||
|
||||
#ifdef UNICODE
|
||||
QString s((QChar *) name, namelen);
|
||||
#else /* UNICODE */
|
||||
QString s(name);
|
||||
#endif /* UNICODE */
|
||||
tmp = s.toInt();
|
||||
if (tmp > id)
|
||||
id = tmp;
|
||||
}
|
||||
|
||||
id += 1;
|
||||
|
||||
#ifdef UNICODE
|
||||
wsprintf(name, L"%04d", id);
|
||||
#else /* UNICODE */
|
||||
os_snprintf(name, sizeof(name), "%04d", id);
|
||||
#endif /* UNICODE */
|
||||
ret = RegCreateKeyEx(hk, name, 0, NULL, 0, KEY_WRITE, NULL, &ihk,
|
||||
NULL);
|
||||
RegCloseKey(hk);
|
||||
if (ret != ERROR_SUCCESS)
|
||||
return false;
|
||||
|
||||
#ifdef UNICODE
|
||||
RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
|
||||
(LPBYTE) ifname.unicode(),
|
||||
(ifname.length() + 1) * sizeof(TCHAR));
|
||||
|
||||
#else /* UNICODE */
|
||||
RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
|
||||
(LPBYTE) ifname.toLocal8Bit(), ifname.length() + 1);
|
||||
#endif /* UNICODE */
|
||||
RegSetValueEx(ihk, TEXT("config"), 0, REG_SZ,
|
||||
(LPBYTE) TEXT("default"), 8 * sizeof(TCHAR));
|
||||
RegSetValueEx(ihk, TEXT("ctrl_interface"), 0, REG_SZ,
|
||||
(LPBYTE) TEXT(""), 1 * sizeof(TCHAR));
|
||||
val = 1;
|
||||
RegSetValueEx(ihk, TEXT("skip_on_error"), 0, REG_DWORD, (LPBYTE) &val,
|
||||
sizeof(val));
|
||||
|
||||
RegCloseKey(ihk);
|
||||
return true;
|
||||
}
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
|
||||
void AddInterface::interfaceSelected(QTreeWidgetItem *sel)
|
||||
{
|
||||
if (!sel)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
struct wpa_ctrl *ctrl;
|
||||
int ret;
|
||||
char buf[20], cmd[256];
|
||||
size_t len;
|
||||
|
||||
/*
|
||||
* INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
|
||||
* <driver_param>TAB<bridge_name>
|
||||
*/
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
|
||||
sel->text(1).toLocal8Bit().constData(),
|
||||
"default",
|
||||
sel->text(0).toLocal8Bit().constData(),
|
||||
"yes", "", "");
|
||||
cmd[sizeof(cmd) - 1] = '\0';
|
||||
|
||||
ctrl = wpa_ctrl_open(NULL);
|
||||
if (ctrl == NULL)
|
||||
return;
|
||||
|
||||
len = sizeof(buf) - 1;
|
||||
ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len, NULL);
|
||||
wpa_ctrl_close(ctrl);
|
||||
|
||||
if (ret < 0) {
|
||||
QMessageBox::warning(this, "wpa_gui",
|
||||
tr("Add interface command could not be "
|
||||
"completed."));
|
||||
return;
|
||||
}
|
||||
|
||||
buf[len] = '\0';
|
||||
if (buf[0] != 'O' || buf[1] != 'K') {
|
||||
QMessageBox::warning(this, "wpa_gui",
|
||||
tr("Failed to add the interface."));
|
||||
return;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
if (!addRegistryInterface(sel->text(1))) {
|
||||
QMessageBox::information(this, "wpa_gui",
|
||||
tr("Failed to add the interface into "
|
||||
"registry."));
|
||||
}
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
wpagui->selectAdapter(sel->text(1));
|
||||
close();
|
||||
}
|
||||
39
src/addinterface.h
Normal file
39
src/addinterface.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* wpa_gui - AddInterface class
|
||||
* Copyright (c) 2008, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef ADDINTERFACE_H
|
||||
#define ADDINTERFACE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include <QDialog>
|
||||
#include <QTreeWidget>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
class WpaGui;
|
||||
|
||||
class AddInterface : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AddInterface(WpaGui *_wpagui, QWidget *parent = 0);
|
||||
|
||||
public slots:
|
||||
virtual void interfaceSelected(QTreeWidgetItem *sel);
|
||||
|
||||
private:
|
||||
void addInterfaces();
|
||||
bool addRegistryInterface(const QString &ifname);
|
||||
|
||||
QVBoxLayout *vboxLayout;
|
||||
QTreeWidget *interfaceWidget;
|
||||
WpaGui *wpagui;
|
||||
};
|
||||
|
||||
#endif /* ADDINTERFACE_H */
|
||||
124
src/eventhistory.cpp
Normal file
124
src/eventhistory.cpp
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* wpa_gui - EventHistory class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include <QHeaderView>
|
||||
#include <QScrollBar>
|
||||
|
||||
#include "eventhistory.h"
|
||||
|
||||
|
||||
int EventListModel::rowCount(const QModelIndex &) const
|
||||
{
|
||||
return msgList.count();
|
||||
}
|
||||
|
||||
|
||||
int EventListModel::columnCount(const QModelIndex &) const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
||||
QVariant EventListModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
if (role == Qt::DisplayRole)
|
||||
if (index.column() == 0) {
|
||||
if (index.row() >= timeList.size())
|
||||
return QVariant();
|
||||
return timeList.at(index.row());
|
||||
} else {
|
||||
if (index.row() >= msgList.size())
|
||||
return QVariant();
|
||||
return msgList.at(index.row());
|
||||
}
|
||||
else
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
||||
QVariant EventListModel::headerData(int section, Qt::Orientation orientation,
|
||||
int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant();
|
||||
|
||||
if (orientation == Qt::Horizontal) {
|
||||
switch (section) {
|
||||
case 0:
|
||||
return QString(tr("Timestamp"));
|
||||
case 1:
|
||||
return QString(tr("Message"));
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
} else
|
||||
return QString("%1").arg(section);
|
||||
}
|
||||
|
||||
|
||||
void EventListModel::addEvent(QString time, QString msg)
|
||||
{
|
||||
beginInsertRows(QModelIndex(), msgList.size(), msgList.size() + 1);
|
||||
timeList << time;
|
||||
msgList << msg;
|
||||
endInsertRows();
|
||||
}
|
||||
|
||||
|
||||
EventHistory::EventHistory(QWidget *parent, const char *, bool, Qt::WindowFlags)
|
||||
: QDialog(parent)
|
||||
{
|
||||
setupUi(this);
|
||||
|
||||
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
|
||||
|
||||
eventListView->setItemsExpandable(false);
|
||||
eventListView->setRootIsDecorated(false);
|
||||
elm = new EventListModel(parent);
|
||||
eventListView->setModel(elm);
|
||||
}
|
||||
|
||||
|
||||
EventHistory::~EventHistory()
|
||||
{
|
||||
destroy();
|
||||
delete elm;
|
||||
}
|
||||
|
||||
|
||||
void EventHistory::languageChange()
|
||||
{
|
||||
retranslateUi(this);
|
||||
}
|
||||
|
||||
|
||||
void EventHistory::addEvents(WpaMsgList msgs)
|
||||
{
|
||||
WpaMsgList::iterator it;
|
||||
for (it = msgs.begin(); it != msgs.end(); it++)
|
||||
addEvent(*it);
|
||||
}
|
||||
|
||||
|
||||
void EventHistory::addEvent(WpaMsg msg)
|
||||
{
|
||||
bool scroll = true;
|
||||
|
||||
if (eventListView->verticalScrollBar()->value() <
|
||||
eventListView->verticalScrollBar()->maximum())
|
||||
scroll = false;
|
||||
|
||||
elm->addEvent(msg.getTimestamp().toString("yyyy-MM-dd hh:mm:ss.zzz"),
|
||||
msg.getMsg());
|
||||
|
||||
if (scroll)
|
||||
eventListView->scrollToBottom();
|
||||
}
|
||||
57
src/eventhistory.h
Normal file
57
src/eventhistory.h
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* wpa_gui - EventHistory class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef EVENTHISTORY_H
|
||||
#define EVENTHISTORY_H
|
||||
|
||||
#include <QObject>
|
||||
#include "ui_eventhistory.h"
|
||||
|
||||
|
||||
class EventListModel : public QAbstractTableModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
EventListModel(QObject *parent = 0)
|
||||
: QAbstractTableModel(parent) {}
|
||||
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
QVariant data(const QModelIndex &index, int role) const;
|
||||
QVariant headerData(int section, Qt::Orientation orientation,
|
||||
int role = Qt::DisplayRole) const;
|
||||
void addEvent(QString time, QString msg);
|
||||
|
||||
private:
|
||||
QStringList timeList;
|
||||
QStringList msgList;
|
||||
};
|
||||
|
||||
|
||||
class EventHistory : public QDialog, public Ui::EventHistory
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
EventHistory(QWidget *parent = 0, const char *name = 0,
|
||||
bool modal = false, Qt::WindowFlags fl = 0);
|
||||
~EventHistory();
|
||||
|
||||
public slots:
|
||||
virtual void addEvents(WpaMsgList msgs);
|
||||
virtual void addEvent(WpaMsg msg);
|
||||
|
||||
protected slots:
|
||||
virtual void languageChange();
|
||||
|
||||
private:
|
||||
EventListModel *elm;
|
||||
};
|
||||
|
||||
#endif /* EVENTHISTORY_H */
|
||||
61
src/eventhistory.ui
Normal file
61
src/eventhistory.ui
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<ui version="4.0" >
|
||||
<class>EventHistory</class>
|
||||
<widget class="QDialog" name="EventHistory" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>533</width>
|
||||
<height>285</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>Event history</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" colspan="2" >
|
||||
<widget class="QTreeView" name="eventListView" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="verticalScrollBarPolicy" >
|
||||
<enum>Qt::ScrollBarAlwaysOn</enum>
|
||||
</property>
|
||||
<property name="selectionMode" >
|
||||
<enum>QAbstractItemView::NoSelection</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QPushButton" name="closeButton" >
|
||||
<property name="text" >
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11" />
|
||||
<pixmapfunction></pixmapfunction>
|
||||
<includes>
|
||||
<include location="local" >wpamsg.h</include>
|
||||
</includes>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
9
src/icons.qrc
Normal file
9
src/icons.qrc
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<RCC>
|
||||
<qresource prefix="/icons" >
|
||||
<file alias="wpa_gui.svg">icons/wpa_gui.svg</file>
|
||||
<file alias="ap.svg">icons/ap.svg</file>
|
||||
<file alias="laptop.svg">icons/laptop.svg</file>
|
||||
<file alias="group.svg">icons/group.svg</file>
|
||||
<file alias="invitation.svg">icons/invitation.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
23
src/icons/Makefile
Normal file
23
src/icons/Makefile
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/make -f
|
||||
|
||||
NAMES := wpa_gui ap laptop group invitation
|
||||
SIZES := 16x16 22x22 32x32 48x48 64x64 128x128
|
||||
ICONS := $(addsuffix .png, $(foreach name, $(NAMES), $(foreach size, $(SIZES), $(size)/$(name))))
|
||||
ICONS += $(addsuffix .xpm, $(NAMES))
|
||||
|
||||
all: $(ICONS)
|
||||
|
||||
%.png:
|
||||
mkdir -p hicolor/$(word 1, $(subst /, ,$(@)))/apps/
|
||||
inkscape $(subst .png,.svg, $(word 2, $(subst /, , $(@)))) --without-gui \
|
||||
--export-width=$(word 1, $(subst x, , $(@))) \
|
||||
--export-height=$(word 2, $(subst x, , $(subst /, , $(@)))) \
|
||||
--export-png=hicolor/$(word 1, $(subst /, ,$(@)))/apps/$(word 2, $(subst /, , $@))
|
||||
|
||||
%.xpm:
|
||||
mkdir -p pixmaps/
|
||||
convert hicolor/16x16/apps/$(@:.xpm=.png) pixmaps/$(@:.xpm=-16.xpm)
|
||||
convert hicolor/32x32/apps/$(@:.xpm=.png) pixmaps/$@
|
||||
|
||||
clean:
|
||||
$(RM) -r pixmaps hicolor
|
||||
74
src/icons/README
Normal file
74
src/icons/README
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
wpa_gui icon files
|
||||
|
||||
To convert the svg icons to other formats, make sure inkscape and imagemagick
|
||||
are installed and use `make' to create various sized png and xpm icons.
|
||||
|
||||
|
||||
wpa_gui.svg
|
||||
-----------
|
||||
|
||||
Copyright (c) 2008 Bernard Gray <bernard.gray@gmail.com>
|
||||
|
||||
The wpa_gui icon is licensed under the GPL version 2. Alternatively, the icon
|
||||
may be distributed under the terms of BSD license.
|
||||
|
||||
|
||||
ap.svg
|
||||
------
|
||||
|
||||
mystica_Wireless_Router.svg
|
||||
|
||||
http://openclipart.org/media/files/mystica/8390
|
||||
Wireless Router
|
||||
by: mystica
|
||||
last change: April 20, 2008 10:32 pm (File added)
|
||||
date: April 20, 2008 10:31 pm
|
||||
license: PD
|
||||
|
||||
|
||||
laptop.svg
|
||||
----------
|
||||
|
||||
metalmarious_Laptop.svg
|
||||
|
||||
http://openclipart.org/media/files/metalmarious/4056
|
||||
Laptop
|
||||
by: metalmarious
|
||||
last change: May 18, 2008 07:04 pm (File added)
|
||||
date: August 27, 2007 04:44 am
|
||||
license: PD
|
||||
|
||||
|
||||
group.svg
|
||||
---------
|
||||
|
||||
http://www.openclipart.org/detail/25428
|
||||
http://www.openclipart.org/people/Anonymous/Anonymous_Network.svg
|
||||
Uploader:
|
||||
Anonymous
|
||||
Drawn by:
|
||||
Andrew Fitzsimon / Anonymous
|
||||
Created:
|
||||
2009-04-29 04:07:37
|
||||
Description:
|
||||
A network icon by Andrew Fitzsimon. Etiquette Icon set.
|
||||
From 0.18 OCAL database.
|
||||
|
||||
Public Domain
|
||||
|
||||
|
||||
|
||||
invitation.svg
|
||||
--------------
|
||||
|
||||
http://www.openclipart.org/detail/974
|
||||
http://www.openclipart.org/people/jean_victor_balin/jean_victor_balin_unknown_green.svg
|
||||
Uploader:
|
||||
jean_victor_balin
|
||||
Drawn by:
|
||||
jean_victor_balin
|
||||
Created:
|
||||
2006-10-27 02:12:13
|
||||
Description:
|
||||
|
||||
Public Domain
|
||||
832
src/icons/ap.svg
Normal file
832
src/icons/ap.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 67 KiB |
616
src/icons/group.svg
Normal file
616
src/icons/group.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 48 KiB |
374
src/icons/invitation.svg
Normal file
374
src/icons/invitation.svg
Normal file
|
|
@ -0,0 +1,374 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64.000000px"
|
||||
height="64.000000px"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.42"
|
||||
sodipodi:docbase="G:\Projs\Cliparts Stocker\released"
|
||||
sodipodi:docname="unknown_green.svg"
|
||||
inkscape:export-filename="/datas/wiki/unknown_green.png"
|
||||
inkscape:export-xdpi="90.000000"
|
||||
inkscape:export-ydpi="90.000000">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2842"
|
||||
id="linearGradient1363"
|
||||
x1="25.403513"
|
||||
y1="19.175573"
|
||||
x2="35.541985"
|
||||
y2="49.068703"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-2.402975,4.759656e-3)" />
|
||||
<linearGradient
|
||||
id="linearGradient2900">
|
||||
<stop
|
||||
id="stop2902"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2904"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2842">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2844" />
|
||||
<stop
|
||||
style="stop-color:#c8c8c8;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2846" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2814">
|
||||
<stop
|
||||
id="stop2816"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#e6e6e6;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2818"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#11661d;stop-opacity:0.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2171">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2173" />
|
||||
<stop
|
||||
style="stop-color:#a3a5ee;stop-opacity:0.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2175" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2160">
|
||||
<stop
|
||||
id="stop2162"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#d3cece;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2164"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#474240;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1367">
|
||||
<stop
|
||||
id="stop1369"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#f67e36;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop1371"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#602604;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1347">
|
||||
<stop
|
||||
style="stop-color:#f0da27;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop1349" />
|
||||
<stop
|
||||
style="stop-color:#bf4d09;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop1351" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1315">
|
||||
<stop
|
||||
style="stop-color:#97ff82;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop1317" />
|
||||
<stop
|
||||
style="stop-color:#ceff24;stop-opacity:0.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop1319" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2122">
|
||||
<stop
|
||||
style="stop-color:#2edc32;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2124" />
|
||||
<stop
|
||||
style="stop-color:#11661d;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2126" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1364">
|
||||
<stop
|
||||
style="stop-color:#236b0d;stop-opacity:1.0000000;"
|
||||
offset="0.00000000"
|
||||
id="stop1366" />
|
||||
<stop
|
||||
style="stop-color:#0a2205;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop1368" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1367"
|
||||
id="radialGradient1402"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.211118e-16,1.330643,-1.347411,2.027373e-5,44.09678,-13.39507)"
|
||||
cx="21.959658"
|
||||
cy="14.921703"
|
||||
fx="21.959658"
|
||||
fy="14.921703"
|
||||
r="27.500000" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2122"
|
||||
id="radialGradient1404"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.211118e-16,1.330643,-1.347411,2.027373e-5,44.09678,-13.39507)"
|
||||
cx="21.959658"
|
||||
cy="14.921703"
|
||||
fx="21.959658"
|
||||
fy="14.921703"
|
||||
r="27.500000" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1364"
|
||||
id="linearGradient1419"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="74.910713"
|
||||
y1="32.362179"
|
||||
x2="84.910713"
|
||||
y2="47.451466" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2122"
|
||||
id="linearGradient1421"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="73.839287"
|
||||
y1="34.428566"
|
||||
x2="76.875000"
|
||||
y2="43.714283" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1315"
|
||||
id="linearGradient1423"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="72.946426"
|
||||
y1="35.589287"
|
||||
x2="85.000000"
|
||||
y2="47.375000" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2171"
|
||||
id="linearGradient2177"
|
||||
x1="24.916031"
|
||||
y1="28.824427"
|
||||
x2="39.816792"
|
||||
y2="49.099239"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2122"
|
||||
id="radialGradient2184"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(9.909149e-17,1.088708,-1.102427,1.658760e-5,41.48828,-4.732338)"
|
||||
cx="21.959658"
|
||||
cy="14.921703"
|
||||
fx="21.959658"
|
||||
fy="14.921703"
|
||||
r="27.500000" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1364"
|
||||
id="linearGradient2189"
|
||||
x1="10.018247"
|
||||
y1="8.6306763"
|
||||
x2="63.487556"
|
||||
y2="63.660282"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2171"
|
||||
id="linearGradient1339"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="24.916031"
|
||||
y1="28.824427"
|
||||
x2="39.816792"
|
||||
y2="49.099239" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2122"
|
||||
id="radialGradient1343"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.521415e-2,1.026125,-0.978137,2.404729e-2,38.83024,-3.575704)"
|
||||
cx="24.764277"
|
||||
cy="16.361967"
|
||||
fx="24.764277"
|
||||
fy="16.361967"
|
||||
r="27.500000" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1364"
|
||||
id="linearGradient1346"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="10.018247"
|
||||
y1="8.6306763"
|
||||
x2="63.487556"
|
||||
y2="63.660282" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2814"
|
||||
id="radialGradient2812"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.142398e-2,1.098850,-1.843995,1.878760e-2,52.15051,-5.667446)"
|
||||
cx="18.387238"
|
||||
cy="14.046815"
|
||||
fx="18.387238"
|
||||
fy="14.046815"
|
||||
r="27.500000" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1364"
|
||||
id="linearGradient2832"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-2.841000e-3,-2.841000e-3)"
|
||||
x1="10.018247"
|
||||
y1="8.6306763"
|
||||
x2="63.487556"
|
||||
y2="63.660282" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2842"
|
||||
id="linearGradient2848"
|
||||
x1="-0.56685609"
|
||||
y1="22.651009"
|
||||
x2="-0.33713850"
|
||||
y2="23.858734"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2842"
|
||||
id="linearGradient2864"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-0.82287467"
|
||||
y1="22.444542"
|
||||
x2="-0.33713850"
|
||||
y2="23.858734" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="8.2031250"
|
||||
inkscape:cx="32.000000"
|
||||
inkscape:cy="32.000000"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:grid-points="true"
|
||||
inkscape:window-width="1156"
|
||||
inkscape:window-height="693"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
showguides="false" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Green Unknown</dc:title>
|
||||
<dc:date>2005-11-01</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jean-Victor Balin</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:description>jean.victor.balin@gmail.com</dc:description>
|
||||
<cc:license
|
||||
rdf:resource="http://web.resource.org/cc/PublicDomain" />
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>icon</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://web.resource.org/cc/PublicDomain">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g1354">
|
||||
<path
|
||||
id="path1373"
|
||||
d="M 32.000000,8.6306766 C 19.113097,8.6306766 8.6306766,19.113097 8.6306766,32.000000 C 8.6306766,44.886903 19.113097,55.369323 32.000000,55.369323 C 44.886903,55.369323 55.369323,44.886903 55.369323,32.000000 C 55.369323,19.113097 44.886903,8.6306766 32.000000,8.6306766 z "
|
||||
style="fill:url(#linearGradient1346);fill-opacity:1.0000000;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="path1339"
|
||||
d="M 54.500005,32.000000 C 54.500005,44.420003 44.420003,54.500005 32.000000,54.500005 C 19.579997,54.500005 9.4999950,44.420003 9.4999950,32.000000 C 9.4999950,19.579997 19.579997,9.4999950 32.000000,9.4999950 C 44.420003,9.4999950 54.500005,19.579997 54.500005,32.000000 z "
|
||||
style="fill:url(#radialGradient1343);fill-opacity:1.0000000;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="path1341"
|
||||
d="M 32.016991,9.1562500 C 22.574792,9.1562500 14.505423,14.865048 11.062500,22.968750 C 16.006322,25.801817 21.393258,27.855853 27.181339,27.593750 C 32.755311,27.279922 37.553510,23.530916 43.236968,23.812500 C 47.451058,23.716455 52.244330,25.294372 54.488550,29.000000 C 53.142630,17.846718 43.657640,9.1562500 32.016991,9.1562500 z "
|
||||
style="fill:url(#radialGradient2812);fill-opacity:1.0000000;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="path2827"
|
||||
d="M 32.000000,8.6250000 C 19.113098,8.6250000 8.6250000,19.113097 8.6250000,32.000000 C 8.6250000,44.886904 19.113097,55.375000 32.000000,55.375000 C 44.886904,55.375000 55.375000,44.886903 55.375000,32.000000 C 55.375000,19.113098 44.886903,8.6250000 32.000000,8.6250000 z M 32.000000,9.5000000 C 44.420004,9.4999998 54.500000,19.579997 54.500000,32.000000 C 54.499998,44.420004 44.420003,54.500000 32.000000,54.500000 C 19.579998,54.499998 9.5000000,44.420003 9.5000000,32.000000 C 9.5000000,19.579998 19.579997,9.5000000 32.000000,9.5000000 z "
|
||||
style="fill:url(#linearGradient2832);fill-opacity:1.0000000;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="text1353"
|
||||
d="M 32.556888,39.006317 C 32.692760,35.835967 33.100380,35.066018 35.908404,32.892064 C 39.395790,30.219911 39.803410,29.902873 40.120445,29.631129 C 41.705621,28.272407 42.611437,26.189029 42.611437,24.015074 C 42.611437,19.078386 38.625844,15.953318 32.285143,15.953318 C 26.306768,15.953318 22.094721,18.851931 22.094721,23.018677 C 22.094721,25.464376 23.906354,27.230718 26.397344,27.230718 C 28.707171,27.230718 30.292350,25.736121 30.292350,23.607457 C 30.292350,22.384608 29.794150,21.388209 28.843045,20.663558 C 28.027812,20.029488 27.982521,19.984196 27.982521,19.667161 C 27.982521,19.033091 28.978919,18.534892 30.382931,18.534892 C 33.100374,18.534892 34.640263,20.346525 34.640263,23.516876 C 34.640263,25.373795 33.960900,27.683628 32.828632,29.721710 C 30.337643,34.160201 29.975314,35.066023 29.975314,37.104105 C 29.975314,37.557012 30.020605,38.281665 30.111187,39.006317 L 32.556888,39.006317 M 31.424619,41.497309 C 29.069501,41.497309 27.167287,43.399523 27.167287,45.754641 C 27.167287,48.064467 29.069501,50.011973 31.379328,50.011973 C 33.779736,50.011973 35.681951,48.109758 35.681951,45.754641 C 35.681951,43.399523 33.779736,41.497309 31.424619,41.497309"
|
||||
style="font-size:45.290764px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient1363);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Century Schoolbook L" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 14 KiB |
1568
src/icons/laptop.svg
Normal file
1568
src/icons/laptop.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 289 KiB |
256
src/icons/wpa_gui.svg
Normal file
256
src/icons/wpa_gui.svg
Normal file
|
|
@ -0,0 +1,256 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
width="128"
|
||||
height="128"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.46"
|
||||
sodipodi:docname="wpa_gui.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<metadata
|
||||
id="metadata47">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="771"
|
||||
inkscape:window-width="640"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.2421875"
|
||||
inkscape:cx="64"
|
||||
inkscape:cy="64"
|
||||
inkscape:window-x="634"
|
||||
inkscape:window-y="0"
|
||||
inkscape:current-layer="svg2" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 64 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="128 : 64 : 1"
|
||||
inkscape:persp3d-origin="64 : 42.666667 : 1"
|
||||
id="perspective49" />
|
||||
<linearGradient
|
||||
id="linearGradient39133">
|
||||
<stop
|
||||
id="stop39135"
|
||||
style="stop-color:#252525;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop39137"
|
||||
style="stop-color:#515151;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop39139"
|
||||
style="stop-color:#878787;stop-opacity:1"
|
||||
offset="0.28677997" />
|
||||
<stop
|
||||
id="stop39141"
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0.92151743" />
|
||||
<stop
|
||||
id="stop39143"
|
||||
style="stop-color:#ffffff;stop-opacity:0.73786408"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient39119">
|
||||
<stop
|
||||
id="stop39121"
|
||||
style="stop-color:#ffffff;stop-opacity:0.82905984"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop39123"
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient39106">
|
||||
<stop
|
||||
id="stop39108"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop39110"
|
||||
style="stop-color:#a8a8a8;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient39094">
|
||||
<stop
|
||||
id="stop39096"
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop39098"
|
||||
style="stop-color:#333333;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient39062">
|
||||
<stop
|
||||
id="stop39064"
|
||||
style="stop-color:#252525;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop39086"
|
||||
style="stop-color:#515151;stop-opacity:1"
|
||||
offset="0.21101321" />
|
||||
<stop
|
||||
id="stop39088"
|
||||
style="stop-color:#878787;stop-opacity:1"
|
||||
offset="0.75" />
|
||||
<stop
|
||||
id="stop39090"
|
||||
style="stop-color:#6c6c6c;stop-opacity:1"
|
||||
offset="0.875" />
|
||||
<stop
|
||||
id="stop39066"
|
||||
style="stop-color:#1e1e1e;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="4"
|
||||
y1="40"
|
||||
x2="124"
|
||||
y2="60"
|
||||
id="linearGradient39068"
|
||||
xlink:href="#linearGradient39062"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
cx="100.70589"
|
||||
cy="96"
|
||||
r="60"
|
||||
fx="158.07428"
|
||||
fy="95.718063"
|
||||
id="radialGradient39100"
|
||||
xlink:href="#linearGradient39094"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.7837903e-8,-1,0.99999999,-2.1864248e-6,-32.000004,164.7061)" />
|
||||
<radialGradient
|
||||
cx="100.44444"
|
||||
cy="34.363636"
|
||||
r="32"
|
||||
fx="83.18"
|
||||
fy="34.228985"
|
||||
id="radialGradient39104"
|
||||
xlink:href="#linearGradient39106"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(3.1472435e-6,1.0227273,-0.87499999,-9.5061964e-8,94.067865,-4.7272712)" />
|
||||
<radialGradient
|
||||
cx="75.999977"
|
||||
cy="-2.7730541"
|
||||
r="48"
|
||||
fx="55.266491"
|
||||
fy="-2.5338216"
|
||||
id="radialGradient39125"
|
||||
xlink:href="#linearGradient39119"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0,0.83333324,-1.6666667,2.518705e-6,59.378243,-35.333302)" />
|
||||
<radialGradient
|
||||
cx="64.066589"
|
||||
cy="63.713329"
|
||||
r="60"
|
||||
fx="64.066589"
|
||||
fy="63.713329"
|
||||
id="radialGradient39131"
|
||||
xlink:href="#linearGradient39133"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.1333333,5.1768857e-8,5.2556881e-6,1.1666667,-8.6091298,-10.332226)" />
|
||||
<filter
|
||||
id="filter39153">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur39155"
|
||||
stdDeviation="2.28"
|
||||
inkscape:collect="always" />
|
||||
</filter>
|
||||
<filter
|
||||
id="filter39159">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.68"
|
||||
id="feGaussianBlur39161" />
|
||||
</filter>
|
||||
</defs>
|
||||
<g
|
||||
id="layer1"
|
||||
style="display:inline">
|
||||
<path
|
||||
d="M 29,4 C 15.147058,4 4,15.14706 4,29 l 0,70 c 0,13.85294 11.147058,25 25,25 l 70,0 c 13.85294,0 25,-11.14706 25,-25 l 0,-70 C 124,15.14706 112.85294,4 99,4 L 29,4 z"
|
||||
id="path39151"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter39153)" />
|
||||
<path
|
||||
d="M 29,4 C 15.147058,4 4,15.14706 4,29 l 0,70 c 0,13.85294 11.147058,25 25,25 l 70,0 c 13.85294,0 25,-11.14706 25,-25 l 0,-70 C 124,15.14706 112.85294,4 99,4 L 29,4 z"
|
||||
id="path39157"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter39159)" />
|
||||
<rect
|
||||
width="120"
|
||||
height="120"
|
||||
ry="25.00531"
|
||||
x="4"
|
||||
y="0"
|
||||
id="rect2573"
|
||||
style="opacity:1;fill:url(#radialGradient39100);fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="M 29,0 C 15.147058,0 4,11.14706 4,25 l 0,70 c 0,13.85294 11.147058,25 25,25 l 70,0 c 13.85294,0 25,-11.14706 25,-25 l 0,-70 C 124,11.14706 112.85294,0 99,0 L 29,0 z"
|
||||
id="path39127"
|
||||
style="opacity:0.20512821;fill:url(#radialGradient39131);fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="m 44,68 40,0 12,40 c -20,7.27273 -44,7.27273 -64,0 L 44,68 z"
|
||||
id="path39102"
|
||||
style="opacity:0.53418801;fill:url(#radialGradient39104);fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="M 25.339207,12 C 52,8 76,8 102.66079,12 107.83471,12 112,16.165286 112,21.339207 L 116,52 C 100,73.339207 28,73.339207 12,52 L 16,21.339207 C 16,16.165286 20.165286,12 25.339207,12 z"
|
||||
id="rect39116"
|
||||
style="opacity:0.92307691;fill:url(#radialGradient39125);fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="M 29,8 C 15.147058,8 4,19.14706 4,33 l 0,70 c 0,13.85294 11.147058,25 25,25 l 70,0 c 13.85294,0 25,-11.14706 25,-25 l 0,-70 C 124,19.14706 112.85294,8 99,8 L 29,8 z"
|
||||
id="path39147"
|
||||
style="opacity:0.20512821;fill:#000000;fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="M 29,0 C 15.147058,0 4,11.147058 4,25 l 0,70 c 0,13.85294 11.147058,25 25,25 l 70,0 c 13.85294,0 25,-11.14706 25,-25 l 0,-70 C 124,11.147058 112.85294,0 99,0 L 29,0 z m 0,4 70,0 c 11.70613,0 21,9.293869 21,21 l 0,70 c 0,11.70613 -9.29387,21 -21,21 l -70,0 C 17.293869,116 8,106.70613 8,95 L 8,25 C 8,13.293869 17.293869,4 29,4 z"
|
||||
id="rect39029"
|
||||
style="opacity:1;fill:url(#linearGradient39068);fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="M 66.35081,74.771345 A 36,36 0 1 1 54.34964,35.777782"
|
||||
transform="matrix(-0.16680323,0.53082142,-0.53082142,-0.16680323,103.31027,53.117897)"
|
||||
id="path3351"
|
||||
style="opacity:1;fill:none;stroke:#ffffff;stroke-width:21.56673813;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
d="m 36,56 a 4,4 0 1 1 -8,0 4,4 0 1 1 8,0 z"
|
||||
transform="matrix(1.4851301,0,0,1.4851301,16.475837,-23.948973)"
|
||||
id="path3353"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
d="M 66.35081,74.771345 A 36,36 0 1 1 54.34964,35.777782"
|
||||
transform="matrix(-0.35033273,1.1148712,-1.1148712,-0.35033273,146.5624,46.88078)"
|
||||
id="path2622"
|
||||
style="opacity:1;fill:none;stroke:#ffffff;stroke-width:10.26852894;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9 KiB |
9
src/icons_png.qrc
Normal file
9
src/icons_png.qrc
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<RCC>
|
||||
<qresource prefix="/icons" >
|
||||
<file alias="wpa_gui.png">icons/hicolor/16x16/apps/wpa_gui.png</file>
|
||||
<file alias="ap.png">icons/hicolor/32x32/apps/ap.png</file>
|
||||
<file alias="laptop.png">icons/hicolor/32x32/apps/laptop.png</file>
|
||||
<file alias="group.png">icons/hicolor/32x32/apps/group.png</file>
|
||||
<file alias="invitation.png">icons/hicolor/32x32/apps/invitation.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
1
src/lang/.gitignore
vendored
Normal file
1
src/lang/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
*.qm
|
||||
1262
src/lang/wpa_gui_de.ts
Normal file
1262
src/lang/wpa_gui_de.ts
Normal file
File diff suppressed because it is too large
Load diff
67
src/main.cpp
Normal file
67
src/main.cpp
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* wpa_gui - Application startup
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
#include <winsock.h>
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
#include <QApplication>
|
||||
#include <QtCore/QLibraryInfo>
|
||||
#include <QtCore/QTranslator>
|
||||
#include "wpagui.h"
|
||||
|
||||
WpaGuiApp::WpaGuiApp(int &argc, char **argv) :
|
||||
QApplication(argc, argv),
|
||||
argc(argc),
|
||||
argv(argv)
|
||||
{
|
||||
w = NULL;
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_SESSIONMANAGER) && QT_VERSION < 0x050000
|
||||
void WpaGuiApp::saveState(QSessionManager &manager)
|
||||
{
|
||||
QApplication::saveState(manager);
|
||||
w->saveState();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
WpaGuiApp app(argc, argv);
|
||||
QTranslator translator;
|
||||
QString locale;
|
||||
QString resourceDir;
|
||||
int ret;
|
||||
|
||||
locale = QLocale::system().name();
|
||||
resourceDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
|
||||
if (!translator.load("wpa_gui_" + locale, resourceDir))
|
||||
translator.load("wpa_gui_" + locale, "lang");
|
||||
app.installTranslator(&translator);
|
||||
|
||||
WpaGui w(&app);
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
WSADATA wsaData;
|
||||
if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
|
||||
/* printf("Could not find a usable WinSock.dll\n"); */
|
||||
return -1;
|
||||
}
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
app.w = &w;
|
||||
|
||||
ret = app.exec();
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
WSACleanup();
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
return ret;
|
||||
}
|
||||
853
src/networkconfig.cpp
Normal file
853
src/networkconfig.cpp
Normal file
|
|
@ -0,0 +1,853 @@
|
|||
/*
|
||||
* wpa_gui - NetworkConfig class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "networkconfig.h"
|
||||
#include "wpagui.h"
|
||||
|
||||
enum {
|
||||
AUTH_NONE_OPEN,
|
||||
AUTH_NONE_WEP,
|
||||
AUTH_NONE_WEP_SHARED,
|
||||
AUTH_IEEE8021X,
|
||||
AUTH_WPA_PSK,
|
||||
AUTH_WPA_EAP,
|
||||
AUTH_WPA2_PSK,
|
||||
AUTH_WPA2_EAP
|
||||
};
|
||||
|
||||
#define WPA_GUI_KEY_DATA "[key is configured]"
|
||||
|
||||
|
||||
NetworkConfig::NetworkConfig(QWidget *parent, const char *, bool,
|
||||
Qt::WindowFlags)
|
||||
: QDialog(parent)
|
||||
{
|
||||
setupUi(this);
|
||||
|
||||
encrSelect->setEnabled(false);
|
||||
connect(authSelect, SIGNAL(activated(int)), this,
|
||||
SLOT(authChanged(int)));
|
||||
connect(cancelButton, SIGNAL(clicked()), this, SLOT(close()));
|
||||
connect(addButton, SIGNAL(clicked()), this, SLOT(addNetwork()));
|
||||
connect(encrSelect, SIGNAL(activated(const QString &)), this,
|
||||
SLOT(encrChanged(const QString &)));
|
||||
connect(removeButton, SIGNAL(clicked()), this, SLOT(removeNetwork()));
|
||||
connect(eapSelect, SIGNAL(activated(int)), this,
|
||||
SLOT(eapChanged(int)));
|
||||
connect(useWpsButton, SIGNAL(clicked()), this, SLOT(useWps()));
|
||||
|
||||
wpagui = NULL;
|
||||
new_network = false;
|
||||
}
|
||||
|
||||
|
||||
NetworkConfig::~NetworkConfig()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::languageChange()
|
||||
{
|
||||
retranslateUi(this);
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::paramsFromScanResults(QTreeWidgetItem *sel)
|
||||
{
|
||||
new_network = true;
|
||||
|
||||
/* SSID BSSID frequency signal flags */
|
||||
setWindowTitle(sel->text(0));
|
||||
ssidEdit->setText(sel->text(0));
|
||||
|
||||
QString flags = sel->text(4);
|
||||
int auth, encr = 0;
|
||||
if (flags.indexOf("[WPA2-EAP") >= 0)
|
||||
auth = AUTH_WPA2_EAP;
|
||||
else if (flags.indexOf("[WPA-EAP") >= 0)
|
||||
auth = AUTH_WPA_EAP;
|
||||
else if (flags.indexOf("[WPA2-PSK") >= 0)
|
||||
auth = AUTH_WPA2_PSK;
|
||||
else if (flags.indexOf("[WPA-PSK") >= 0)
|
||||
auth = AUTH_WPA_PSK;
|
||||
else
|
||||
auth = AUTH_NONE_OPEN;
|
||||
|
||||
if (flags.indexOf("-CCMP") >= 0)
|
||||
encr = 1;
|
||||
else if (flags.indexOf("-TKIP") >= 0)
|
||||
encr = 0;
|
||||
else if (flags.indexOf("WEP") >= 0) {
|
||||
encr = 1;
|
||||
if (auth == AUTH_NONE_OPEN)
|
||||
auth = AUTH_NONE_WEP;
|
||||
} else
|
||||
encr = 0;
|
||||
|
||||
authSelect->setCurrentIndex(auth);
|
||||
authChanged(auth);
|
||||
encrSelect->setCurrentIndex(encr);
|
||||
|
||||
wepEnabled(auth == AUTH_NONE_WEP);
|
||||
|
||||
getEapCapa();
|
||||
|
||||
if (flags.indexOf("[WPS") >= 0)
|
||||
useWpsButton->setEnabled(true);
|
||||
bssid = sel->text(1);
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::authChanged(int sel)
|
||||
{
|
||||
encrSelect->setEnabled(sel != AUTH_NONE_OPEN && sel != AUTH_NONE_WEP &&
|
||||
sel != AUTH_NONE_WEP_SHARED);
|
||||
pskEdit->setEnabled(sel == AUTH_WPA_PSK || sel == AUTH_WPA2_PSK);
|
||||
bool eap = sel == AUTH_IEEE8021X || sel == AUTH_WPA_EAP ||
|
||||
sel == AUTH_WPA2_EAP;
|
||||
eapSelect->setEnabled(eap);
|
||||
identityEdit->setEnabled(eap);
|
||||
passwordEdit->setEnabled(eap);
|
||||
cacertEdit->setEnabled(eap);
|
||||
phase2Select->setEnabled(eap);
|
||||
if (eap)
|
||||
eapChanged(eapSelect->currentIndex());
|
||||
|
||||
while (encrSelect->count())
|
||||
encrSelect->removeItem(0);
|
||||
|
||||
if (sel == AUTH_NONE_OPEN || sel == AUTH_NONE_WEP ||
|
||||
sel == AUTH_NONE_WEP_SHARED || sel == AUTH_IEEE8021X) {
|
||||
encrSelect->addItem("None");
|
||||
encrSelect->addItem("WEP");
|
||||
encrSelect->setCurrentIndex(sel == AUTH_NONE_OPEN ? 0 : 1);
|
||||
} else {
|
||||
encrSelect->addItem("TKIP");
|
||||
encrSelect->addItem("CCMP");
|
||||
encrSelect->setCurrentIndex((sel == AUTH_WPA2_PSK ||
|
||||
sel == AUTH_WPA2_EAP) ? 1 : 0);
|
||||
}
|
||||
|
||||
wepEnabled(sel == AUTH_NONE_WEP || sel == AUTH_NONE_WEP_SHARED);
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::eapChanged(int sel)
|
||||
{
|
||||
QString prev_val = phase2Select->currentText();
|
||||
while (phase2Select->count())
|
||||
phase2Select->removeItem(0);
|
||||
|
||||
QStringList inner;
|
||||
inner << "PEAP" << "TTLS" << "FAST";
|
||||
if (!inner.contains(eapSelect->itemText(sel)))
|
||||
return;
|
||||
|
||||
phase2Select->addItem("[ any ]");
|
||||
|
||||
/* Add special cases based on outer method */
|
||||
if (eapSelect->currentText().compare("TTLS") == 0) {
|
||||
phase2Select->addItem("PAP");
|
||||
phase2Select->addItem("CHAP");
|
||||
phase2Select->addItem("MSCHAP");
|
||||
phase2Select->addItem("MSCHAPv2");
|
||||
} else if (eapSelect->currentText().compare("FAST") == 0)
|
||||
phase2Select->addItem("GTC(auth) + MSCHAPv2(prov)");
|
||||
|
||||
/* Add all enabled EAP methods that can be used in the tunnel */
|
||||
int i;
|
||||
QStringList allowed;
|
||||
allowed << "MSCHAPV2" << "MD5" << "GTC" << "TLS" << "OTP" << "SIM"
|
||||
<< "AKA";
|
||||
for (i = 0; i < eapSelect->count(); i++) {
|
||||
if (allowed.contains(eapSelect->itemText(i))) {
|
||||
phase2Select->addItem("EAP-" + eapSelect->itemText(i));
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < phase2Select->count(); i++) {
|
||||
if (phase2Select->itemText(i).compare(prev_val) == 0) {
|
||||
phase2Select->setCurrentIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::addNetwork()
|
||||
{
|
||||
char reply[10], cmd[256];
|
||||
size_t reply_len;
|
||||
int id;
|
||||
int psklen = pskEdit->text().length();
|
||||
int auth = authSelect->currentIndex();
|
||||
|
||||
if (auth == AUTH_WPA_PSK || auth == AUTH_WPA2_PSK) {
|
||||
if (psklen < 8 || psklen > 64) {
|
||||
QMessageBox::warning(
|
||||
this,
|
||||
tr("WPA Pre-Shared Key Error"),
|
||||
tr("WPA-PSK requires a passphrase of 8 to 63 "
|
||||
"characters\n"
|
||||
"or 64 hex digit PSK"));
|
||||
pskEdit->setFocus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (idstrEdit->isEnabled() && !idstrEdit->text().isEmpty()) {
|
||||
QRegExp rx("^(\\w|-)+$");
|
||||
if (rx.indexIn(idstrEdit->text()) < 0) {
|
||||
QMessageBox::warning(
|
||||
this, tr("Network ID Error"),
|
||||
tr("Network ID String contains non-word "
|
||||
"characters.\n"
|
||||
"It must be a simple string, "
|
||||
"without spaces, containing\n"
|
||||
"only characters in this range: "
|
||||
"[A-Za-z0-9_-]\n"));
|
||||
idstrEdit->setFocus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (wpagui == NULL)
|
||||
return;
|
||||
|
||||
memset(reply, 0, sizeof(reply));
|
||||
reply_len = sizeof(reply) - 1;
|
||||
|
||||
if (new_network) {
|
||||
wpagui->ctrlRequest("ADD_NETWORK", reply, &reply_len);
|
||||
if (reply[0] == 'F') {
|
||||
QMessageBox::warning(this, "wpa_gui",
|
||||
tr("Failed to add "
|
||||
"network to wpa_supplicant\n"
|
||||
"configuration."));
|
||||
return;
|
||||
}
|
||||
id = atoi(reply);
|
||||
} else
|
||||
id = edit_network_id;
|
||||
|
||||
setNetworkParam(id, "ssid", ssidEdit->text().toLocal8Bit().constData(),
|
||||
true);
|
||||
|
||||
const char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL;
|
||||
switch (auth) {
|
||||
case AUTH_NONE_OPEN:
|
||||
case AUTH_NONE_WEP:
|
||||
case AUTH_NONE_WEP_SHARED:
|
||||
key_mgmt = "NONE";
|
||||
break;
|
||||
case AUTH_IEEE8021X:
|
||||
key_mgmt = "IEEE8021X";
|
||||
break;
|
||||
case AUTH_WPA_PSK:
|
||||
key_mgmt = "WPA-PSK";
|
||||
proto = "WPA";
|
||||
break;
|
||||
case AUTH_WPA_EAP:
|
||||
key_mgmt = "WPA-EAP";
|
||||
proto = "WPA";
|
||||
break;
|
||||
case AUTH_WPA2_PSK:
|
||||
key_mgmt = "WPA-PSK";
|
||||
proto = "WPA2";
|
||||
break;
|
||||
case AUTH_WPA2_EAP:
|
||||
key_mgmt = "WPA-EAP";
|
||||
proto = "WPA2";
|
||||
break;
|
||||
}
|
||||
|
||||
if (auth == AUTH_NONE_WEP_SHARED)
|
||||
setNetworkParam(id, "auth_alg", "SHARED", false);
|
||||
else
|
||||
setNetworkParam(id, "auth_alg", "OPEN", false);
|
||||
|
||||
if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP ||
|
||||
auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) {
|
||||
int encr = encrSelect->currentIndex();
|
||||
if (encr == 0)
|
||||
pairwise = "TKIP";
|
||||
else
|
||||
pairwise = "CCMP";
|
||||
}
|
||||
|
||||
if (proto)
|
||||
setNetworkParam(id, "proto", proto, false);
|
||||
if (key_mgmt)
|
||||
setNetworkParam(id, "key_mgmt", key_mgmt, false);
|
||||
if (pairwise) {
|
||||
setNetworkParam(id, "pairwise", pairwise, false);
|
||||
setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false);
|
||||
}
|
||||
if (pskEdit->isEnabled() &&
|
||||
strcmp(pskEdit->text().toLocal8Bit().constData(),
|
||||
WPA_GUI_KEY_DATA) != 0)
|
||||
setNetworkParam(id, "psk",
|
||||
pskEdit->text().toLocal8Bit().constData(),
|
||||
psklen != 64);
|
||||
if (eapSelect->isEnabled()) {
|
||||
const char *eap =
|
||||
eapSelect->currentText().toLocal8Bit().constData();
|
||||
setNetworkParam(id, "eap", eap, false);
|
||||
if (strcmp(eap, "SIM") == 0 || strcmp(eap, "AKA") == 0)
|
||||
setNetworkParam(id, "pcsc", "", true);
|
||||
else
|
||||
setNetworkParam(id, "pcsc", "NULL", false);
|
||||
}
|
||||
if (phase2Select->isEnabled()) {
|
||||
QString eap = eapSelect->currentText();
|
||||
QString inner = phase2Select->currentText();
|
||||
char phase2[32];
|
||||
phase2[0] = '\0';
|
||||
if (eap.compare("PEAP") == 0) {
|
||||
if (inner.startsWith("EAP-"))
|
||||
snprintf(phase2, sizeof(phase2), "auth=%s",
|
||||
inner.right(inner.size() - 4).
|
||||
toLocal8Bit().constData());
|
||||
} else if (eap.compare("TTLS") == 0) {
|
||||
if (inner.startsWith("EAP-"))
|
||||
snprintf(phase2, sizeof(phase2), "autheap=%s",
|
||||
inner.right(inner.size() - 4).
|
||||
toLocal8Bit().constData());
|
||||
else
|
||||
snprintf(phase2, sizeof(phase2), "auth=%s",
|
||||
inner.toLocal8Bit().constData());
|
||||
} else if (eap.compare("FAST") == 0) {
|
||||
const char *provisioning = NULL;
|
||||
if (inner.startsWith("EAP-")) {
|
||||
snprintf(phase2, sizeof(phase2), "auth=%s",
|
||||
inner.right(inner.size() - 4).
|
||||
toLocal8Bit().constData());
|
||||
provisioning = "fast_provisioning=2";
|
||||
} else if (inner.compare("GTC(auth) + MSCHAPv2(prov)")
|
||||
== 0) {
|
||||
snprintf(phase2, sizeof(phase2),
|
||||
"auth=GTC auth=MSCHAPV2");
|
||||
provisioning = "fast_provisioning=1";
|
||||
} else
|
||||
provisioning = "fast_provisioning=3";
|
||||
if (provisioning) {
|
||||
char blob[32];
|
||||
setNetworkParam(id, "phase1", provisioning,
|
||||
true);
|
||||
snprintf(blob, sizeof(blob),
|
||||
"blob://fast-pac-%d", id);
|
||||
setNetworkParam(id, "pac_file", blob, true);
|
||||
}
|
||||
}
|
||||
if (phase2[0])
|
||||
setNetworkParam(id, "phase2", phase2, true);
|
||||
else
|
||||
setNetworkParam(id, "phase2", "NULL", false);
|
||||
} else
|
||||
setNetworkParam(id, "phase2", "NULL", false);
|
||||
if (identityEdit->isEnabled() && identityEdit->text().length() > 0)
|
||||
setNetworkParam(id, "identity",
|
||||
identityEdit->text().toLocal8Bit().constData(),
|
||||
true);
|
||||
else
|
||||
setNetworkParam(id, "identity", "NULL", false);
|
||||
if (passwordEdit->isEnabled() && passwordEdit->text().length() > 0 &&
|
||||
strcmp(passwordEdit->text().toLocal8Bit().constData(),
|
||||
WPA_GUI_KEY_DATA) != 0)
|
||||
setNetworkParam(id, "password",
|
||||
passwordEdit->text().toLocal8Bit().constData(),
|
||||
true);
|
||||
else if (passwordEdit->text().length() == 0)
|
||||
setNetworkParam(id, "password", "NULL", false);
|
||||
if (cacertEdit->isEnabled() && cacertEdit->text().length() > 0)
|
||||
setNetworkParam(id, "ca_cert",
|
||||
cacertEdit->text().toLocal8Bit().constData(),
|
||||
true);
|
||||
else
|
||||
setNetworkParam(id, "ca_cert", "NULL", false);
|
||||
writeWepKey(id, wep0Edit, 0);
|
||||
writeWepKey(id, wep1Edit, 1);
|
||||
writeWepKey(id, wep2Edit, 2);
|
||||
writeWepKey(id, wep3Edit, 3);
|
||||
|
||||
if (wep0Radio->isEnabled() && wep0Radio->isChecked())
|
||||
setNetworkParam(id, "wep_tx_keyidx", "0", false);
|
||||
else if (wep1Radio->isEnabled() && wep1Radio->isChecked())
|
||||
setNetworkParam(id, "wep_tx_keyidx", "1", false);
|
||||
else if (wep2Radio->isEnabled() && wep2Radio->isChecked())
|
||||
setNetworkParam(id, "wep_tx_keyidx", "2", false);
|
||||
else if (wep3Radio->isEnabled() && wep3Radio->isChecked())
|
||||
setNetworkParam(id, "wep_tx_keyidx", "3", false);
|
||||
|
||||
if (idstrEdit->isEnabled() && idstrEdit->text().length() > 0)
|
||||
setNetworkParam(id, "id_str",
|
||||
idstrEdit->text().toLocal8Bit().constData(),
|
||||
true);
|
||||
else
|
||||
setNetworkParam(id, "id_str", "NULL", false);
|
||||
|
||||
if (prioritySpinBox->isEnabled()) {
|
||||
QString prio;
|
||||
prio = prio.setNum(prioritySpinBox->value());
|
||||
setNetworkParam(id, "priority", prio.toLocal8Bit().constData(),
|
||||
false);
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %d", id);
|
||||
reply_len = sizeof(reply);
|
||||
wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
if (strncmp(reply, "OK", 2) != 0) {
|
||||
QMessageBox::warning(this, "wpa_gui",
|
||||
tr("Failed to enable "
|
||||
"network in wpa_supplicant\n"
|
||||
"configuration."));
|
||||
/* Network was added, so continue anyway */
|
||||
}
|
||||
wpagui->triggerUpdate();
|
||||
wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
|
||||
|
||||
close();
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::setWpaGui(WpaGui *_wpagui)
|
||||
{
|
||||
wpagui = _wpagui;
|
||||
}
|
||||
|
||||
|
||||
int NetworkConfig::setNetworkParam(int id, const char *field,
|
||||
const char *value, bool quote)
|
||||
{
|
||||
char reply[10], cmd[256];
|
||||
size_t reply_len;
|
||||
snprintf(cmd, sizeof(cmd), "SET_NETWORK %d %s %s%s%s",
|
||||
id, field, quote ? "\"" : "", value, quote ? "\"" : "");
|
||||
reply_len = sizeof(reply);
|
||||
wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
return strncmp(reply, "OK", 2) == 0 ? 0 : -1;
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::encrChanged(const QString &)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::wepEnabled(bool enabled)
|
||||
{
|
||||
wep0Edit->setEnabled(enabled);
|
||||
wep1Edit->setEnabled(enabled);
|
||||
wep2Edit->setEnabled(enabled);
|
||||
wep3Edit->setEnabled(enabled);
|
||||
wep0Radio->setEnabled(enabled);
|
||||
wep1Radio->setEnabled(enabled);
|
||||
wep2Radio->setEnabled(enabled);
|
||||
wep3Radio->setEnabled(enabled);
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::writeWepKey(int network_id, QLineEdit *edit, int id)
|
||||
{
|
||||
char buf[10];
|
||||
bool hex;
|
||||
const char *txt, *pos;
|
||||
size_t len;
|
||||
|
||||
if (!edit->isEnabled() || edit->text().isEmpty())
|
||||
return;
|
||||
|
||||
/*
|
||||
* Assume hex key if only hex characters are present and length matches
|
||||
* with 40, 104, or 128-bit key
|
||||
*/
|
||||
txt = edit->text().toLocal8Bit().constData();
|
||||
if (strcmp(txt, WPA_GUI_KEY_DATA) == 0)
|
||||
return;
|
||||
len = strlen(txt);
|
||||
if (len == 0)
|
||||
return;
|
||||
pos = txt;
|
||||
hex = true;
|
||||
while (*pos) {
|
||||
if (!((*pos >= '0' && *pos <= '9') ||
|
||||
(*pos >= 'a' && *pos <= 'f') ||
|
||||
(*pos >= 'A' && *pos <= 'F'))) {
|
||||
hex = false;
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
if (hex && len != 10 && len != 26 && len != 32)
|
||||
hex = false;
|
||||
snprintf(buf, sizeof(buf), "wep_key%d", id);
|
||||
setNetworkParam(network_id, buf, txt, !hex);
|
||||
}
|
||||
|
||||
|
||||
static int key_value_isset(const char *reply, size_t reply_len)
|
||||
{
|
||||
return reply_len > 0 && (reply_len < 4 || memcmp(reply, "FAIL", 4) != 0);
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::paramsFromConfig(int network_id)
|
||||
{
|
||||
int i, res;
|
||||
|
||||
edit_network_id = network_id;
|
||||
getEapCapa();
|
||||
|
||||
char reply[1024], cmd[256], *pos;
|
||||
size_t reply_len;
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 &&
|
||||
reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
ssidEdit->setText(reply + 1);
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d proto", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
int wpa = 0;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
|
||||
reply[reply_len] = '\0';
|
||||
if (strstr(reply, "RSN") || strstr(reply, "WPA2"))
|
||||
wpa = 2;
|
||||
else if (strstr(reply, "WPA"))
|
||||
wpa = 1;
|
||||
}
|
||||
|
||||
int auth = AUTH_NONE_OPEN, encr = 0;
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d key_mgmt", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
|
||||
reply[reply_len] = '\0';
|
||||
if (strstr(reply, "WPA-EAP"))
|
||||
auth = wpa & 2 ? AUTH_WPA2_EAP : AUTH_WPA_EAP;
|
||||
else if (strstr(reply, "WPA-PSK"))
|
||||
auth = wpa & 2 ? AUTH_WPA2_PSK : AUTH_WPA_PSK;
|
||||
else if (strstr(reply, "IEEE8021X")) {
|
||||
auth = AUTH_IEEE8021X;
|
||||
encr = 1;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d pairwise", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
|
||||
reply[reply_len] = '\0';
|
||||
if (strstr(reply, "CCMP") && auth != AUTH_NONE_OPEN &&
|
||||
auth != AUTH_NONE_WEP && auth != AUTH_NONE_WEP_SHARED)
|
||||
encr = 1;
|
||||
else if (strstr(reply, "TKIP"))
|
||||
encr = 0;
|
||||
else if (strstr(reply, "WEP"))
|
||||
encr = 1;
|
||||
else
|
||||
encr = 0;
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d psk", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
pskEdit->setText(reply + 1);
|
||||
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
|
||||
pskEdit->setText(WPA_GUI_KEY_DATA);
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d identity", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 &&
|
||||
reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
identityEdit->setText(reply + 1);
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d password", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
passwordEdit->setText(reply + 1);
|
||||
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
|
||||
passwordEdit->setText(WPA_GUI_KEY_DATA);
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ca_cert", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 &&
|
||||
reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
cacertEdit->setText(reply + 1);
|
||||
}
|
||||
|
||||
enum { NO_INNER, PEAP_INNER, TTLS_INNER, FAST_INNER } eap = NO_INNER;
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d eap", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 &&
|
||||
reply_len >= 1) {
|
||||
reply[reply_len] = '\0';
|
||||
for (i = 0; i < eapSelect->count(); i++) {
|
||||
if (eapSelect->itemText(i).compare(reply) == 0) {
|
||||
eapSelect->setCurrentIndex(i);
|
||||
if (strcmp(reply, "PEAP") == 0)
|
||||
eap = PEAP_INNER;
|
||||
else if (strcmp(reply, "TTLS") == 0)
|
||||
eap = TTLS_INNER;
|
||||
else if (strcmp(reply, "FAST") == 0)
|
||||
eap = FAST_INNER;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (eap != NO_INNER) {
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d phase2",
|
||||
network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 &&
|
||||
reply_len >= 1) {
|
||||
reply[reply_len] = '\0';
|
||||
eapChanged(eapSelect->currentIndex());
|
||||
} else
|
||||
eap = NO_INNER;
|
||||
}
|
||||
|
||||
char *val;
|
||||
val = reply + 1;
|
||||
while (*(val + 1))
|
||||
val++;
|
||||
if (*val == '"')
|
||||
*val = '\0';
|
||||
|
||||
switch (eap) {
|
||||
case PEAP_INNER:
|
||||
if (strncmp(reply, "\"auth=", 6))
|
||||
break;
|
||||
val = reply + 2;
|
||||
memcpy(val, "EAP-", 4);
|
||||
break;
|
||||
case TTLS_INNER:
|
||||
if (strncmp(reply, "\"autheap=", 9) == 0) {
|
||||
val = reply + 5;
|
||||
memcpy(val, "EAP-", 4);
|
||||
} else if (strncmp(reply, "\"auth=", 6) == 0)
|
||||
val = reply + 6;
|
||||
break;
|
||||
case FAST_INNER:
|
||||
if (strncmp(reply, "\"auth=", 6))
|
||||
break;
|
||||
if (strcmp(reply + 6, "GTC auth=MSCHAPV2") == 0) {
|
||||
val = (char *) "GTC(auth) + MSCHAPv2(prov)";
|
||||
break;
|
||||
}
|
||||
val = reply + 2;
|
||||
memcpy(val, "EAP-", 4);
|
||||
break;
|
||||
case NO_INNER:
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < phase2Select->count(); i++) {
|
||||
if (phase2Select->itemText(i).compare(val) == 0) {
|
||||
phase2Select->setCurrentIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
QLineEdit *wepEdit;
|
||||
switch (i) {
|
||||
default:
|
||||
case 0:
|
||||
wepEdit = wep0Edit;
|
||||
break;
|
||||
case 1:
|
||||
wepEdit = wep1Edit;
|
||||
break;
|
||||
case 2:
|
||||
wepEdit = wep2Edit;
|
||||
break;
|
||||
case 3:
|
||||
wepEdit = wep3Edit;
|
||||
break;
|
||||
}
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_key%d",
|
||||
network_id, i);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
if (auth == AUTH_NONE_OPEN || auth == AUTH_IEEE8021X) {
|
||||
if (auth == AUTH_NONE_OPEN)
|
||||
auth = AUTH_NONE_WEP;
|
||||
encr = 1;
|
||||
}
|
||||
|
||||
wepEdit->setText(reply + 1);
|
||||
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
|
||||
if (auth == AUTH_NONE_OPEN || auth == AUTH_IEEE8021X) {
|
||||
if (auth == AUTH_NONE_OPEN)
|
||||
auth = AUTH_NONE_WEP;
|
||||
encr = 1;
|
||||
}
|
||||
wepEdit->setText(WPA_GUI_KEY_DATA);
|
||||
}
|
||||
}
|
||||
|
||||
if (auth == AUTH_NONE_WEP) {
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d auth_alg",
|
||||
network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
|
||||
reply[reply_len] = '\0';
|
||||
if (strcmp(reply, "SHARED") == 0)
|
||||
auth = AUTH_NONE_WEP_SHARED;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_tx_keyidx", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1)
|
||||
{
|
||||
reply[reply_len] = '\0';
|
||||
switch (atoi(reply)) {
|
||||
case 0:
|
||||
wep0Radio->setChecked(true);
|
||||
break;
|
||||
case 1:
|
||||
wep1Radio->setChecked(true);
|
||||
break;
|
||||
case 2:
|
||||
wep2Radio->setChecked(true);
|
||||
break;
|
||||
case 3:
|
||||
wep3Radio->setChecked(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d id_str", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 &&
|
||||
reply_len >= 2 && reply[0] == '"') {
|
||||
reply[reply_len] = '\0';
|
||||
pos = strchr(reply + 1, '"');
|
||||
if (pos)
|
||||
*pos = '\0';
|
||||
idstrEdit->setText(reply + 1);
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d priority", network_id);
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1)
|
||||
{
|
||||
reply[reply_len] = '\0';
|
||||
prioritySpinBox->setValue(atoi(reply));
|
||||
}
|
||||
|
||||
authSelect->setCurrentIndex(auth);
|
||||
authChanged(auth);
|
||||
encrSelect->setCurrentIndex(encr);
|
||||
wepEnabled(auth == AUTH_NONE_WEP || auth == AUTH_NONE_WEP_SHARED);
|
||||
|
||||
removeButton->setEnabled(true);
|
||||
addButton->setText("Save");
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::removeNetwork()
|
||||
{
|
||||
char reply[10], cmd[256];
|
||||
size_t reply_len;
|
||||
|
||||
if (QMessageBox::information(
|
||||
this, "wpa_gui",
|
||||
tr("This will permanently remove the network\n"
|
||||
"from the configuration. Do you really want\n"
|
||||
"to remove this network?"),
|
||||
tr("Yes"), tr("No")) != 0)
|
||||
return;
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %d", edit_network_id);
|
||||
reply_len = sizeof(reply);
|
||||
wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
if (strncmp(reply, "OK", 2) != 0) {
|
||||
QMessageBox::warning(this, "wpa_gui",
|
||||
tr("Failed to remove network from "
|
||||
"wpa_supplicant\n"
|
||||
"configuration."));
|
||||
} else {
|
||||
wpagui->triggerUpdate();
|
||||
wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
|
||||
}
|
||||
|
||||
close();
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::newNetwork()
|
||||
{
|
||||
new_network = true;
|
||||
getEapCapa();
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::getEapCapa()
|
||||
{
|
||||
char reply[256];
|
||||
size_t reply_len;
|
||||
|
||||
if (wpagui == NULL)
|
||||
return;
|
||||
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest("GET_CAPABILITY eap", reply, &reply_len) < 0)
|
||||
return;
|
||||
reply[reply_len] = '\0';
|
||||
|
||||
QString res(reply);
|
||||
QStringList types = res.split(QChar(' '));
|
||||
eapSelect->insertItems(-1, types);
|
||||
}
|
||||
|
||||
|
||||
void NetworkConfig::useWps()
|
||||
{
|
||||
if (wpagui == NULL)
|
||||
return;
|
||||
wpagui->setBssFromScan(bssid);
|
||||
wpagui->wpsDialog();
|
||||
close();
|
||||
}
|
||||
55
src/networkconfig.h
Normal file
55
src/networkconfig.h
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* wpa_gui - NetworkConfig class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef NETWORKCONFIG_H
|
||||
#define NETWORKCONFIG_H
|
||||
|
||||
#include <QObject>
|
||||
#include "ui_networkconfig.h"
|
||||
|
||||
class WpaGui;
|
||||
|
||||
class NetworkConfig : public QDialog, public Ui::NetworkConfig
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
NetworkConfig(QWidget *parent = 0, const char *name = 0,
|
||||
bool modal = false, Qt::WindowFlags fl = 0);
|
||||
~NetworkConfig();
|
||||
|
||||
virtual void paramsFromScanResults(QTreeWidgetItem *sel);
|
||||
virtual void setWpaGui(WpaGui *_wpagui);
|
||||
virtual int setNetworkParam(int id, const char *field,
|
||||
const char *value, bool quote);
|
||||
virtual void paramsFromConfig(int network_id);
|
||||
virtual void newNetwork();
|
||||
|
||||
public slots:
|
||||
virtual void authChanged(int sel);
|
||||
virtual void addNetwork();
|
||||
virtual void encrChanged(const QString &sel);
|
||||
virtual void writeWepKey(int network_id, QLineEdit *edit, int id);
|
||||
virtual void removeNetwork();
|
||||
virtual void eapChanged(int sel);
|
||||
virtual void useWps();
|
||||
|
||||
protected slots:
|
||||
virtual void languageChange();
|
||||
|
||||
private:
|
||||
WpaGui *wpagui;
|
||||
int edit_network_id;
|
||||
bool new_network;
|
||||
QString bssid;
|
||||
|
||||
virtual void wepEnabled(bool enabled);
|
||||
virtual void getEapCapa();
|
||||
};
|
||||
|
||||
#endif /* NETWORKCONFIG_H */
|
||||
435
src/networkconfig.ui
Normal file
435
src/networkconfig.ui
Normal file
|
|
@ -0,0 +1,435 @@
|
|||
<ui version="4.0" >
|
||||
<class>NetworkConfig</class>
|
||||
<widget class="QDialog" name="NetworkConfig" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>410</width>
|
||||
<height>534</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>NetworkConfig</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="1" column="3" >
|
||||
<widget class="QPushButton" name="cancelButton" >
|
||||
<property name="text" >
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="4" >
|
||||
<widget class="QFrame" name="frame9" >
|
||||
<property name="frameShape" >
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow" >
|
||||
<enum>QFrame::Plain</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="ssidLabel" >
|
||||
<property name="text" >
|
||||
<string>SSID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QLineEdit" name="ssidEdit" >
|
||||
<property name="toolTip" >
|
||||
<string>Network name (Service Set IDentifier)</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="authLabel" >
|
||||
<property name="text" >
|
||||
<string>Authentication</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QComboBox" name="authSelect" >
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>Plaintext (open / no authentication)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>Static WEP (no authentication)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>Static WEP (Shared Key authentication)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>IEEE 802.1X</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>WPA-Personal (PSK)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>WPA-Enterprise (EAP)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>WPA2-Personal (PSK)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>WPA2-Enterprise (EAP)</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<widget class="QLabel" name="encrLabel" >
|
||||
<property name="text" >
|
||||
<string>Encryption</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" >
|
||||
<widget class="QComboBox" name="encrSelect" >
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>None</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>WEP</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>TKIP</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text" >
|
||||
<string>CCMP</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" >
|
||||
<widget class="QLabel" name="pskLabel" >
|
||||
<property name="text" >
|
||||
<string>PSK</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" >
|
||||
<widget class="QLineEdit" name="pskEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>WPA/WPA2 pre-shared key or passphrase</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string/>
|
||||
</property>
|
||||
<property name="echoMode" >
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" >
|
||||
<widget class="QLabel" name="eapLabel" >
|
||||
<property name="text" >
|
||||
<string>EAP method</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" >
|
||||
<widget class="QComboBox" name="eapSelect" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" >
|
||||
<widget class="QLabel" name="identityLabel" >
|
||||
<property name="text" >
|
||||
<string>Identity</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1" >
|
||||
<widget class="QLineEdit" name="identityEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>Username/Identity for EAP methods</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0" >
|
||||
<widget class="QLabel" name="passwordLabel" >
|
||||
<property name="text" >
|
||||
<string>Password</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1" >
|
||||
<widget class="QLineEdit" name="passwordEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>Password for EAP methods</string>
|
||||
</property>
|
||||
<property name="echoMode" >
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0" >
|
||||
<widget class="QLabel" name="cacertLabel" >
|
||||
<property name="text" >
|
||||
<string>CA certificate</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1" >
|
||||
<widget class="QLineEdit" name="cacertEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="2" >
|
||||
<widget class="QGroupBox" name="wepBox" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="title" >
|
||||
<string>WEP keys</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QRadioButton" name="wep0Radio" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>key 0</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QRadioButton" name="wep1Radio" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>key 1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" >
|
||||
<widget class="QRadioButton" name="wep3Radio" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>key 3</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<widget class="QRadioButton" name="wep2Radio" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>key 2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QLineEdit" name="wep0Edit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QLineEdit" name="wep1Edit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" >
|
||||
<widget class="QLineEdit" name="wep2Edit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" >
|
||||
<widget class="QLineEdit" name="wep3Edit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="2" >
|
||||
<widget class="QGroupBox" name="optionalSettingsBox" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="title" >
|
||||
<string>Optional Settings</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="1" >
|
||||
<widget class="QLineEdit" name="idstrEdit" >
|
||||
<property name="toolTip" >
|
||||
<string>Network Identification String</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3" >
|
||||
<widget class="QSpinBox" name="prioritySpinBox" >
|
||||
<property name="toolTip" >
|
||||
<string>Network Priority</string>
|
||||
</property>
|
||||
<property name="maximum" >
|
||||
<number>10000</number>
|
||||
</property>
|
||||
<property name="singleStep" >
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="idstrLabel" >
|
||||
<property name="text" >
|
||||
<string>IDString</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2" >
|
||||
<widget class="QLabel" name="priorityLabel" >
|
||||
<property name="text" >
|
||||
<string>Priority</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="phase2Label" >
|
||||
<property name="text" >
|
||||
<string>Inner auth</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QComboBox" name="phase2Select" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2" >
|
||||
<widget class="QPushButton" name="addButton" >
|
||||
<property name="text" >
|
||||
<string>Add</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3" >
|
||||
<widget class="QPushButton" name="removeButton" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>Remove</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QPushButton" name="useWpsButton" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>WPS</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11" />
|
||||
<pixmapfunction></pixmapfunction>
|
||||
<tabstops>
|
||||
<tabstop>ssidEdit</tabstop>
|
||||
<tabstop>authSelect</tabstop>
|
||||
<tabstop>encrSelect</tabstop>
|
||||
<tabstop>pskEdit</tabstop>
|
||||
<tabstop>eapSelect</tabstop>
|
||||
<tabstop>identityEdit</tabstop>
|
||||
<tabstop>passwordEdit</tabstop>
|
||||
<tabstop>cacertEdit</tabstop>
|
||||
<tabstop>wep0Radio</tabstop>
|
||||
<tabstop>wep0Edit</tabstop>
|
||||
<tabstop>wep1Radio</tabstop>
|
||||
<tabstop>wep1Edit</tabstop>
|
||||
<tabstop>wep2Radio</tabstop>
|
||||
<tabstop>wep2Edit</tabstop>
|
||||
<tabstop>wep3Radio</tabstop>
|
||||
<tabstop>wep3Edit</tabstop>
|
||||
<tabstop>idstrEdit</tabstop>
|
||||
<tabstop>prioritySpinBox</tabstop>
|
||||
<tabstop>phase2Select</tabstop>
|
||||
<tabstop>addButton</tabstop>
|
||||
<tabstop>removeButton</tabstop>
|
||||
<tabstop>cancelButton</tabstop>
|
||||
</tabstops>
|
||||
<includes>
|
||||
<include location="global" >qtreewidget.h</include>
|
||||
</includes>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
1883
src/peers.cpp
Normal file
1883
src/peers.cpp
Normal file
File diff suppressed because it is too large
Load diff
90
src/peers.h
Normal file
90
src/peers.h
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* wpa_gui - Peers class
|
||||
* Copyright (c) 2009-2010, Atheros Communications
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef PEERS_H
|
||||
#define PEERS_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QStandardItemModel>
|
||||
#include "wpamsg.h"
|
||||
#include "ui_peers.h"
|
||||
|
||||
class WpaGui;
|
||||
|
||||
class Peers : public QDialog, public Ui::Peers
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Peers(QWidget *parent = 0, const char *name = 0,
|
||||
bool modal = false, Qt::WindowFlags fl = 0);
|
||||
~Peers();
|
||||
void setWpaGui(WpaGui *_wpagui);
|
||||
void event_notify(WpaMsg msg);
|
||||
|
||||
public slots:
|
||||
virtual void context_menu(const QPoint &pos);
|
||||
virtual void enter_pin();
|
||||
virtual void connect_pbc();
|
||||
virtual void learn_ap_config();
|
||||
virtual void ctx_refresh();
|
||||
virtual void ctx_p2p_start();
|
||||
virtual void ctx_p2p_stop();
|
||||
virtual void ctx_p2p_listen();
|
||||
virtual void ctx_p2p_start_group();
|
||||
virtual void ctx_p2p_remove_group();
|
||||
virtual void ctx_p2p_connect();
|
||||
virtual void ctx_p2p_req_pin();
|
||||
virtual void ctx_p2p_show_pin();
|
||||
virtual void ctx_p2p_display_pin();
|
||||
virtual void ctx_p2p_display_pin_pd();
|
||||
virtual void ctx_p2p_enter_pin();
|
||||
virtual void properties();
|
||||
virtual void ctx_hide_ap();
|
||||
virtual void ctx_show_ap();
|
||||
virtual void ctx_p2p_show_passphrase();
|
||||
virtual void ctx_p2p_start_persistent();
|
||||
virtual void ctx_p2p_invite();
|
||||
virtual void ctx_p2p_delete();
|
||||
|
||||
protected slots:
|
||||
virtual void languageChange();
|
||||
virtual void closeEvent(QCloseEvent *event);
|
||||
|
||||
private:
|
||||
void add_station(QString info);
|
||||
void add_stations();
|
||||
void add_single_station(const char *addr);
|
||||
bool add_bss(const char *cmd);
|
||||
void remove_bss(int id);
|
||||
void add_scan_results();
|
||||
void add_persistent(int id, const char *ssid, const char *bssid);
|
||||
void add_persistent_groups();
|
||||
void update_peers();
|
||||
QStandardItem * find_addr(QString addr);
|
||||
QStandardItem * find_addr_type(QString addr, int type);
|
||||
void add_p2p_group_client(QStandardItem *parent, QString params);
|
||||
QStandardItem * find_uuid(QString uuid);
|
||||
void done(int r);
|
||||
void remove_enrollee_uuid(QString uuid);
|
||||
QString ItemType(int type);
|
||||
void enable_persistent(int id);
|
||||
|
||||
WpaGui *wpagui;
|
||||
QStandardItemModel model;
|
||||
QIcon *default_icon;
|
||||
QIcon *ap_icon;
|
||||
QIcon *laptop_icon;
|
||||
QIcon *group_icon;
|
||||
QIcon *invitation_icon;
|
||||
QStandardItem *ctx_item;
|
||||
|
||||
bool hide_ap;
|
||||
};
|
||||
|
||||
#endif /* PEERS_H */
|
||||
40
src/peers.ui
Normal file
40
src/peers.ui
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Peers</class>
|
||||
<widget class="QDialog" name="Peers">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Peers</string>
|
||||
</property>
|
||||
<layout class="QGridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QListView" name="peers">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="mouseTracking">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="editTriggers">
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
</property>
|
||||
<property name="viewMode">
|
||||
<enum>QListView::IconMode</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
141
src/scanresults.cpp
Normal file
141
src/scanresults.cpp
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* wpa_gui - ScanResults class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#include "scanresults.h"
|
||||
#include "signalbar.h"
|
||||
#include "wpagui.h"
|
||||
#include "networkconfig.h"
|
||||
#include "scanresultsitem.h"
|
||||
|
||||
|
||||
ScanResults::ScanResults(QWidget *parent, const char *, bool, Qt::WindowFlags)
|
||||
: QDialog(parent)
|
||||
{
|
||||
setupUi(this);
|
||||
|
||||
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
|
||||
connect(scanButton, SIGNAL(clicked()), this, SLOT(scanRequest()));
|
||||
connect(scanResultsWidget,
|
||||
SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this,
|
||||
SLOT(bssSelected(QTreeWidgetItem *)));
|
||||
|
||||
wpagui = NULL;
|
||||
scanResultsWidget->setItemsExpandable(false);
|
||||
scanResultsWidget->setRootIsDecorated(false);
|
||||
scanResultsWidget->setItemDelegate(new SignalBar(scanResultsWidget));
|
||||
}
|
||||
|
||||
|
||||
ScanResults::~ScanResults()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ScanResults::languageChange()
|
||||
{
|
||||
retranslateUi(this);
|
||||
}
|
||||
|
||||
|
||||
void ScanResults::setWpaGui(WpaGui *_wpagui)
|
||||
{
|
||||
wpagui = _wpagui;
|
||||
updateResults();
|
||||
}
|
||||
|
||||
|
||||
void ScanResults::updateResults()
|
||||
{
|
||||
char reply[2048];
|
||||
size_t reply_len;
|
||||
int index;
|
||||
char cmd[20];
|
||||
|
||||
scanResultsWidget->clear();
|
||||
|
||||
index = 0;
|
||||
while (wpagui) {
|
||||
snprintf(cmd, sizeof(cmd), "BSS %d", index++);
|
||||
if (index > 1000)
|
||||
break;
|
||||
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0)
|
||||
break;
|
||||
reply[reply_len] = '\0';
|
||||
|
||||
QString bss(reply);
|
||||
if (bss.isEmpty() || bss.startsWith("FAIL"))
|
||||
break;
|
||||
|
||||
QString ssid, bssid, freq, signal, flags;
|
||||
|
||||
QStringList lines = bss.split(QRegExp("\\n"));
|
||||
for (QStringList::Iterator it = lines.begin();
|
||||
it != lines.end(); it++) {
|
||||
int pos = (*it).indexOf('=') + 1;
|
||||
if (pos < 1)
|
||||
continue;
|
||||
|
||||
if ((*it).startsWith("bssid="))
|
||||
bssid = (*it).mid(pos);
|
||||
else if ((*it).startsWith("freq="))
|
||||
freq = (*it).mid(pos);
|
||||
else if ((*it).startsWith("level="))
|
||||
signal = (*it).mid(pos);
|
||||
else if ((*it).startsWith("flags="))
|
||||
flags = (*it).mid(pos);
|
||||
else if ((*it).startsWith("ssid="))
|
||||
ssid = (*it).mid(pos);
|
||||
}
|
||||
|
||||
ScanResultsItem *item = new ScanResultsItem(scanResultsWidget);
|
||||
if (item) {
|
||||
item->setText(0, ssid);
|
||||
item->setText(1, bssid);
|
||||
item->setText(2, freq);
|
||||
item->setText(3, signal);
|
||||
item->setText(4, flags);
|
||||
}
|
||||
|
||||
if (bssid.isEmpty())
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ScanResults::scanRequest()
|
||||
{
|
||||
char reply[10];
|
||||
size_t reply_len = sizeof(reply);
|
||||
|
||||
if (wpagui == NULL)
|
||||
return;
|
||||
|
||||
wpagui->ctrlRequest("SCAN", reply, &reply_len);
|
||||
}
|
||||
|
||||
|
||||
void ScanResults::getResults()
|
||||
{
|
||||
updateResults();
|
||||
}
|
||||
|
||||
|
||||
void ScanResults::bssSelected(QTreeWidgetItem *sel)
|
||||
{
|
||||
NetworkConfig *nc = new NetworkConfig();
|
||||
if (nc == NULL)
|
||||
return;
|
||||
nc->setWpaGui(wpagui);
|
||||
nc->paramsFromScanResults(sel);
|
||||
nc->show();
|
||||
nc->exec();
|
||||
}
|
||||
40
src/scanresults.h
Normal file
40
src/scanresults.h
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* wpa_gui - ScanResults class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef SCANRESULTS_H
|
||||
#define SCANRESULTS_H
|
||||
|
||||
#include <QObject>
|
||||
#include "ui_scanresults.h"
|
||||
|
||||
class WpaGui;
|
||||
|
||||
class ScanResults : public QDialog, public Ui::ScanResults
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ScanResults(QWidget *parent = 0, const char *name = 0,
|
||||
bool modal = false, Qt::WindowFlags fl = 0);
|
||||
~ScanResults();
|
||||
|
||||
public slots:
|
||||
virtual void setWpaGui(WpaGui *_wpagui);
|
||||
virtual void updateResults();
|
||||
virtual void scanRequest();
|
||||
virtual void getResults();
|
||||
virtual void bssSelected(QTreeWidgetItem *sel);
|
||||
|
||||
protected slots:
|
||||
virtual void languageChange();
|
||||
|
||||
private:
|
||||
WpaGui *wpagui;
|
||||
};
|
||||
|
||||
#endif /* SCANRESULTS_H */
|
||||
94
src/scanresults.ui
Normal file
94
src/scanresults.ui
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
<ui version="4.0" >
|
||||
<class>ScanResults</class>
|
||||
<widget class="QDialog" name="ScanResults" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>452</width>
|
||||
<height>244</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>Scan results</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" >
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="scanResultsWidget" >
|
||||
<property name="editTriggers" >
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
</property>
|
||||
<property name="uniformRowHeights" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sortingEnabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="columnCount" >
|
||||
<number>5</number>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text" >
|
||||
<string>SSID</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text" >
|
||||
<string>BSSID</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text" >
|
||||
<string>frequency</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text" >
|
||||
<string>signal</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text" >
|
||||
<string>flags</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" >
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="scanButton" >
|
||||
<property name="text" >
|
||||
<string>Scan</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="closeButton" >
|
||||
<property name="text" >
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11" />
|
||||
<pixmapfunction></pixmapfunction>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
18
src/scanresultsitem.cpp
Normal file
18
src/scanresultsitem.cpp
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* wpa_gui - ScanResultsItem class
|
||||
* Copyright (c) 2015, Adrian Nowicki <adinowicki@gmail.com>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "scanresultsitem.h"
|
||||
|
||||
bool ScanResultsItem::operator< (const QTreeWidgetItem &other) const
|
||||
{
|
||||
int sortCol = treeWidget()->sortColumn();
|
||||
if (sortCol == 2 || sortCol == 3) {
|
||||
return text(sortCol).toInt() < other.text(sortCol).toInt();
|
||||
}
|
||||
return text(sortCol) < other.text(sortCol);
|
||||
}
|
||||
21
src/scanresultsitem.h
Normal file
21
src/scanresultsitem.h
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* wpa_gui - ScanResultsItem class
|
||||
* Copyright (c) 2015, Adrian Nowicki <adinowicki@gmail.com>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef SCANRESULTSITEM_H
|
||||
#define SCANRESULTSITEM_H
|
||||
|
||||
#include <QTreeWidgetItem>
|
||||
|
||||
class ScanResultsItem : public QTreeWidgetItem
|
||||
{
|
||||
public:
|
||||
ScanResultsItem(QTreeWidget *tree) : QTreeWidgetItem(tree) {}
|
||||
bool operator< (const QTreeWidgetItem &other) const;
|
||||
};
|
||||
|
||||
#endif /* SCANRESULTSITEM_H */
|
||||
58
src/signalbar.cpp
Normal file
58
src/signalbar.cpp
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* wpa_gui - SignalBar class
|
||||
* Copyright (c) 2011, Kel Modderman <kel@otaku42.de>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <qapplication.h>
|
||||
|
||||
#include "signalbar.h"
|
||||
|
||||
|
||||
SignalBar::SignalBar(QObject *parent)
|
||||
: QStyledItemDelegate(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SignalBar::~SignalBar()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SignalBar::paint(QPainter *painter,
|
||||
const QStyleOptionViewItem &option,
|
||||
const QModelIndex &index) const
|
||||
{
|
||||
QStyleOptionProgressBar opts;
|
||||
int signal;
|
||||
|
||||
if (index.column() != 3) {
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
return;
|
||||
}
|
||||
|
||||
if (index.data().toInt() > 0)
|
||||
signal = 0 - (256 - index.data().toInt());
|
||||
else
|
||||
signal = index.data().toInt();
|
||||
|
||||
opts.minimum = -95;
|
||||
opts.maximum = -35;
|
||||
if (signal < opts.minimum)
|
||||
opts.progress = opts.minimum;
|
||||
else if (signal > opts.maximum)
|
||||
opts.progress = opts.maximum;
|
||||
else
|
||||
opts.progress = signal;
|
||||
|
||||
opts.text = QString::number(signal) + " dBm";
|
||||
opts.textVisible = true;
|
||||
opts.rect = option.rect;
|
||||
|
||||
QApplication::style()->drawControl(QStyle::CE_ProgressBar,
|
||||
&opts, painter);
|
||||
}
|
||||
28
src/signalbar.h
Normal file
28
src/signalbar.h
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* wpa_gui - SignalBar class
|
||||
* Copyright (c) 2011, Kel Modderman <kel@otaku42.de>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef SIGNALBAR_H
|
||||
#define SIGNALBAR_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QStyledItemDelegate>
|
||||
|
||||
class SignalBar : public QStyledItemDelegate
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SignalBar(QObject *parent = 0);
|
||||
~SignalBar();
|
||||
|
||||
virtual void paint(QPainter *painter,
|
||||
const QStyleOptionViewItem &option,
|
||||
const QModelIndex &index) const ;
|
||||
};
|
||||
|
||||
#endif /* SIGNALBAR_H */
|
||||
31
src/stringquery.cpp
Normal file
31
src/stringquery.cpp
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* wpa_gui - StringQuery class
|
||||
* Copyright (c) 2009, Atheros Communications
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <QLabel>
|
||||
|
||||
#include "stringquery.h"
|
||||
|
||||
|
||||
StringQuery::StringQuery(QString label)
|
||||
{
|
||||
edit = new QLineEdit;
|
||||
edit->setFocus();
|
||||
QGridLayout *layout = new QGridLayout;
|
||||
layout->addWidget(new QLabel(label), 0, 0);
|
||||
layout->addWidget(edit, 0, 1);
|
||||
setLayout(layout);
|
||||
|
||||
connect(edit, SIGNAL(returnPressed()), this, SLOT(accept()));
|
||||
}
|
||||
|
||||
|
||||
QString StringQuery::get_string()
|
||||
{
|
||||
return edit->text();
|
||||
}
|
||||
28
src/stringquery.h
Normal file
28
src/stringquery.h
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* wpa_gui - StringQuery class
|
||||
* Copyright (c) 2009, Atheros Communications
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef STRINGQUERY_H
|
||||
#define STRINGQUERY_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QLineEdit>
|
||||
#include <QGridLayout>
|
||||
|
||||
class StringQuery : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
StringQuery(QString label);
|
||||
QString get_string();
|
||||
|
||||
private:
|
||||
QLineEdit *edit;
|
||||
};
|
||||
|
||||
#endif /* STRINGQUERY_H */
|
||||
94
src/userdatarequest.cpp
Normal file
94
src/userdatarequest.cpp
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* wpa_gui - UserDataRequest class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "userdatarequest.h"
|
||||
#include "wpagui.h"
|
||||
#include "common/wpa_ctrl.h"
|
||||
|
||||
|
||||
UserDataRequest::UserDataRequest(QWidget *parent, const char *, bool,
|
||||
Qt::WindowFlags)
|
||||
: QDialog(parent)
|
||||
{
|
||||
setupUi(this);
|
||||
|
||||
connect(buttonOk, SIGNAL(clicked()), this, SLOT(sendReply()));
|
||||
connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
|
||||
connect(queryEdit, SIGNAL(returnPressed()), this, SLOT(sendReply()));
|
||||
}
|
||||
|
||||
|
||||
UserDataRequest::~UserDataRequest()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void UserDataRequest::languageChange()
|
||||
{
|
||||
retranslateUi(this);
|
||||
}
|
||||
|
||||
|
||||
int UserDataRequest::setParams(WpaGui *_wpagui, const char *reqMsg)
|
||||
{
|
||||
char *tmp, *pos, *pos2;
|
||||
wpagui = _wpagui;
|
||||
tmp = strdup(reqMsg);
|
||||
if (tmp == NULL)
|
||||
return -1;
|
||||
pos = strchr(tmp, '-');
|
||||
if (pos == NULL) {
|
||||
free(tmp);
|
||||
return -1;
|
||||
}
|
||||
*pos++ = '\0';
|
||||
field = tmp;
|
||||
pos2 = strchr(pos, ':');
|
||||
if (pos2 == NULL) {
|
||||
free(tmp);
|
||||
return -1;
|
||||
}
|
||||
*pos2++ = '\0';
|
||||
|
||||
networkid = atoi(pos);
|
||||
queryInfo->setText(pos2);
|
||||
if (strcmp(tmp, "PASSWORD") == 0) {
|
||||
queryField->setText(tr("Password: "));
|
||||
queryEdit->setEchoMode(QLineEdit::Password);
|
||||
} else if (strcmp(tmp, "NEW_PASSWORD") == 0) {
|
||||
queryField->setText(tr("New password: "));
|
||||
queryEdit->setEchoMode(QLineEdit::Password);
|
||||
} else if (strcmp(tmp, "IDENTITY") == 0)
|
||||
queryField->setText(tr("Identity: "));
|
||||
else if (strcmp(tmp, "PASSPHRASE") == 0) {
|
||||
queryField->setText(tr("Private key passphrase: "));
|
||||
queryEdit->setEchoMode(QLineEdit::Password);
|
||||
} else
|
||||
queryField->setText(field + ":");
|
||||
free(tmp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void UserDataRequest::sendReply()
|
||||
{
|
||||
char reply[10];
|
||||
size_t reply_len = sizeof(reply);
|
||||
|
||||
if (wpagui == NULL) {
|
||||
reject();
|
||||
return;
|
||||
}
|
||||
|
||||
QString cmd = QString(WPA_CTRL_RSP) + field + '-' +
|
||||
QString::number(networkid) + ':' +
|
||||
queryEdit->text();
|
||||
wpagui->ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len);
|
||||
accept();
|
||||
}
|
||||
40
src/userdatarequest.h
Normal file
40
src/userdatarequest.h
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* wpa_gui - UserDataRequest class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef USERDATAREQUEST_H
|
||||
#define USERDATAREQUEST_H
|
||||
|
||||
#include <QObject>
|
||||
#include "ui_userdatarequest.h"
|
||||
|
||||
class WpaGui;
|
||||
|
||||
class UserDataRequest : public QDialog, public Ui::UserDataRequest
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
UserDataRequest(QWidget *parent = 0, const char *name = 0,
|
||||
bool modal = false, Qt::WindowFlags fl = 0);
|
||||
~UserDataRequest();
|
||||
|
||||
int setParams(WpaGui *_wpagui, const char *reqMsg);
|
||||
|
||||
public slots:
|
||||
virtual void sendReply();
|
||||
|
||||
protected slots:
|
||||
virtual void languageChange();
|
||||
|
||||
private:
|
||||
WpaGui *wpagui;
|
||||
int networkid;
|
||||
QString field;
|
||||
};
|
||||
|
||||
#endif /* USERDATAREQUEST_H */
|
||||
109
src/userdatarequest.ui
Normal file
109
src/userdatarequest.ui
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
<ui version="4.0" stdsetdef="1" >
|
||||
<author></author>
|
||||
<comment></comment>
|
||||
<exportmacro></exportmacro>
|
||||
<class>UserDataRequest</class>
|
||||
<widget class="QDialog" name="UserDataRequest" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>216</width>
|
||||
<height>103</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>Authentication credentials required</string>
|
||||
</property>
|
||||
<property name="sizeGripEnabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" >
|
||||
<item>
|
||||
<widget class="QLabel" name="queryInfo" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="queryField" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="queryEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="echoMode" >
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<spacer name="spacer4" >
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="sizeType" >
|
||||
<enum>Expanding</enum>
|
||||
</property>
|
||||
<property name="orientation" >
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="buttonOk" >
|
||||
<property name="text" >
|
||||
<string>&OK</string>
|
||||
</property>
|
||||
<property name="shortcut" >
|
||||
<string/>
|
||||
</property>
|
||||
<property name="autoDefault" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="default" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="buttonCancel" >
|
||||
<property name="text" >
|
||||
<string>&Cancel</string>
|
||||
</property>
|
||||
<property name="shortcut" >
|
||||
<string/>
|
||||
</property>
|
||||
<property name="autoDefault" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11" />
|
||||
<pixmapfunction></pixmapfunction>
|
||||
</ui>
|
||||
10
src/wpa_gui.desktop
Normal file
10
src/wpa_gui.desktop
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=wpa_gui
|
||||
Comment=Graphical user interface for wpa_supplicant
|
||||
Exec=wpa_gui
|
||||
Icon=wpa_gui
|
||||
GenericName=wpa_supplicant user interface
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Qt;Network;
|
||||
73
src/wpa_gui.pro
Normal file
73
src/wpa_gui.pro
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
TEMPLATE = app
|
||||
LANGUAGE = C++
|
||||
TRANSLATIONS = lang/wpa_gui_de.ts
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
CONFIG += qt warn_on release
|
||||
|
||||
DEFINES += CONFIG_CTRL_IFACE
|
||||
|
||||
win32 {
|
||||
LIBS += -lws2_32 -static
|
||||
DEFINES += CONFIG_NATIVE_WINDOWS CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
SOURCES += ../../src/utils/os_win32.c
|
||||
} else:win32-g++ {
|
||||
# cross compilation to win32
|
||||
LIBS += -lws2_32 -static -mwindows
|
||||
DEFINES += CONFIG_NATIVE_WINDOWS CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
SOURCES += ../../src/utils/os_win32.c
|
||||
RESOURCES += icons_png.qrc
|
||||
} else:win32-x-g++ {
|
||||
# cross compilation to win32
|
||||
LIBS += -lws2_32 -static -mwindows
|
||||
DEFINES += CONFIG_NATIVE_WINDOWS CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
DEFINES += _X86_
|
||||
SOURCES += ../../src/utils/os_win32.c
|
||||
RESOURCES += icons_png.qrc
|
||||
} else {
|
||||
DEFINES += CONFIG_CTRL_IFACE_UNIX
|
||||
SOURCES += ../../src/utils/os_unix.c
|
||||
}
|
||||
|
||||
INCLUDEPATH += . .. ../../src ../../src/utils
|
||||
|
||||
HEADERS += wpamsg.h \
|
||||
wpagui.h \
|
||||
eventhistory.h \
|
||||
scanresults.h \
|
||||
scanresultsitem.h \
|
||||
signalbar.h \
|
||||
userdatarequest.h \
|
||||
networkconfig.h \
|
||||
addinterface.h \
|
||||
peers.h \
|
||||
stringquery.h
|
||||
|
||||
SOURCES += main.cpp \
|
||||
wpagui.cpp \
|
||||
eventhistory.cpp \
|
||||
scanresults.cpp \
|
||||
scanresultsitem.cpp \
|
||||
signalbar.cpp \
|
||||
userdatarequest.cpp \
|
||||
networkconfig.cpp \
|
||||
addinterface.cpp \
|
||||
peers.cpp \
|
||||
stringquery.cpp \
|
||||
../../src/common/wpa_ctrl.c
|
||||
|
||||
RESOURCES += icons.qrc
|
||||
|
||||
FORMS = wpagui.ui \
|
||||
eventhistory.ui \
|
||||
scanresults.ui \
|
||||
userdatarequest.ui \
|
||||
networkconfig.ui \
|
||||
peers.ui
|
||||
|
||||
|
||||
unix {
|
||||
UI_DIR = .ui
|
||||
MOC_DIR = .moc
|
||||
OBJECTS_DIR = .obj
|
||||
}
|
||||
1898
src/wpagui.cpp
Normal file
1898
src/wpagui.cpp
Normal file
File diff suppressed because it is too large
Load diff
180
src/wpagui.h
Normal file
180
src/wpagui.h
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
* wpa_gui - WpaGui class
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef WPAGUI_H
|
||||
#define WPAGUI_H
|
||||
|
||||
#include <QSystemTrayIcon>
|
||||
#include <QObject>
|
||||
#include "ui_wpagui.h"
|
||||
#include "addinterface.h"
|
||||
|
||||
class UserDataRequest;
|
||||
|
||||
class WpaGuiApp : public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
WpaGuiApp(int &argc, char **argv);
|
||||
|
||||
#if !defined(QT_NO_SESSIONMANAGER) && QT_VERSION < 0x050000
|
||||
virtual void saveState(QSessionManager &manager);
|
||||
#endif
|
||||
|
||||
WpaGui *w;
|
||||
int argc;
|
||||
char **argv;
|
||||
};
|
||||
|
||||
class WpaGui : public QMainWindow, public Ui::WpaGui
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
enum TrayIconType {
|
||||
TrayIconOffline = 0,
|
||||
TrayIconAcquiring,
|
||||
TrayIconConnected,
|
||||
TrayIconSignalNone,
|
||||
TrayIconSignalWeak,
|
||||
TrayIconSignalOk,
|
||||
TrayIconSignalGood,
|
||||
TrayIconSignalExcellent,
|
||||
};
|
||||
|
||||
WpaGui(QApplication *app, QWidget *parent = 0, const char *name = 0,
|
||||
Qt::WindowFlags fl = 0);
|
||||
~WpaGui();
|
||||
|
||||
virtual int ctrlRequest(const char *cmd, char *buf, size_t *buflen);
|
||||
virtual void triggerUpdate();
|
||||
virtual void editNetwork(const QString &sel);
|
||||
virtual void removeNetwork(const QString &sel);
|
||||
virtual void enableNetwork(const QString &sel);
|
||||
virtual void disableNetwork(const QString &sel);
|
||||
virtual int getNetworkDisabled(const QString &sel);
|
||||
void setBssFromScan(const QString &bssid);
|
||||
#ifndef QT_NO_SESSIONMANAGER
|
||||
void saveState();
|
||||
#endif
|
||||
|
||||
public slots:
|
||||
virtual void parse_argv();
|
||||
virtual void updateStatus();
|
||||
virtual void updateNetworks();
|
||||
virtual void helpIndex();
|
||||
virtual void helpContents();
|
||||
virtual void helpAbout();
|
||||
virtual void disconnect();
|
||||
virtual void scan();
|
||||
virtual void eventHistory();
|
||||
virtual void ping();
|
||||
virtual void signalMeterUpdate();
|
||||
virtual void processMsg(char *msg);
|
||||
virtual void processCtrlReq(const char *req);
|
||||
virtual void receiveMsgs();
|
||||
virtual void connectB();
|
||||
virtual void selectNetwork(const QString &sel);
|
||||
virtual void editSelectedNetwork();
|
||||
virtual void editListedNetwork();
|
||||
virtual void removeSelectedNetwork();
|
||||
virtual void removeListedNetwork();
|
||||
virtual void addNetwork();
|
||||
virtual void enableAllNetworks();
|
||||
virtual void disableAllNetworks();
|
||||
virtual void removeAllNetworks();
|
||||
virtual void saveConfig();
|
||||
virtual void selectAdapter(const QString &sel);
|
||||
virtual void updateNetworkDisabledStatus();
|
||||
virtual void enableListedNetwork(bool);
|
||||
virtual void disableListedNetwork(bool);
|
||||
virtual void showTrayMessage(QSystemTrayIcon::MessageIcon type,
|
||||
int sec, const QString &msg);
|
||||
virtual void showTrayStatus();
|
||||
virtual void updateTrayIcon(TrayIconType type);
|
||||
virtual void updateTrayToolTip(const QString &msg);
|
||||
virtual QIcon loadThemedIcon(const QStringList &names,
|
||||
const QIcon &fallback);
|
||||
virtual void wpsDialog();
|
||||
virtual void peersDialog();
|
||||
virtual void tabChanged(int index);
|
||||
virtual void wpsPbc();
|
||||
virtual void wpsGeneratePin();
|
||||
virtual void wpsApPinChanged(const QString &text);
|
||||
virtual void wpsApPin();
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
virtual void startService();
|
||||
virtual void stopService();
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
virtual void addInterface();
|
||||
|
||||
protected slots:
|
||||
virtual void languageChange();
|
||||
virtual void trayActivated(QSystemTrayIcon::ActivationReason how);
|
||||
virtual void closeEvent(QCloseEvent *event);
|
||||
|
||||
private:
|
||||
ScanResults *scanres;
|
||||
Peers *peers;
|
||||
bool networkMayHaveChanged;
|
||||
char *ctrl_iface;
|
||||
EventHistory *eh;
|
||||
struct wpa_ctrl *ctrl_conn;
|
||||
QSocketNotifier *msgNotifier;
|
||||
QTimer *timer;
|
||||
int pingsToStatusUpdate;
|
||||
WpaMsgList msgs;
|
||||
char *ctrl_iface_dir;
|
||||
struct wpa_ctrl *monitor_conn;
|
||||
UserDataRequest *udr;
|
||||
QAction *disconnectAction;
|
||||
QAction *reconnectAction;
|
||||
QAction *eventAction;
|
||||
QAction *scanAction;
|
||||
QAction *statAction;
|
||||
QAction *showAction;
|
||||
QAction *hideAction;
|
||||
QAction *quitAction;
|
||||
QMenu *tray_menu;
|
||||
QSystemTrayIcon *tray_icon;
|
||||
TrayIconType currentIconType;
|
||||
QString wpaStateTranslate(char *state);
|
||||
void createTrayIcon(bool);
|
||||
bool ackTrayIcon;
|
||||
bool startInTray;
|
||||
bool quietMode;
|
||||
|
||||
int openCtrlConnection(const char *ifname);
|
||||
|
||||
bool wpsRunning;
|
||||
|
||||
QString bssFromScan;
|
||||
|
||||
void stopWpsRun(bool success);
|
||||
|
||||
QTimer *signalMeterTimer;
|
||||
int signalMeterInterval;
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
QAction *fileStartServiceAction;
|
||||
QAction *fileStopServiceAction;
|
||||
|
||||
bool serviceRunning();
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
QAction *addInterfaceAction;
|
||||
AddInterface *add_iface;
|
||||
|
||||
bool connectedToService;
|
||||
|
||||
QApplication *app;
|
||||
bool inTray;
|
||||
};
|
||||
|
||||
#endif /* WPAGUI_H */
|
||||
524
src/wpagui.ui
Normal file
524
src/wpagui.ui
Normal file
|
|
@ -0,0 +1,524 @@
|
|||
<ui version="4.0" >
|
||||
<class>WpaGui</class>
|
||||
<widget class="QMainWindow" name="WpaGui" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>345</width>
|
||||
<height>330</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>wpa_gui</string>
|
||||
</property>
|
||||
<property name="windowIcon" >
|
||||
<iconset resource="icons.qrc" >
|
||||
<normaloff>:/icons/wpa_gui.svg</normaloff>:/icons/wpa_gui.svg</iconset>
|
||||
</property>
|
||||
<widget class="QWidget" name="widget" >
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="adapterLabel" >
|
||||
<property name="text" >
|
||||
<string>Adapter:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QComboBox" name="adapterSelect" />
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="networkLabel" >
|
||||
<property name="text" >
|
||||
<string>Network:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QComboBox" name="networkSelect" />
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2" >
|
||||
<widget class="QTabWidget" name="wpaguiTab" >
|
||||
<property name="currentIndex" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="statusTab" >
|
||||
<attribute name="title" >
|
||||
<string>Current Status</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" colspan="5" >
|
||||
<widget class="QFrame" name="frame3" >
|
||||
<property name="frameShape" >
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow" >
|
||||
<enum>QFrame::Plain</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="statusLabel" >
|
||||
<property name="text" >
|
||||
<string>Status:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="lastMessageLabel" >
|
||||
<property name="text" >
|
||||
<string>Last message:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<widget class="QLabel" name="authenticationLabel" >
|
||||
<property name="text" >
|
||||
<string>Authentication:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" >
|
||||
<widget class="QLabel" name="encryptionLabel" >
|
||||
<property name="text" >
|
||||
<string>Encryption:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" >
|
||||
<widget class="QLabel" name="ssidLabel" >
|
||||
<property name="text" >
|
||||
<string>SSID:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" >
|
||||
<widget class="QLabel" name="bssidLabel" >
|
||||
<property name="text" >
|
||||
<string>BSSID:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0" >
|
||||
<widget class="QLabel" name="ipAddressLabel" >
|
||||
<property name="text" >
|
||||
<string>IP address:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QLabel" name="textStatus" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="3" >
|
||||
<widget class="QLabel" name="textLastMessage" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" >
|
||||
<widget class="QLabel" name="textAuthentication" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" >
|
||||
<widget class="QLabel" name="textEncryption" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" >
|
||||
<widget class="QLabel" name="textSsid" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1" >
|
||||
<widget class="QLabel" name="textBssid" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1" >
|
||||
<widget class="QLabel" name="textIpAddress" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QPushButton" name="connectButton" >
|
||||
<property name="text" >
|
||||
<string>Connect</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2" >
|
||||
<widget class="QPushButton" name="disconnectButton" >
|
||||
<property name="text" >
|
||||
<string>Disconnect</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3" >
|
||||
<widget class="QPushButton" name="scanButton" >
|
||||
<property name="text" >
|
||||
<string>Scan</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="networkconfigTab" >
|
||||
<attribute name="title" >
|
||||
<string>Manage Networks</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" colspan="5" >
|
||||
<widget class="QListWidget" name="networkList" >
|
||||
<property name="selectionRectVisible" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item rowspan="2" row="1" column="0" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>61</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QRadioButton" name="enableRadioButton" >
|
||||
<property name="text" >
|
||||
<string>Enabled</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2" >
|
||||
<widget class="QPushButton" name="editNetworkButton" >
|
||||
<property name="text" >
|
||||
<string>Edit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3" >
|
||||
<widget class="QPushButton" name="removeNetworkButton" >
|
||||
<property name="text" >
|
||||
<string>Remove</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item rowspan="2" row="1" column="4" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>61</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="1" >
|
||||
<widget class="QRadioButton" name="disableRadioButton" >
|
||||
<property name="text" >
|
||||
<string>Disabled</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2" >
|
||||
<widget class="QPushButton" name="addNetworkButton" >
|
||||
<property name="text" >
|
||||
<string>Add</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3" >
|
||||
<widget class="QPushButton" name="scanNetworkButton" >
|
||||
<property name="text" >
|
||||
<string>Scan</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="wpsTab" >
|
||||
<attribute name="title" >
|
||||
<string>WPS</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" name="wpsGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="label_2" >
|
||||
<property name="text" >
|
||||
<string>Status:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" colspan="3" >
|
||||
<widget class="QLabel" name="wpsStatusText" >
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2" >
|
||||
<widget class="QPushButton" name="wpsPbcButton" >
|
||||
<property name="text" >
|
||||
<string>PBC - push button</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2" >
|
||||
<widget class="QPushButton" name="wpsPinButton" >
|
||||
<property name="text" >
|
||||
<string>Generate PIN</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<string>PIN:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3" >
|
||||
<widget class="QLineEdit" name="wpsPinEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="readOnly" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2" >
|
||||
<widget class="QPushButton" name="wpsApPinButton" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>Use AP PIN</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2" >
|
||||
<widget class="QLabel" name="label_3" >
|
||||
<property name="text" >
|
||||
<string>AP PIN:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3" >
|
||||
<widget class="QLineEdit" name="wpsApPinEdit" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="4" >
|
||||
<widget class="QTextEdit" name="wpsInstructions" >
|
||||
<property name="readOnly" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="MenuBar" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>345</width>
|
||||
<height>24</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="fileMenu" >
|
||||
<property name="title" >
|
||||
<string>&File</string>
|
||||
</property>
|
||||
<addaction name="fileEventHistoryAction" />
|
||||
<addaction name="fileSaveConfigAction" />
|
||||
<addaction name="actionWPS" />
|
||||
<addaction name="actionPeers" />
|
||||
<addaction name="separator" />
|
||||
<addaction name="fileExitAction" />
|
||||
</widget>
|
||||
<widget class="QMenu" name="networkMenu" >
|
||||
<property name="title" >
|
||||
<string>&Network</string>
|
||||
</property>
|
||||
<addaction name="networkAddAction" />
|
||||
<addaction name="networkEditAction" />
|
||||
<addaction name="networkRemoveAction" />
|
||||
<addaction name="separator" />
|
||||
<addaction name="networkEnableAllAction" />
|
||||
<addaction name="networkDisableAllAction" />
|
||||
<addaction name="networkRemoveAllAction" />
|
||||
</widget>
|
||||
<widget class="QMenu" name="helpMenu" >
|
||||
<property name="title" >
|
||||
<string>&Help</string>
|
||||
</property>
|
||||
<addaction name="helpContentsAction" />
|
||||
<addaction name="helpIndexAction" />
|
||||
<addaction name="separator" />
|
||||
<addaction name="helpAboutAction" />
|
||||
</widget>
|
||||
<addaction name="fileMenu" />
|
||||
<addaction name="networkMenu" />
|
||||
<addaction name="helpMenu" />
|
||||
</widget>
|
||||
<action name="fileEventHistoryAction" >
|
||||
<property name="text" >
|
||||
<string>Event &History</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="fileSaveConfigAction" >
|
||||
<property name="text" >
|
||||
<string>&Save Configuration</string>
|
||||
</property>
|
||||
<property name="shortcut" >
|
||||
<string>Ctrl+S</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="fileExitAction" >
|
||||
<property name="text" >
|
||||
<string>E&xit</string>
|
||||
</property>
|
||||
<property name="shortcut" >
|
||||
<string>Ctrl+Q</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="networkAddAction" >
|
||||
<property name="text" >
|
||||
<string>&Add</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="networkEditAction" >
|
||||
<property name="text" >
|
||||
<string>&Edit</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="networkRemoveAction" >
|
||||
<property name="text" >
|
||||
<string>&Remove</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="networkEnableAllAction" >
|
||||
<property name="text" >
|
||||
<string>E&nable All</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="networkDisableAllAction" >
|
||||
<property name="text" >
|
||||
<string>&Disable All</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="networkRemoveAllAction" >
|
||||
<property name="text" >
|
||||
<string>Re&move All</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="helpContentsAction" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>&Contents...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="helpIndexAction" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>&Index...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="helpAboutAction" >
|
||||
<property name="text" >
|
||||
<string>&About</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionWPS" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>&Wi-Fi Protected Setup</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPeers" >
|
||||
<property name="text" >
|
||||
<string>&Peers</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11" />
|
||||
<pixmapfunction></pixmapfunction>
|
||||
<includes>
|
||||
<include location="global" >qtimer.h</include>
|
||||
<include location="global" >qsocketnotifier.h</include>
|
||||
<include location="local" >wpamsg.h</include>
|
||||
<include location="local" >eventhistory.h</include>
|
||||
<include location="local" >scanresults.h</include>
|
||||
<include location="local" >peers.h</include>
|
||||
</includes>
|
||||
<resources>
|
||||
<include location="icons.qrc" />
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
35
src/wpamsg.h
Normal file
35
src/wpamsg.h
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* wpa_gui - WpaMsg class for storing event messages
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef WPAMSG_H
|
||||
#define WPAMSG_H
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QLinkedList>
|
||||
|
||||
class WpaMsg {
|
||||
public:
|
||||
WpaMsg(const QString &_msg, int _priority = 2)
|
||||
: msg(_msg), priority(_priority)
|
||||
{
|
||||
timestamp = QDateTime::currentDateTime();
|
||||
}
|
||||
|
||||
QString getMsg() const { return msg; }
|
||||
int getPriority() const { return priority; }
|
||||
QDateTime getTimestamp() const { return timestamp; }
|
||||
|
||||
private:
|
||||
QString msg;
|
||||
int priority;
|
||||
QDateTime timestamp;
|
||||
};
|
||||
|
||||
typedef QLinkedList<WpaMsg> WpaMsgList;
|
||||
|
||||
#endif /* WPAMSG_H */
|
||||
752
wpa_supplicant/src/common/wpa_ctrl.c
Normal file
752
wpa_supplicant/src/common/wpa_ctrl.c
Normal file
|
|
@ -0,0 +1,752 @@
|
|||
/*
|
||||
* wpa_supplicant/hostapd control interface library
|
||||
* Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UNIX
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#endif /* CONFIG_CTRL_IFACE_UNIX */
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
|
||||
#include <netdb.h>
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <cutils/sockets.h>
|
||||
#include "private/android_filesystem_config.h"
|
||||
#endif /* ANDROID */
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
#include <net/if.h>
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
|
||||
#include "wpa_ctrl.h"
|
||||
#include "common.h"
|
||||
|
||||
|
||||
#if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP)
|
||||
#define CTRL_IFACE_SOCKET
|
||||
#endif /* CONFIG_CTRL_IFACE_UNIX || CONFIG_CTRL_IFACE_UDP */
|
||||
|
||||
|
||||
/**
|
||||
* struct wpa_ctrl - Internal structure for control interface library
|
||||
*
|
||||
* This structure is used by the wpa_supplicant/hostapd control interface
|
||||
* library to store internal data. Programs using the library should not touch
|
||||
* this data directly. They can only use the pointer to the data structure as
|
||||
* an identifier for the control interface connection and use this as one of
|
||||
* the arguments for most of the control interface library functions.
|
||||
*/
|
||||
struct wpa_ctrl {
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP
|
||||
int s;
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
struct sockaddr_in6 local;
|
||||
struct sockaddr_in6 dest;
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
struct sockaddr_in local;
|
||||
struct sockaddr_in dest;
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
char *cookie;
|
||||
char *remote_ifname;
|
||||
char *remote_ip;
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP */
|
||||
#ifdef CONFIG_CTRL_IFACE_UNIX
|
||||
int s;
|
||||
struct sockaddr_un local;
|
||||
struct sockaddr_un dest;
|
||||
#endif /* CONFIG_CTRL_IFACE_UNIX */
|
||||
#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
HANDLE pipe;
|
||||
#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
|
||||
};
|
||||
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UNIX
|
||||
|
||||
#ifndef CONFIG_CTRL_IFACE_CLIENT_DIR
|
||||
#define CONFIG_CTRL_IFACE_CLIENT_DIR "/tmp"
|
||||
#endif /* CONFIG_CTRL_IFACE_CLIENT_DIR */
|
||||
#ifndef CONFIG_CTRL_IFACE_CLIENT_PREFIX
|
||||
#define CONFIG_CTRL_IFACE_CLIENT_PREFIX "wpa_ctrl_"
|
||||
#endif /* CONFIG_CTRL_IFACE_CLIENT_PREFIX */
|
||||
|
||||
|
||||
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
|
||||
{
|
||||
return wpa_ctrl_open2(ctrl_path, NULL);
|
||||
}
|
||||
|
||||
|
||||
struct wpa_ctrl * wpa_ctrl_open2(const char *ctrl_path,
|
||||
const char *cli_path)
|
||||
{
|
||||
struct wpa_ctrl *ctrl;
|
||||
static int counter = 0;
|
||||
int ret;
|
||||
size_t res;
|
||||
int tries = 0;
|
||||
int flags;
|
||||
|
||||
if (ctrl_path == NULL)
|
||||
return NULL;
|
||||
|
||||
ctrl = os_zalloc(sizeof(*ctrl));
|
||||
if (ctrl == NULL)
|
||||
return NULL;
|
||||
|
||||
ctrl->s = socket(PF_UNIX, SOCK_DGRAM, 0);
|
||||
if (ctrl->s < 0) {
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctrl->local.sun_family = AF_UNIX;
|
||||
counter++;
|
||||
try_again:
|
||||
if (cli_path && cli_path[0] == '/') {
|
||||
ret = os_snprintf(ctrl->local.sun_path,
|
||||
sizeof(ctrl->local.sun_path),
|
||||
"%s/" CONFIG_CTRL_IFACE_CLIENT_PREFIX "%d-%d",
|
||||
cli_path, (int) getpid(), counter);
|
||||
} else {
|
||||
ret = os_snprintf(ctrl->local.sun_path,
|
||||
sizeof(ctrl->local.sun_path),
|
||||
CONFIG_CTRL_IFACE_CLIENT_DIR "/"
|
||||
CONFIG_CTRL_IFACE_CLIENT_PREFIX "%d-%d",
|
||||
(int) getpid(), counter);
|
||||
}
|
||||
if (os_snprintf_error(sizeof(ctrl->local.sun_path), ret)) {
|
||||
close(ctrl->s);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
tries++;
|
||||
if (bind(ctrl->s, (struct sockaddr *) &ctrl->local,
|
||||
sizeof(ctrl->local)) < 0) {
|
||||
if (errno == EADDRINUSE && tries < 2) {
|
||||
/*
|
||||
* getpid() returns unique identifier for this instance
|
||||
* of wpa_ctrl, so the existing socket file must have
|
||||
* been left by unclean termination of an earlier run.
|
||||
* Remove the file and try again.
|
||||
*/
|
||||
unlink(ctrl->local.sun_path);
|
||||
goto try_again;
|
||||
}
|
||||
close(ctrl->s);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
chmod(ctrl->local.sun_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
|
||||
/* Set group even if we do not have privileges to change owner */
|
||||
chown(ctrl->local.sun_path, -1, AID_WIFI);
|
||||
chown(ctrl->local.sun_path, AID_SYSTEM, AID_WIFI);
|
||||
|
||||
if (os_strncmp(ctrl_path, "@android:", 9) == 0) {
|
||||
if (socket_local_client_connect(
|
||||
ctrl->s, ctrl_path + 9,
|
||||
ANDROID_SOCKET_NAMESPACE_RESERVED,
|
||||
SOCK_DGRAM) < 0) {
|
||||
close(ctrl->s);
|
||||
unlink(ctrl->local.sun_path);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the ctrl_path isn't an absolute pathname, assume that
|
||||
* it's the name of a socket in the Android reserved namespace.
|
||||
* Otherwise, it's a normal UNIX domain socket appearing in the
|
||||
* filesystem.
|
||||
*/
|
||||
if (*ctrl_path != '/') {
|
||||
char buf[21];
|
||||
os_snprintf(buf, sizeof(buf), "wpa_%s", ctrl_path);
|
||||
if (socket_local_client_connect(
|
||||
ctrl->s, buf,
|
||||
ANDROID_SOCKET_NAMESPACE_RESERVED,
|
||||
SOCK_DGRAM) < 0) {
|
||||
close(ctrl->s);
|
||||
unlink(ctrl->local.sun_path);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
return ctrl;
|
||||
}
|
||||
#endif /* ANDROID */
|
||||
|
||||
ctrl->dest.sun_family = AF_UNIX;
|
||||
if (os_strncmp(ctrl_path, "@abstract:", 10) == 0) {
|
||||
ctrl->dest.sun_path[0] = '\0';
|
||||
os_strlcpy(ctrl->dest.sun_path + 1, ctrl_path + 10,
|
||||
sizeof(ctrl->dest.sun_path) - 1);
|
||||
} else {
|
||||
res = os_strlcpy(ctrl->dest.sun_path, ctrl_path,
|
||||
sizeof(ctrl->dest.sun_path));
|
||||
if (res >= sizeof(ctrl->dest.sun_path)) {
|
||||
close(ctrl->s);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
|
||||
sizeof(ctrl->dest)) < 0) {
|
||||
close(ctrl->s);
|
||||
unlink(ctrl->local.sun_path);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Make socket non-blocking so that we don't hang forever if
|
||||
* target dies unexpectedly.
|
||||
*/
|
||||
flags = fcntl(ctrl->s, F_GETFL);
|
||||
if (flags >= 0) {
|
||||
flags |= O_NONBLOCK;
|
||||
if (fcntl(ctrl->s, F_SETFL, flags) < 0) {
|
||||
perror("fcntl(ctrl->s, O_NONBLOCK)");
|
||||
/* Not fatal, continue on.*/
|
||||
}
|
||||
}
|
||||
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
|
||||
void wpa_ctrl_close(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
if (ctrl == NULL)
|
||||
return;
|
||||
unlink(ctrl->local.sun_path);
|
||||
if (ctrl->s >= 0)
|
||||
close(ctrl->s);
|
||||
os_free(ctrl);
|
||||
}
|
||||
|
||||
|
||||
#ifdef ANDROID
|
||||
/**
|
||||
* wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that
|
||||
* may be left over from clients that were previously connected to
|
||||
* wpa_supplicant. This keeps these files from being orphaned in the
|
||||
* event of crashes that prevented them from being removed as part
|
||||
* of the normal orderly shutdown.
|
||||
*/
|
||||
void wpa_ctrl_cleanup(void)
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent entry;
|
||||
struct dirent *result;
|
||||
size_t dirnamelen;
|
||||
size_t maxcopy;
|
||||
char pathname[PATH_MAX];
|
||||
char *namep;
|
||||
|
||||
if ((dir = opendir(CONFIG_CTRL_IFACE_CLIENT_DIR)) == NULL)
|
||||
return;
|
||||
|
||||
dirnamelen = (size_t) os_snprintf(pathname, sizeof(pathname), "%s/",
|
||||
CONFIG_CTRL_IFACE_CLIENT_DIR);
|
||||
if (dirnamelen >= sizeof(pathname)) {
|
||||
closedir(dir);
|
||||
return;
|
||||
}
|
||||
namep = pathname + dirnamelen;
|
||||
maxcopy = PATH_MAX - dirnamelen;
|
||||
while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
|
||||
if (os_strlcpy(namep, entry.d_name, maxcopy) < maxcopy)
|
||||
unlink(pathname);
|
||||
}
|
||||
closedir(dir);
|
||||
}
|
||||
#endif /* ANDROID */
|
||||
|
||||
#else /* CONFIG_CTRL_IFACE_UNIX */
|
||||
|
||||
#ifdef ANDROID
|
||||
void wpa_ctrl_cleanup(void)
|
||||
{
|
||||
}
|
||||
#endif /* ANDROID */
|
||||
|
||||
#endif /* CONFIG_CTRL_IFACE_UNIX */
|
||||
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP
|
||||
|
||||
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
|
||||
{
|
||||
struct wpa_ctrl *ctrl;
|
||||
char buf[128];
|
||||
size_t len;
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
|
||||
struct hostent *h;
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
|
||||
ctrl = os_zalloc(sizeof(*ctrl));
|
||||
if (ctrl == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
ctrl->s = socket(PF_INET6, SOCK_DGRAM, 0);
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
ctrl->s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
if (ctrl->s < 0) {
|
||||
perror("socket");
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
ctrl->local.sin6_family = AF_INET6;
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
|
||||
ctrl->local.sin6_addr = in6addr_any;
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
inet_pton(AF_INET6, "::1", &ctrl->local.sin6_addr);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
ctrl->local.sin_family = AF_INET;
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
|
||||
ctrl->local.sin_addr.s_addr = INADDR_ANY;
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
ctrl->local.sin_addr.s_addr = htonl((127 << 24) | 1);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
|
||||
if (bind(ctrl->s, (struct sockaddr *) &ctrl->local,
|
||||
sizeof(ctrl->local)) < 0) {
|
||||
close(ctrl->s);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
ctrl->dest.sin6_family = AF_INET6;
|
||||
inet_pton(AF_INET6, "::1", &ctrl->dest.sin6_addr);
|
||||
ctrl->dest.sin6_port = htons(WPA_CTRL_IFACE_PORT);
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
ctrl->dest.sin_family = AF_INET;
|
||||
ctrl->dest.sin_addr.s_addr = htonl((127 << 24) | 1);
|
||||
ctrl->dest.sin_port = htons(WPA_CTRL_IFACE_PORT);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
|
||||
if (ctrl_path) {
|
||||
char *port, *name;
|
||||
int port_id;
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
char *scope;
|
||||
int scope_id = 0;
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
|
||||
name = os_strdup(ctrl_path);
|
||||
if (name == NULL) {
|
||||
close(ctrl->s);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
port = os_strchr(name, ',');
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
port = os_strchr(name, ':');
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
|
||||
if (port) {
|
||||
port_id = atoi(&port[1]);
|
||||
port[0] = '\0';
|
||||
} else
|
||||
port_id = WPA_CTRL_IFACE_PORT;
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
scope = os_strchr(name, '%');
|
||||
if (scope) {
|
||||
scope_id = if_nametoindex(&scope[1]);
|
||||
scope[0] = '\0';
|
||||
}
|
||||
h = gethostbyname2(name, AF_INET6);
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
h = gethostbyname(name);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
ctrl->remote_ip = os_strdup(name);
|
||||
os_free(name);
|
||||
if (h == NULL) {
|
||||
perror("gethostbyname");
|
||||
close(ctrl->s);
|
||||
os_free(ctrl->remote_ip);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
ctrl->dest.sin6_scope_id = scope_id;
|
||||
ctrl->dest.sin6_port = htons(port_id);
|
||||
os_memcpy(&ctrl->dest.sin6_addr, h->h_addr, h->h_length);
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
ctrl->dest.sin_port = htons(port_id);
|
||||
os_memcpy(&ctrl->dest.sin_addr.s_addr, h->h_addr, h->h_length);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
} else
|
||||
ctrl->remote_ip = os_strdup("localhost");
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
|
||||
|
||||
if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
|
||||
sizeof(ctrl->dest)) < 0) {
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
|
||||
char addr[INET6_ADDRSTRLEN];
|
||||
wpa_printf(MSG_ERROR, "connect(%s:%d) failed: %s",
|
||||
inet_ntop(AF_INET6, &ctrl->dest.sin6_addr, addr,
|
||||
sizeof(ctrl->dest)),
|
||||
ntohs(ctrl->dest.sin6_port),
|
||||
strerror(errno));
|
||||
#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
wpa_printf(MSG_ERROR, "connect(%s:%d) failed: %s",
|
||||
inet_ntoa(ctrl->dest.sin_addr),
|
||||
ntohs(ctrl->dest.sin_port),
|
||||
strerror(errno));
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
|
||||
close(ctrl->s);
|
||||
os_free(ctrl->remote_ip);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = sizeof(buf) - 1;
|
||||
if (wpa_ctrl_request(ctrl, "GET_COOKIE", 10, buf, &len, NULL) == 0) {
|
||||
buf[len] = '\0';
|
||||
ctrl->cookie = os_strdup(buf);
|
||||
}
|
||||
|
||||
if (wpa_ctrl_request(ctrl, "IFNAME", 6, buf, &len, NULL) == 0) {
|
||||
buf[len] = '\0';
|
||||
ctrl->remote_ifname = os_strdup(buf);
|
||||
}
|
||||
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
|
||||
char * wpa_ctrl_get_remote_ifname(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
#define WPA_CTRL_MAX_PS_NAME 100
|
||||
static char ps[WPA_CTRL_MAX_PS_NAME] = {};
|
||||
os_snprintf(ps, WPA_CTRL_MAX_PS_NAME, "%s/%s",
|
||||
ctrl->remote_ip, ctrl->remote_ifname);
|
||||
return ps;
|
||||
}
|
||||
|
||||
|
||||
void wpa_ctrl_close(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
close(ctrl->s);
|
||||
os_free(ctrl->cookie);
|
||||
os_free(ctrl->remote_ifname);
|
||||
os_free(ctrl->remote_ip);
|
||||
os_free(ctrl);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP */
|
||||
|
||||
|
||||
#ifdef CTRL_IFACE_SOCKET
|
||||
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
|
||||
char *reply, size_t *reply_len,
|
||||
void (*msg_cb)(char *msg, size_t len))
|
||||
{
|
||||
struct timeval tv;
|
||||
struct os_reltime started_at;
|
||||
int res;
|
||||
fd_set rfds;
|
||||
const char *_cmd;
|
||||
char *cmd_buf = NULL;
|
||||
size_t _cmd_len;
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP
|
||||
if (ctrl->cookie) {
|
||||
char *pos;
|
||||
_cmd_len = os_strlen(ctrl->cookie) + 1 + cmd_len;
|
||||
cmd_buf = os_malloc(_cmd_len);
|
||||
if (cmd_buf == NULL)
|
||||
return -1;
|
||||
_cmd = cmd_buf;
|
||||
pos = cmd_buf;
|
||||
os_strlcpy(pos, ctrl->cookie, _cmd_len);
|
||||
pos += os_strlen(ctrl->cookie);
|
||||
*pos++ = ' ';
|
||||
os_memcpy(pos, cmd, cmd_len);
|
||||
} else
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP */
|
||||
{
|
||||
_cmd = cmd;
|
||||
_cmd_len = cmd_len;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
started_at.sec = 0;
|
||||
started_at.usec = 0;
|
||||
retry_send:
|
||||
if (send(ctrl->s, _cmd, _cmd_len, 0) < 0) {
|
||||
if (errno == EAGAIN || errno == EBUSY || errno == EWOULDBLOCK)
|
||||
{
|
||||
/*
|
||||
* Must be a non-blocking socket... Try for a bit
|
||||
* longer before giving up.
|
||||
*/
|
||||
if (started_at.sec == 0)
|
||||
os_get_reltime(&started_at);
|
||||
else {
|
||||
struct os_reltime n;
|
||||
os_get_reltime(&n);
|
||||
/* Try for a few seconds. */
|
||||
if (os_reltime_expired(&n, &started_at, 5))
|
||||
goto send_err;
|
||||
}
|
||||
os_sleep(1, 0);
|
||||
goto retry_send;
|
||||
}
|
||||
send_err:
|
||||
os_free(cmd_buf);
|
||||
return -1;
|
||||
}
|
||||
os_free(cmd_buf);
|
||||
|
||||
for (;;) {
|
||||
tv.tv_sec = 10;
|
||||
tv.tv_usec = 0;
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET(ctrl->s, &rfds);
|
||||
res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
|
||||
if (res < 0 && errno == EINTR)
|
||||
continue;
|
||||
if (res < 0)
|
||||
return res;
|
||||
if (FD_ISSET(ctrl->s, &rfds)) {
|
||||
res = recv(ctrl->s, reply, *reply_len, 0);
|
||||
if (res < 0)
|
||||
return res;
|
||||
if (res > 0 && reply[0] == '<') {
|
||||
/* This is an unsolicited message from
|
||||
* wpa_supplicant, not the reply to the
|
||||
* request. Use msg_cb to report this to the
|
||||
* caller. */
|
||||
if (msg_cb) {
|
||||
/* Make sure the message is nul
|
||||
* terminated. */
|
||||
if ((size_t) res == *reply_len)
|
||||
res = (*reply_len) - 1;
|
||||
reply[res] = '\0';
|
||||
msg_cb(reply, res);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
*reply_len = res;
|
||||
break;
|
||||
} else {
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* CTRL_IFACE_SOCKET */
|
||||
|
||||
|
||||
static int wpa_ctrl_attach_helper(struct wpa_ctrl *ctrl, int attach)
|
||||
{
|
||||
char buf[10];
|
||||
int ret;
|
||||
size_t len = 10;
|
||||
|
||||
ret = wpa_ctrl_request(ctrl, attach ? "ATTACH" : "DETACH", 6,
|
||||
buf, &len, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (len == 3 && os_memcmp(buf, "OK\n", 3) == 0)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_attach(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
return wpa_ctrl_attach_helper(ctrl, 1);
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_detach(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
return wpa_ctrl_attach_helper(ctrl, 0);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CTRL_IFACE_SOCKET
|
||||
|
||||
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = recv(ctrl->s, reply, *reply_len, 0);
|
||||
if (res < 0)
|
||||
return res;
|
||||
*reply_len = res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_pending(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
struct timeval tv;
|
||||
fd_set rfds;
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 0;
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET(ctrl->s, &rfds);
|
||||
select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
|
||||
return FD_ISSET(ctrl->s, &rfds);
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
return ctrl->s;
|
||||
}
|
||||
|
||||
#endif /* CTRL_IFACE_SOCKET */
|
||||
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
|
||||
#ifndef WPA_SUPPLICANT_NAMED_PIPE
|
||||
#define WPA_SUPPLICANT_NAMED_PIPE "WpaSupplicant"
|
||||
#endif
|
||||
#define NAMED_PIPE_PREFIX TEXT("\\\\.\\pipe\\") TEXT(WPA_SUPPLICANT_NAMED_PIPE)
|
||||
|
||||
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
|
||||
{
|
||||
struct wpa_ctrl *ctrl;
|
||||
DWORD mode;
|
||||
TCHAR name[256];
|
||||
int i, ret;
|
||||
|
||||
ctrl = os_malloc(sizeof(*ctrl));
|
||||
if (ctrl == NULL)
|
||||
return NULL;
|
||||
os_memset(ctrl, 0, sizeof(*ctrl));
|
||||
|
||||
#ifdef UNICODE
|
||||
if (ctrl_path == NULL)
|
||||
ret = _snwprintf(name, 256, NAMED_PIPE_PREFIX);
|
||||
else
|
||||
ret = _snwprintf(name, 256, NAMED_PIPE_PREFIX TEXT("-%S"),
|
||||
ctrl_path);
|
||||
#else /* UNICODE */
|
||||
if (ctrl_path == NULL)
|
||||
ret = os_snprintf(name, 256, NAMED_PIPE_PREFIX);
|
||||
else
|
||||
ret = os_snprintf(name, 256, NAMED_PIPE_PREFIX "-%s",
|
||||
ctrl_path);
|
||||
#endif /* UNICODE */
|
||||
if (os_snprintf_error(256, ret)) {
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
ctrl->pipe = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0,
|
||||
NULL, OPEN_EXISTING, 0, NULL);
|
||||
/*
|
||||
* Current named pipe server side in wpa_supplicant is
|
||||
* re-opening the pipe for new clients only after the previous
|
||||
* one is taken into use. This leaves a small window for race
|
||||
* conditions when two connections are being opened at almost
|
||||
* the same time. Retry if that was the case.
|
||||
*/
|
||||
if (ctrl->pipe != INVALID_HANDLE_VALUE ||
|
||||
GetLastError() != ERROR_PIPE_BUSY)
|
||||
break;
|
||||
WaitNamedPipe(name, 1000);
|
||||
}
|
||||
if (ctrl->pipe == INVALID_HANDLE_VALUE) {
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mode = PIPE_READMODE_MESSAGE;
|
||||
if (!SetNamedPipeHandleState(ctrl->pipe, &mode, NULL, NULL)) {
|
||||
CloseHandle(ctrl->pipe);
|
||||
os_free(ctrl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
|
||||
void wpa_ctrl_close(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
CloseHandle(ctrl->pipe);
|
||||
os_free(ctrl);
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
|
||||
char *reply, size_t *reply_len,
|
||||
void (*msg_cb)(char *msg, size_t len))
|
||||
{
|
||||
DWORD written;
|
||||
DWORD readlen = *reply_len;
|
||||
|
||||
if (!WriteFile(ctrl->pipe, cmd, cmd_len, &written, NULL))
|
||||
return -1;
|
||||
|
||||
if (!ReadFile(ctrl->pipe, reply, *reply_len, &readlen, NULL))
|
||||
return -1;
|
||||
*reply_len = readlen;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len)
|
||||
{
|
||||
DWORD len = *reply_len;
|
||||
if (!ReadFile(ctrl->pipe, reply, *reply_len, &len, NULL))
|
||||
return -1;
|
||||
*reply_len = len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_pending(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
DWORD left;
|
||||
|
||||
if (!PeekNamedPipe(ctrl->pipe, NULL, 0, NULL, &left, NULL))
|
||||
return -1;
|
||||
return left ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
|
||||
|
||||
#endif /* CONFIG_CTRL_IFACE */
|
||||
504
wpa_supplicant/src/common/wpa_ctrl.h
Normal file
504
wpa_supplicant/src/common/wpa_ctrl.h
Normal file
|
|
@ -0,0 +1,504 @@
|
|||
/*
|
||||
* wpa_supplicant/hostapd control interface library
|
||||
* Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef WPA_CTRL_H
|
||||
#define WPA_CTRL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* wpa_supplicant control interface - fixed message prefixes */
|
||||
|
||||
/** Interactive request for identity/password/pin */
|
||||
#define WPA_CTRL_REQ "CTRL-REQ-"
|
||||
|
||||
/** Response to identity/password/pin request */
|
||||
#define WPA_CTRL_RSP "CTRL-RSP-"
|
||||
|
||||
/* Event messages with fixed prefix */
|
||||
/** Authentication completed successfully and data connection enabled */
|
||||
#define WPA_EVENT_CONNECTED "CTRL-EVENT-CONNECTED "
|
||||
/** Disconnected, data connection is not available */
|
||||
#define WPA_EVENT_DISCONNECTED "CTRL-EVENT-DISCONNECTED "
|
||||
/** Association rejected during connection attempt */
|
||||
#define WPA_EVENT_ASSOC_REJECT "CTRL-EVENT-ASSOC-REJECT "
|
||||
/** Authentication rejected during connection attempt */
|
||||
#define WPA_EVENT_AUTH_REJECT "CTRL-EVENT-AUTH-REJECT "
|
||||
/** wpa_supplicant is exiting */
|
||||
#define WPA_EVENT_TERMINATING "CTRL-EVENT-TERMINATING "
|
||||
/** Password change was completed successfully */
|
||||
#define WPA_EVENT_PASSWORD_CHANGED "CTRL-EVENT-PASSWORD-CHANGED "
|
||||
/** EAP-Request/Notification received */
|
||||
#define WPA_EVENT_EAP_NOTIFICATION "CTRL-EVENT-EAP-NOTIFICATION "
|
||||
/** EAP authentication started (EAP-Request/Identity received) */
|
||||
#define WPA_EVENT_EAP_STARTED "CTRL-EVENT-EAP-STARTED "
|
||||
/** EAP method proposed by the server */
|
||||
#define WPA_EVENT_EAP_PROPOSED_METHOD "CTRL-EVENT-EAP-PROPOSED-METHOD "
|
||||
/** EAP method selected */
|
||||
#define WPA_EVENT_EAP_METHOD "CTRL-EVENT-EAP-METHOD "
|
||||
/** EAP peer certificate from TLS */
|
||||
#define WPA_EVENT_EAP_PEER_CERT "CTRL-EVENT-EAP-PEER-CERT "
|
||||
/** EAP peer certificate alternative subject name component from TLS */
|
||||
#define WPA_EVENT_EAP_PEER_ALT "CTRL-EVENT-EAP-PEER-ALT "
|
||||
/** EAP TLS certificate chain validation error */
|
||||
#define WPA_EVENT_EAP_TLS_CERT_ERROR "CTRL-EVENT-EAP-TLS-CERT-ERROR "
|
||||
/** EAP status */
|
||||
#define WPA_EVENT_EAP_STATUS "CTRL-EVENT-EAP-STATUS "
|
||||
/** EAP authentication completed successfully */
|
||||
#define WPA_EVENT_EAP_SUCCESS "CTRL-EVENT-EAP-SUCCESS "
|
||||
/** EAP authentication failed (EAP-Failure received) */
|
||||
#define WPA_EVENT_EAP_FAILURE "CTRL-EVENT-EAP-FAILURE "
|
||||
/** Network block temporarily disabled (e.g., due to authentication failure) */
|
||||
#define WPA_EVENT_TEMP_DISABLED "CTRL-EVENT-SSID-TEMP-DISABLED "
|
||||
/** Temporarily disabled network block re-enabled */
|
||||
#define WPA_EVENT_REENABLED "CTRL-EVENT-SSID-REENABLED "
|
||||
/** New scan started */
|
||||
#define WPA_EVENT_SCAN_STARTED "CTRL-EVENT-SCAN-STARTED "
|
||||
/** New scan results available */
|
||||
#define WPA_EVENT_SCAN_RESULTS "CTRL-EVENT-SCAN-RESULTS "
|
||||
/** Scan command failed */
|
||||
#define WPA_EVENT_SCAN_FAILED "CTRL-EVENT-SCAN-FAILED "
|
||||
/** wpa_supplicant state change */
|
||||
#define WPA_EVENT_STATE_CHANGE "CTRL-EVENT-STATE-CHANGE "
|
||||
/** A new BSS entry was added (followed by BSS entry id and BSSID) */
|
||||
#define WPA_EVENT_BSS_ADDED "CTRL-EVENT-BSS-ADDED "
|
||||
/** A BSS entry was removed (followed by BSS entry id and BSSID) */
|
||||
#define WPA_EVENT_BSS_REMOVED "CTRL-EVENT-BSS-REMOVED "
|
||||
/** No suitable network was found */
|
||||
#define WPA_EVENT_NETWORK_NOT_FOUND "CTRL-EVENT-NETWORK-NOT-FOUND "
|
||||
/** Change in the signal level was reported by the driver */
|
||||
#define WPA_EVENT_SIGNAL_CHANGE "CTRL-EVENT-SIGNAL-CHANGE "
|
||||
/** Regulatory domain channel */
|
||||
#define WPA_EVENT_REGDOM_CHANGE "CTRL-EVENT-REGDOM-CHANGE "
|
||||
/** Channel switch (followed by freq=<MHz> and other channel parameters) */
|
||||
#define WPA_EVENT_CHANNEL_SWITCH "CTRL-EVENT-CHANNEL-SWITCH "
|
||||
|
||||
/** IP subnet status change notification
|
||||
*
|
||||
* When using an offloaded roaming mechanism where driver/firmware takes care
|
||||
* of roaming and IP subnet validation checks post-roaming, this event can
|
||||
* indicate whether IP subnet has changed.
|
||||
*
|
||||
* The event has a status=<0/1/2> parameter where
|
||||
* 0 = unknown
|
||||
* 1 = IP subnet unchanged (can continue to use the old IP address)
|
||||
* 2 = IP subnet changed (need to get a new IP address)
|
||||
*/
|
||||
#define WPA_EVENT_SUBNET_STATUS_UPDATE "CTRL-EVENT-SUBNET-STATUS-UPDATE "
|
||||
|
||||
/** RSN IBSS 4-way handshakes completed with specified peer */
|
||||
#define IBSS_RSN_COMPLETED "IBSS-RSN-COMPLETED "
|
||||
|
||||
/** Notification of frequency conflict due to a concurrent operation.
|
||||
*
|
||||
* The indicated network is disabled and needs to be re-enabled before it can
|
||||
* be used again.
|
||||
*/
|
||||
#define WPA_EVENT_FREQ_CONFLICT "CTRL-EVENT-FREQ-CONFLICT "
|
||||
/** Frequency ranges that the driver recommends to avoid */
|
||||
#define WPA_EVENT_AVOID_FREQ "CTRL-EVENT-AVOID-FREQ "
|
||||
/** WPS overlap detected in PBC mode */
|
||||
#define WPS_EVENT_OVERLAP "WPS-OVERLAP-DETECTED "
|
||||
/** Available WPS AP with active PBC found in scan results */
|
||||
#define WPS_EVENT_AP_AVAILABLE_PBC "WPS-AP-AVAILABLE-PBC "
|
||||
/** Available WPS AP with our address as authorized in scan results */
|
||||
#define WPS_EVENT_AP_AVAILABLE_AUTH "WPS-AP-AVAILABLE-AUTH "
|
||||
/** Available WPS AP with recently selected PIN registrar found in scan results
|
||||
*/
|
||||
#define WPS_EVENT_AP_AVAILABLE_PIN "WPS-AP-AVAILABLE-PIN "
|
||||
/** Available WPS AP found in scan results */
|
||||
#define WPS_EVENT_AP_AVAILABLE "WPS-AP-AVAILABLE "
|
||||
/** A new credential received */
|
||||
#define WPS_EVENT_CRED_RECEIVED "WPS-CRED-RECEIVED "
|
||||
/** M2D received */
|
||||
#define WPS_EVENT_M2D "WPS-M2D "
|
||||
/** WPS registration failed after M2/M2D */
|
||||
#define WPS_EVENT_FAIL "WPS-FAIL "
|
||||
/** WPS registration completed successfully */
|
||||
#define WPS_EVENT_SUCCESS "WPS-SUCCESS "
|
||||
/** WPS enrollment attempt timed out and was terminated */
|
||||
#define WPS_EVENT_TIMEOUT "WPS-TIMEOUT "
|
||||
/* PBC mode was activated */
|
||||
#define WPS_EVENT_ACTIVE "WPS-PBC-ACTIVE "
|
||||
/* PBC mode was disabled */
|
||||
#define WPS_EVENT_DISABLE "WPS-PBC-DISABLE "
|
||||
|
||||
#define WPS_EVENT_ENROLLEE_SEEN "WPS-ENROLLEE-SEEN "
|
||||
|
||||
#define WPS_EVENT_OPEN_NETWORK "WPS-OPEN-NETWORK "
|
||||
|
||||
/* WPS ER events */
|
||||
#define WPS_EVENT_ER_AP_ADD "WPS-ER-AP-ADD "
|
||||
#define WPS_EVENT_ER_AP_REMOVE "WPS-ER-AP-REMOVE "
|
||||
#define WPS_EVENT_ER_ENROLLEE_ADD "WPS-ER-ENROLLEE-ADD "
|
||||
#define WPS_EVENT_ER_ENROLLEE_REMOVE "WPS-ER-ENROLLEE-REMOVE "
|
||||
#define WPS_EVENT_ER_AP_SETTINGS "WPS-ER-AP-SETTINGS "
|
||||
#define WPS_EVENT_ER_SET_SEL_REG "WPS-ER-AP-SET-SEL-REG "
|
||||
|
||||
/* MESH events */
|
||||
#define MESH_GROUP_STARTED "MESH-GROUP-STARTED "
|
||||
#define MESH_GROUP_REMOVED "MESH-GROUP-REMOVED "
|
||||
#define MESH_PEER_CONNECTED "MESH-PEER-CONNECTED "
|
||||
#define MESH_PEER_DISCONNECTED "MESH-PEER-DISCONNECTED "
|
||||
/** Mesh SAE authentication failure. Wrong password suspected. */
|
||||
#define MESH_SAE_AUTH_FAILURE "MESH-SAE-AUTH-FAILURE "
|
||||
#define MESH_SAE_AUTH_BLOCKED "MESH-SAE-AUTH-BLOCKED "
|
||||
|
||||
/* WMM AC events */
|
||||
#define WMM_AC_EVENT_TSPEC_ADDED "TSPEC-ADDED "
|
||||
#define WMM_AC_EVENT_TSPEC_REMOVED "TSPEC-REMOVED "
|
||||
#define WMM_AC_EVENT_TSPEC_REQ_FAILED "TSPEC-REQ-FAILED "
|
||||
|
||||
/** P2P device found */
|
||||
#define P2P_EVENT_DEVICE_FOUND "P2P-DEVICE-FOUND "
|
||||
|
||||
/** P2P device lost */
|
||||
#define P2P_EVENT_DEVICE_LOST "P2P-DEVICE-LOST "
|
||||
|
||||
/** A P2P device requested GO negotiation, but we were not ready to start the
|
||||
* negotiation */
|
||||
#define P2P_EVENT_GO_NEG_REQUEST "P2P-GO-NEG-REQUEST "
|
||||
#define P2P_EVENT_GO_NEG_SUCCESS "P2P-GO-NEG-SUCCESS "
|
||||
#define P2P_EVENT_GO_NEG_FAILURE "P2P-GO-NEG-FAILURE "
|
||||
#define P2P_EVENT_GROUP_FORMATION_SUCCESS "P2P-GROUP-FORMATION-SUCCESS "
|
||||
#define P2P_EVENT_GROUP_FORMATION_FAILURE "P2P-GROUP-FORMATION-FAILURE "
|
||||
#define P2P_EVENT_GROUP_STARTED "P2P-GROUP-STARTED "
|
||||
#define P2P_EVENT_GROUP_REMOVED "P2P-GROUP-REMOVED "
|
||||
#define P2P_EVENT_CROSS_CONNECT_ENABLE "P2P-CROSS-CONNECT-ENABLE "
|
||||
#define P2P_EVENT_CROSS_CONNECT_DISABLE "P2P-CROSS-CONNECT-DISABLE "
|
||||
/* parameters: <peer address> <PIN> */
|
||||
#define P2P_EVENT_PROV_DISC_SHOW_PIN "P2P-PROV-DISC-SHOW-PIN "
|
||||
/* parameters: <peer address> */
|
||||
#define P2P_EVENT_PROV_DISC_ENTER_PIN "P2P-PROV-DISC-ENTER-PIN "
|
||||
/* parameters: <peer address> */
|
||||
#define P2P_EVENT_PROV_DISC_PBC_REQ "P2P-PROV-DISC-PBC-REQ "
|
||||
/* parameters: <peer address> */
|
||||
#define P2P_EVENT_PROV_DISC_PBC_RESP "P2P-PROV-DISC-PBC-RESP "
|
||||
/* parameters: <peer address> <status> */
|
||||
#define P2P_EVENT_PROV_DISC_FAILURE "P2P-PROV-DISC-FAILURE"
|
||||
/* parameters: <freq> <src addr> <dialog token> <update indicator> <TLVs> */
|
||||
#define P2P_EVENT_SERV_DISC_REQ "P2P-SERV-DISC-REQ "
|
||||
/* parameters: <src addr> <update indicator> <TLVs> */
|
||||
#define P2P_EVENT_SERV_DISC_RESP "P2P-SERV-DISC-RESP "
|
||||
#define P2P_EVENT_SERV_ASP_RESP "P2P-SERV-ASP-RESP "
|
||||
#define P2P_EVENT_INVITATION_RECEIVED "P2P-INVITATION-RECEIVED "
|
||||
#define P2P_EVENT_INVITATION_RESULT "P2P-INVITATION-RESULT "
|
||||
#define P2P_EVENT_INVITATION_ACCEPTED "P2P-INVITATION-ACCEPTED "
|
||||
#define P2P_EVENT_FIND_STOPPED "P2P-FIND-STOPPED "
|
||||
#define P2P_EVENT_PERSISTENT_PSK_FAIL "P2P-PERSISTENT-PSK-FAIL id="
|
||||
#define P2P_EVENT_PRESENCE_RESPONSE "P2P-PRESENCE-RESPONSE "
|
||||
#define P2P_EVENT_NFC_BOTH_GO "P2P-NFC-BOTH-GO "
|
||||
#define P2P_EVENT_NFC_PEER_CLIENT "P2P-NFC-PEER-CLIENT "
|
||||
#define P2P_EVENT_NFC_WHILE_CLIENT "P2P-NFC-WHILE-CLIENT "
|
||||
#define P2P_EVENT_FALLBACK_TO_GO_NEG "P2P-FALLBACK-TO-GO-NEG "
|
||||
#define P2P_EVENT_FALLBACK_TO_GO_NEG_ENABLED "P2P-FALLBACK-TO-GO-NEG-ENABLED "
|
||||
|
||||
/* parameters: <PMF enabled> <timeout in ms> <Session Information URL> */
|
||||
#define ESS_DISASSOC_IMMINENT "ESS-DISASSOC-IMMINENT "
|
||||
#define P2P_EVENT_REMOVE_AND_REFORM_GROUP "P2P-REMOVE-AND-REFORM-GROUP "
|
||||
|
||||
#define P2P_EVENT_P2PS_PROVISION_START "P2PS-PROV-START "
|
||||
#define P2P_EVENT_P2PS_PROVISION_DONE "P2PS-PROV-DONE "
|
||||
|
||||
#define INTERWORKING_AP "INTERWORKING-AP "
|
||||
#define INTERWORKING_BLACKLISTED "INTERWORKING-BLACKLISTED "
|
||||
#define INTERWORKING_NO_MATCH "INTERWORKING-NO-MATCH "
|
||||
#define INTERWORKING_ALREADY_CONNECTED "INTERWORKING-ALREADY-CONNECTED "
|
||||
#define INTERWORKING_SELECTED "INTERWORKING-SELECTED "
|
||||
|
||||
/* Credential block added; parameters: <id> */
|
||||
#define CRED_ADDED "CRED-ADDED "
|
||||
/* Credential block modified; parameters: <id> <field> */
|
||||
#define CRED_MODIFIED "CRED-MODIFIED "
|
||||
/* Credential block removed; parameters: <id> */
|
||||
#define CRED_REMOVED "CRED-REMOVED "
|
||||
|
||||
#define GAS_RESPONSE_INFO "GAS-RESPONSE-INFO "
|
||||
/* parameters: <addr> <dialog_token> <freq> */
|
||||
#define GAS_QUERY_START "GAS-QUERY-START "
|
||||
/* parameters: <addr> <dialog_token> <freq> <status_code> <result> */
|
||||
#define GAS_QUERY_DONE "GAS-QUERY-DONE "
|
||||
|
||||
/* parameters: <addr> <result> */
|
||||
#define ANQP_QUERY_DONE "ANQP-QUERY-DONE "
|
||||
|
||||
#define RX_ANQP "RX-ANQP "
|
||||
#define RX_HS20_ANQP "RX-HS20-ANQP "
|
||||
#define RX_HS20_ANQP_ICON "RX-HS20-ANQP-ICON "
|
||||
#define RX_HS20_ICON "RX-HS20-ICON "
|
||||
|
||||
#define HS20_SUBSCRIPTION_REMEDIATION "HS20-SUBSCRIPTION-REMEDIATION "
|
||||
#define HS20_DEAUTH_IMMINENT_NOTICE "HS20-DEAUTH-IMMINENT-NOTICE "
|
||||
|
||||
#define EXT_RADIO_WORK_START "EXT-RADIO-WORK-START "
|
||||
#define EXT_RADIO_WORK_TIMEOUT "EXT-RADIO-WORK-TIMEOUT "
|
||||
|
||||
#define RRM_EVENT_NEIGHBOR_REP_RXED "RRM-NEIGHBOR-REP-RECEIVED "
|
||||
#define RRM_EVENT_NEIGHBOR_REP_FAILED "RRM-NEIGHBOR-REP-REQUEST-FAILED "
|
||||
|
||||
/* hostapd control interface - fixed message prefixes */
|
||||
#define WPS_EVENT_PIN_NEEDED "WPS-PIN-NEEDED "
|
||||
#define WPS_EVENT_NEW_AP_SETTINGS "WPS-NEW-AP-SETTINGS "
|
||||
#define WPS_EVENT_REG_SUCCESS "WPS-REG-SUCCESS "
|
||||
#define WPS_EVENT_AP_SETUP_LOCKED "WPS-AP-SETUP-LOCKED "
|
||||
#define WPS_EVENT_AP_SETUP_UNLOCKED "WPS-AP-SETUP-UNLOCKED "
|
||||
#define WPS_EVENT_AP_PIN_ENABLED "WPS-AP-PIN-ENABLED "
|
||||
#define WPS_EVENT_AP_PIN_DISABLED "WPS-AP-PIN-DISABLED "
|
||||
#define AP_STA_CONNECTED "AP-STA-CONNECTED "
|
||||
#define AP_STA_DISCONNECTED "AP-STA-DISCONNECTED "
|
||||
#define AP_STA_POSSIBLE_PSK_MISMATCH "AP-STA-POSSIBLE-PSK-MISMATCH "
|
||||
#define AP_STA_POLL_OK "AP-STA-POLL-OK "
|
||||
|
||||
#define AP_REJECTED_MAX_STA "AP-REJECTED-MAX-STA "
|
||||
#define AP_REJECTED_BLOCKED_STA "AP-REJECTED-BLOCKED-STA "
|
||||
|
||||
#define AP_EVENT_ENABLED "AP-ENABLED "
|
||||
#define AP_EVENT_DISABLED "AP-DISABLED "
|
||||
|
||||
#define INTERFACE_ENABLED "INTERFACE-ENABLED "
|
||||
#define INTERFACE_DISABLED "INTERFACE-DISABLED "
|
||||
|
||||
#define ACS_EVENT_STARTED "ACS-STARTED "
|
||||
#define ACS_EVENT_COMPLETED "ACS-COMPLETED "
|
||||
#define ACS_EVENT_FAILED "ACS-FAILED "
|
||||
|
||||
#define DFS_EVENT_RADAR_DETECTED "DFS-RADAR-DETECTED "
|
||||
#define DFS_EVENT_NEW_CHANNEL "DFS-NEW-CHANNEL "
|
||||
#define DFS_EVENT_CAC_START "DFS-CAC-START "
|
||||
#define DFS_EVENT_CAC_COMPLETED "DFS-CAC-COMPLETED "
|
||||
#define DFS_EVENT_NOP_FINISHED "DFS-NOP-FINISHED "
|
||||
|
||||
#define AP_CSA_FINISHED "AP-CSA-FINISHED "
|
||||
|
||||
#define P2P_EVENT_LISTEN_OFFLOAD_STOP "P2P-LISTEN-OFFLOAD-STOPPED "
|
||||
#define P2P_LISTEN_OFFLOAD_STOP_REASON "P2P-LISTEN-OFFLOAD-STOP-REASON "
|
||||
|
||||
/* BSS Transition Management Response frame received */
|
||||
#define BSS_TM_RESP "BSS-TM-RESP "
|
||||
|
||||
/* MBO IE with cellular data connection preference received */
|
||||
#define MBO_CELL_PREFERENCE "MBO-CELL-PREFERENCE "
|
||||
|
||||
/* BSS Transition Management Request received with MBO transition reason */
|
||||
#define MBO_TRANSITION_REASON "MBO-TRANSITION-REASON "
|
||||
|
||||
/* BSS command information masks */
|
||||
|
||||
#define WPA_BSS_MASK_ALL 0xFFFDFFFF
|
||||
#define WPA_BSS_MASK_ID BIT(0)
|
||||
#define WPA_BSS_MASK_BSSID BIT(1)
|
||||
#define WPA_BSS_MASK_FREQ BIT(2)
|
||||
#define WPA_BSS_MASK_BEACON_INT BIT(3)
|
||||
#define WPA_BSS_MASK_CAPABILITIES BIT(4)
|
||||
#define WPA_BSS_MASK_QUAL BIT(5)
|
||||
#define WPA_BSS_MASK_NOISE BIT(6)
|
||||
#define WPA_BSS_MASK_LEVEL BIT(7)
|
||||
#define WPA_BSS_MASK_TSF BIT(8)
|
||||
#define WPA_BSS_MASK_AGE BIT(9)
|
||||
#define WPA_BSS_MASK_IE BIT(10)
|
||||
#define WPA_BSS_MASK_FLAGS BIT(11)
|
||||
#define WPA_BSS_MASK_SSID BIT(12)
|
||||
#define WPA_BSS_MASK_WPS_SCAN BIT(13)
|
||||
#define WPA_BSS_MASK_P2P_SCAN BIT(14)
|
||||
#define WPA_BSS_MASK_INTERNETW BIT(15)
|
||||
#define WPA_BSS_MASK_WIFI_DISPLAY BIT(16)
|
||||
#define WPA_BSS_MASK_DELIM BIT(17)
|
||||
#define WPA_BSS_MASK_MESH_SCAN BIT(18)
|
||||
#define WPA_BSS_MASK_SNR BIT(19)
|
||||
#define WPA_BSS_MASK_EST_THROUGHPUT BIT(20)
|
||||
#define WPA_BSS_MASK_FST BIT(21)
|
||||
|
||||
|
||||
/* VENDOR_ELEM_* frame id values */
|
||||
enum wpa_vendor_elem_frame {
|
||||
VENDOR_ELEM_PROBE_REQ_P2P = 0,
|
||||
VENDOR_ELEM_PROBE_RESP_P2P = 1,
|
||||
VENDOR_ELEM_PROBE_RESP_P2P_GO = 2,
|
||||
VENDOR_ELEM_BEACON_P2P_GO = 3,
|
||||
VENDOR_ELEM_P2P_PD_REQ = 4,
|
||||
VENDOR_ELEM_P2P_PD_RESP = 5,
|
||||
VENDOR_ELEM_P2P_GO_NEG_REQ = 6,
|
||||
VENDOR_ELEM_P2P_GO_NEG_RESP = 7,
|
||||
VENDOR_ELEM_P2P_GO_NEG_CONF = 8,
|
||||
VENDOR_ELEM_P2P_INV_REQ = 9,
|
||||
VENDOR_ELEM_P2P_INV_RESP = 10,
|
||||
VENDOR_ELEM_P2P_ASSOC_REQ = 11,
|
||||
VENDOR_ELEM_P2P_ASSOC_RESP = 12,
|
||||
VENDOR_ELEM_ASSOC_REQ = 13,
|
||||
VENDOR_ELEM_PROBE_REQ = 14,
|
||||
NUM_VENDOR_ELEM_FRAMES
|
||||
};
|
||||
|
||||
|
||||
/* wpa_supplicant/hostapd control interface access */
|
||||
|
||||
/**
|
||||
* wpa_ctrl_open - Open a control interface to wpa_supplicant/hostapd
|
||||
* @ctrl_path: Path for UNIX domain sockets; ignored if UDP sockets are used.
|
||||
* Returns: Pointer to abstract control interface data or %NULL on failure
|
||||
*
|
||||
* This function is used to open a control interface to wpa_supplicant/hostapd.
|
||||
* ctrl_path is usually /var/run/wpa_supplicant or /var/run/hostapd. This path
|
||||
* is configured in wpa_supplicant/hostapd and other programs using the control
|
||||
* interface need to use matching path configuration.
|
||||
*/
|
||||
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
|
||||
|
||||
/**
|
||||
* wpa_ctrl_open2 - Open a control interface to wpa_supplicant/hostapd
|
||||
* @ctrl_path: Path for UNIX domain sockets; ignored if UDP sockets are used.
|
||||
* @cli_path: Path for client UNIX domain sockets; ignored if UDP socket
|
||||
* is used.
|
||||
* Returns: Pointer to abstract control interface data or %NULL on failure
|
||||
*
|
||||
* This function is used to open a control interface to wpa_supplicant/hostapd
|
||||
* when the socket path for client need to be specified explicitly. Default
|
||||
* ctrl_path is usually /var/run/wpa_supplicant or /var/run/hostapd and client
|
||||
* socket path is /tmp.
|
||||
*/
|
||||
struct wpa_ctrl * wpa_ctrl_open2(const char *ctrl_path, const char *cli_path);
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_close - Close a control interface to wpa_supplicant/hostapd
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
*
|
||||
* This function is used to close a control interface.
|
||||
*/
|
||||
void wpa_ctrl_close(struct wpa_ctrl *ctrl);
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_request - Send a command to wpa_supplicant/hostapd
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
* @cmd: Command; usually, ASCII text, e.g., "PING"
|
||||
* @cmd_len: Length of the cmd in bytes
|
||||
* @reply: Buffer for the response
|
||||
* @reply_len: Reply buffer length
|
||||
* @msg_cb: Callback function for unsolicited messages or %NULL if not used
|
||||
* Returns: 0 on success, -1 on error (send or receive failed), -2 on timeout
|
||||
*
|
||||
* This function is used to send commands to wpa_supplicant/hostapd. Received
|
||||
* response will be written to reply and reply_len is set to the actual length
|
||||
* of the reply. This function will block for up to two seconds while waiting
|
||||
* for the reply. If unsolicited messages are received, the blocking time may
|
||||
* be longer.
|
||||
*
|
||||
* msg_cb can be used to register a callback function that will be called for
|
||||
* unsolicited messages received while waiting for the command response. These
|
||||
* messages may be received if wpa_ctrl_request() is called at the same time as
|
||||
* wpa_supplicant/hostapd is sending such a message. This can happen only if
|
||||
* the program has used wpa_ctrl_attach() to register itself as a monitor for
|
||||
* event messages. Alternatively to msg_cb, programs can register two control
|
||||
* interface connections and use one of them for commands and the other one for
|
||||
* receiving event messages, in other words, call wpa_ctrl_attach() only for
|
||||
* the control interface connection that will be used for event messages.
|
||||
*/
|
||||
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
|
||||
char *reply, size_t *reply_len,
|
||||
void (*msg_cb)(char *msg, size_t len));
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_attach - Register as an event monitor for the control interface
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
* Returns: 0 on success, -1 on failure, -2 on timeout
|
||||
*
|
||||
* This function registers the control interface connection as a monitor for
|
||||
* wpa_supplicant/hostapd events. After a success wpa_ctrl_attach() call, the
|
||||
* control interface connection starts receiving event messages that can be
|
||||
* read with wpa_ctrl_recv().
|
||||
*/
|
||||
int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_detach - Unregister event monitor from the control interface
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
* Returns: 0 on success, -1 on failure, -2 on timeout
|
||||
*
|
||||
* This function unregisters the control interface connection as a monitor for
|
||||
* wpa_supplicant/hostapd events, i.e., cancels the registration done with
|
||||
* wpa_ctrl_attach().
|
||||
*/
|
||||
int wpa_ctrl_detach(struct wpa_ctrl *ctrl);
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_recv - Receive a pending control interface message
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
* @reply: Buffer for the message data
|
||||
* @reply_len: Length of the reply buffer
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*
|
||||
* This function will receive a pending control interface message. The received
|
||||
* response will be written to reply and reply_len is set to the actual length
|
||||
* of the reply.
|
||||
|
||||
* wpa_ctrl_recv() is only used for event messages, i.e., wpa_ctrl_attach()
|
||||
* must have been used to register the control interface as an event monitor.
|
||||
*/
|
||||
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_pending - Check whether there are pending event messages
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
* Returns: 1 if there are pending messages, 0 if no, or -1 on error
|
||||
*
|
||||
* This function will check whether there are any pending control interface
|
||||
* message available to be received with wpa_ctrl_recv(). wpa_ctrl_pending() is
|
||||
* only used for event messages, i.e., wpa_ctrl_attach() must have been used to
|
||||
* register the control interface as an event monitor.
|
||||
*/
|
||||
int wpa_ctrl_pending(struct wpa_ctrl *ctrl);
|
||||
|
||||
|
||||
/**
|
||||
* wpa_ctrl_get_fd - Get file descriptor used by the control interface
|
||||
* @ctrl: Control interface data from wpa_ctrl_open()
|
||||
* Returns: File descriptor used for the connection
|
||||
*
|
||||
* This function can be used to get the file descriptor that is used for the
|
||||
* control interface connection. The returned value can be used, e.g., with
|
||||
* select() while waiting for multiple events.
|
||||
*
|
||||
* The returned file descriptor must not be used directly for sending or
|
||||
* receiving packets; instead, the library functions wpa_ctrl_request() and
|
||||
* wpa_ctrl_recv() must be used for this.
|
||||
*/
|
||||
int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);
|
||||
|
||||
#ifdef ANDROID
|
||||
/**
|
||||
* wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that
|
||||
* may be left over from clients that were previously connected to
|
||||
* wpa_supplicant. This keeps these files from being orphaned in the
|
||||
* event of crashes that prevented them from being removed as part
|
||||
* of the normal orderly shutdown.
|
||||
*/
|
||||
void wpa_ctrl_cleanup(void);
|
||||
#endif /* ANDROID */
|
||||
|
||||
#ifdef CONFIG_CTRL_IFACE_UDP
|
||||
/* Port range for multiple wpa_supplicant instances and multiple VIFs */
|
||||
#define WPA_CTRL_IFACE_PORT 9877
|
||||
#define WPA_CTRL_IFACE_PORT_LIMIT 50 /* decremented from start */
|
||||
#define WPA_GLOBAL_CTRL_IFACE_PORT 9878
|
||||
#define WPA_GLOBAL_CTRL_IFACE_PORT_LIMIT 20 /* incremented from start */
|
||||
|
||||
char * wpa_ctrl_get_remote_ifname(struct wpa_ctrl *ctrl);
|
||||
#endif /* CONFIG_CTRL_IFACE_UDP */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* WPA_CTRL_H */
|
||||
50
wpa_supplicant/src/utils/build_config.h
Normal file
50
wpa_supplicant/src/utils/build_config.h
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* wpa_supplicant/hostapd - Build time configuration defines
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*
|
||||
* This header file can be used to define configuration defines that were
|
||||
* originally defined in Makefile. This is mainly meant for IDE use or for
|
||||
* systems that do not have suitable 'make' tool. In these cases, it may be
|
||||
* easier to have a single place for defining all the needed C pre-processor
|
||||
* defines.
|
||||
*/
|
||||
|
||||
#ifndef BUILD_CONFIG_H
|
||||
#define BUILD_CONFIG_H
|
||||
|
||||
/* Insert configuration defines, e.g., #define EAP_MD5, here, if needed. */
|
||||
|
||||
#ifdef CONFIG_WIN32_DEFAULTS
|
||||
#define CONFIG_NATIVE_WINDOWS
|
||||
#define CONFIG_ANSI_C_EXTRA
|
||||
#define CONFIG_WINPCAP
|
||||
#define IEEE8021X_EAPOL
|
||||
#define PKCS12_FUNCS
|
||||
#define PCSC_FUNCS
|
||||
#define CONFIG_CTRL_IFACE
|
||||
#define CONFIG_CTRL_IFACE_NAMED_PIPE
|
||||
#define CONFIG_DRIVER_NDIS
|
||||
#define CONFIG_NDIS_EVENTS_INTEGRATED
|
||||
#define CONFIG_DEBUG_FILE
|
||||
#define EAP_MD5
|
||||
#define EAP_TLS
|
||||
#define EAP_MSCHAPv2
|
||||
#define EAP_PEAP
|
||||
#define EAP_TTLS
|
||||
#define EAP_GTC
|
||||
#define EAP_OTP
|
||||
#define EAP_LEAP
|
||||
#define EAP_TNC
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#ifdef USE_INTERNAL_CRYPTO
|
||||
#define CONFIG_TLS_INTERNAL_CLIENT
|
||||
#define CONFIG_INTERNAL_LIBTOMMATH
|
||||
#define CONFIG_CRYPTO_INTERNAL
|
||||
#endif /* USE_INTERNAL_CRYPTO */
|
||||
#endif /* CONFIG_WIN32_DEFAULTS */
|
||||
|
||||
#endif /* BUILD_CONFIG_H */
|
||||
575
wpa_supplicant/src/utils/common.h
Normal file
575
wpa_supplicant/src/utils/common.h
Normal file
|
|
@ -0,0 +1,575 @@
|
|||
/*
|
||||
* wpa_supplicant/hostapd / common helper functions, etc.
|
||||
* Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef COMMON_H
|
||||
#define COMMON_H
|
||||
|
||||
#include "os.h"
|
||||
|
||||
#if defined(__linux__) || defined(__GLIBC__)
|
||||
#include <endian.h>
|
||||
#include <byteswap.h>
|
||||
#endif /* __linux__ */
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \
|
||||
defined(__OpenBSD__)
|
||||
#include <sys/types.h>
|
||||
#include <sys/endian.h>
|
||||
#define __BYTE_ORDER _BYTE_ORDER
|
||||
#define __LITTLE_ENDIAN _LITTLE_ENDIAN
|
||||
#define __BIG_ENDIAN _BIG_ENDIAN
|
||||
#ifdef __OpenBSD__
|
||||
#define bswap_16 swap16
|
||||
#define bswap_32 swap32
|
||||
#define bswap_64 swap64
|
||||
#else /* __OpenBSD__ */
|
||||
#define bswap_16 bswap16
|
||||
#define bswap_32 bswap32
|
||||
#define bswap_64 bswap64
|
||||
#endif /* __OpenBSD__ */
|
||||
#endif /* defined(__FreeBSD__) || defined(__NetBSD__) ||
|
||||
* defined(__DragonFly__) || defined(__OpenBSD__) */
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <sys/types.h>
|
||||
#include <machine/endian.h>
|
||||
#define __BYTE_ORDER _BYTE_ORDER
|
||||
#define __LITTLE_ENDIAN _LITTLE_ENDIAN
|
||||
#define __BIG_ENDIAN _BIG_ENDIAN
|
||||
static inline unsigned short bswap_16(unsigned short v)
|
||||
{
|
||||
return ((v & 0xff) << 8) | (v >> 8);
|
||||
}
|
||||
|
||||
static inline unsigned int bswap_32(unsigned int v)
|
||||
{
|
||||
return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
|
||||
((v & 0xff0000) >> 8) | (v >> 24);
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
#include <winsock.h>
|
||||
|
||||
typedef int socklen_t;
|
||||
|
||||
#ifndef MSG_DONTWAIT
|
||||
#define MSG_DONTWAIT 0 /* not supported */
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define inline __inline
|
||||
|
||||
#undef vsnprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
#undef close
|
||||
#define close closesocket
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
|
||||
/* Define platform specific integer types */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
typedef UINT64 u64;
|
||||
typedef UINT32 u32;
|
||||
typedef UINT16 u16;
|
||||
typedef UINT8 u8;
|
||||
typedef INT64 s64;
|
||||
typedef INT32 s32;
|
||||
typedef INT16 s16;
|
||||
typedef INT8 s8;
|
||||
#define WPA_TYPES_DEFINED
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
#ifdef __vxworks
|
||||
typedef unsigned long long u64;
|
||||
typedef UINT32 u32;
|
||||
typedef UINT16 u16;
|
||||
typedef UINT8 u8;
|
||||
typedef long long s64;
|
||||
typedef INT32 s32;
|
||||
typedef INT16 s16;
|
||||
typedef INT8 s8;
|
||||
#define WPA_TYPES_DEFINED
|
||||
#endif /* __vxworks */
|
||||
|
||||
#ifndef WPA_TYPES_DEFINED
|
||||
#ifdef CONFIG_USE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
typedef uint64_t u64;
|
||||
typedef uint32_t u32;
|
||||
typedef uint16_t u16;
|
||||
typedef uint8_t u8;
|
||||
typedef int64_t s64;
|
||||
typedef int32_t s32;
|
||||
typedef int16_t s16;
|
||||
typedef int8_t s8;
|
||||
#define WPA_TYPES_DEFINED
|
||||
#endif /* !WPA_TYPES_DEFINED */
|
||||
|
||||
|
||||
/* Define platform specific byte swapping macros */
|
||||
|
||||
#if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS)
|
||||
|
||||
static inline unsigned short wpa_swap_16(unsigned short v)
|
||||
{
|
||||
return ((v & 0xff) << 8) | (v >> 8);
|
||||
}
|
||||
|
||||
static inline unsigned int wpa_swap_32(unsigned int v)
|
||||
{
|
||||
return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
|
||||
((v & 0xff0000) >> 8) | (v >> 24);
|
||||
}
|
||||
|
||||
#define le_to_host16(n) (n)
|
||||
#define host_to_le16(n) (n)
|
||||
#define be_to_host16(n) wpa_swap_16(n)
|
||||
#define host_to_be16(n) wpa_swap_16(n)
|
||||
#define le_to_host32(n) (n)
|
||||
#define host_to_le32(n) (n)
|
||||
#define be_to_host32(n) wpa_swap_32(n)
|
||||
#define host_to_be32(n) wpa_swap_32(n)
|
||||
|
||||
#define WPA_BYTE_SWAP_DEFINED
|
||||
|
||||
#endif /* __CYGWIN__ || CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
|
||||
#ifndef WPA_BYTE_SWAP_DEFINED
|
||||
|
||||
#ifndef __BYTE_ORDER
|
||||
#ifndef __LITTLE_ENDIAN
|
||||
#ifndef __BIG_ENDIAN
|
||||
#define __LITTLE_ENDIAN 1234
|
||||
#define __BIG_ENDIAN 4321
|
||||
#if defined(sparc)
|
||||
#define __BYTE_ORDER __BIG_ENDIAN
|
||||
#endif
|
||||
#endif /* __BIG_ENDIAN */
|
||||
#endif /* __LITTLE_ENDIAN */
|
||||
#endif /* __BYTE_ORDER */
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
#define le_to_host16(n) ((__force u16) (le16) (n))
|
||||
#define host_to_le16(n) ((__force le16) (u16) (n))
|
||||
#define be_to_host16(n) bswap_16((__force u16) (be16) (n))
|
||||
#define host_to_be16(n) ((__force be16) bswap_16((n)))
|
||||
#define le_to_host32(n) ((__force u32) (le32) (n))
|
||||
#define host_to_le32(n) ((__force le32) (u32) (n))
|
||||
#define be_to_host32(n) bswap_32((__force u32) (be32) (n))
|
||||
#define host_to_be32(n) ((__force be32) bswap_32((n)))
|
||||
#define le_to_host64(n) ((__force u64) (le64) (n))
|
||||
#define host_to_le64(n) ((__force le64) (u64) (n))
|
||||
#define be_to_host64(n) bswap_64((__force u64) (be64) (n))
|
||||
#define host_to_be64(n) ((__force be64) bswap_64((n)))
|
||||
#elif __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define le_to_host16(n) bswap_16(n)
|
||||
#define host_to_le16(n) bswap_16(n)
|
||||
#define be_to_host16(n) (n)
|
||||
#define host_to_be16(n) (n)
|
||||
#define le_to_host32(n) bswap_32(n)
|
||||
#define host_to_le32(n) bswap_32(n)
|
||||
#define be_to_host32(n) (n)
|
||||
#define host_to_be32(n) (n)
|
||||
#define le_to_host64(n) bswap_64(n)
|
||||
#define host_to_le64(n) bswap_64(n)
|
||||
#define be_to_host64(n) (n)
|
||||
#define host_to_be64(n) (n)
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
#define WORDS_BIGENDIAN
|
||||
#endif
|
||||
#else
|
||||
#error Could not determine CPU byte order
|
||||
#endif
|
||||
|
||||
#define WPA_BYTE_SWAP_DEFINED
|
||||
#endif /* !WPA_BYTE_SWAP_DEFINED */
|
||||
|
||||
|
||||
/* Macros for handling unaligned memory accesses */
|
||||
|
||||
static inline u16 WPA_GET_BE16(const u8 *a)
|
||||
{
|
||||
return (a[0] << 8) | a[1];
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_BE16(u8 *a, u16 val)
|
||||
{
|
||||
a[0] = val >> 8;
|
||||
a[1] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline u16 WPA_GET_LE16(const u8 *a)
|
||||
{
|
||||
return (a[1] << 8) | a[0];
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_LE16(u8 *a, u16 val)
|
||||
{
|
||||
a[1] = val >> 8;
|
||||
a[0] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline u32 WPA_GET_BE24(const u8 *a)
|
||||
{
|
||||
return (a[0] << 16) | (a[1] << 8) | a[2];
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_BE24(u8 *a, u32 val)
|
||||
{
|
||||
a[0] = (val >> 16) & 0xff;
|
||||
a[1] = (val >> 8) & 0xff;
|
||||
a[2] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline u32 WPA_GET_BE32(const u8 *a)
|
||||
{
|
||||
return ((u32) a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_BE32(u8 *a, u32 val)
|
||||
{
|
||||
a[0] = (val >> 24) & 0xff;
|
||||
a[1] = (val >> 16) & 0xff;
|
||||
a[2] = (val >> 8) & 0xff;
|
||||
a[3] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline u32 WPA_GET_LE32(const u8 *a)
|
||||
{
|
||||
return ((u32) a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0];
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_LE32(u8 *a, u32 val)
|
||||
{
|
||||
a[3] = (val >> 24) & 0xff;
|
||||
a[2] = (val >> 16) & 0xff;
|
||||
a[1] = (val >> 8) & 0xff;
|
||||
a[0] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline u64 WPA_GET_BE64(const u8 *a)
|
||||
{
|
||||
return (((u64) a[0]) << 56) | (((u64) a[1]) << 48) |
|
||||
(((u64) a[2]) << 40) | (((u64) a[3]) << 32) |
|
||||
(((u64) a[4]) << 24) | (((u64) a[5]) << 16) |
|
||||
(((u64) a[6]) << 8) | ((u64) a[7]);
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_BE64(u8 *a, u64 val)
|
||||
{
|
||||
a[0] = val >> 56;
|
||||
a[1] = val >> 48;
|
||||
a[2] = val >> 40;
|
||||
a[3] = val >> 32;
|
||||
a[4] = val >> 24;
|
||||
a[5] = val >> 16;
|
||||
a[6] = val >> 8;
|
||||
a[7] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline u64 WPA_GET_LE64(const u8 *a)
|
||||
{
|
||||
return (((u64) a[7]) << 56) | (((u64) a[6]) << 48) |
|
||||
(((u64) a[5]) << 40) | (((u64) a[4]) << 32) |
|
||||
(((u64) a[3]) << 24) | (((u64) a[2]) << 16) |
|
||||
(((u64) a[1]) << 8) | ((u64) a[0]);
|
||||
}
|
||||
|
||||
static inline void WPA_PUT_LE64(u8 *a, u64 val)
|
||||
{
|
||||
a[7] = val >> 56;
|
||||
a[6] = val >> 48;
|
||||
a[5] = val >> 40;
|
||||
a[4] = val >> 32;
|
||||
a[3] = val >> 24;
|
||||
a[2] = val >> 16;
|
||||
a[1] = val >> 8;
|
||||
a[0] = val & 0xff;
|
||||
}
|
||||
|
||||
|
||||
#ifndef ETH_ALEN
|
||||
#define ETH_ALEN 6
|
||||
#endif
|
||||
#ifndef ETH_HLEN
|
||||
#define ETH_HLEN 14
|
||||
#endif
|
||||
#ifndef IFNAMSIZ
|
||||
#define IFNAMSIZ 16
|
||||
#endif
|
||||
#ifndef ETH_P_ALL
|
||||
#define ETH_P_ALL 0x0003
|
||||
#endif
|
||||
#ifndef ETH_P_IP
|
||||
#define ETH_P_IP 0x0800
|
||||
#endif
|
||||
#ifndef ETH_P_80211_ENCAP
|
||||
#define ETH_P_80211_ENCAP 0x890d /* TDLS comes under this category */
|
||||
#endif
|
||||
#ifndef ETH_P_PAE
|
||||
#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
|
||||
#endif /* ETH_P_PAE */
|
||||
#ifndef ETH_P_EAPOL
|
||||
#define ETH_P_EAPOL ETH_P_PAE
|
||||
#endif /* ETH_P_EAPOL */
|
||||
#ifndef ETH_P_RSN_PREAUTH
|
||||
#define ETH_P_RSN_PREAUTH 0x88c7
|
||||
#endif /* ETH_P_RSN_PREAUTH */
|
||||
#ifndef ETH_P_RRB
|
||||
#define ETH_P_RRB 0x890D
|
||||
#endif /* ETH_P_RRB */
|
||||
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b))))
|
||||
#define STRUCT_PACKED __attribute__ ((packed))
|
||||
#else
|
||||
#define PRINTF_FORMAT(a,b)
|
||||
#define STRUCT_PACKED
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_ANSI_C_EXTRA
|
||||
|
||||
#if !defined(_MSC_VER) || _MSC_VER < 1400
|
||||
/* snprintf - used in number of places; sprintf() is _not_ a good replacement
|
||||
* due to possible buffer overflow; see, e.g.,
|
||||
* http://www.ijs.si/software/snprintf/ for portable implementation of
|
||||
* snprintf. */
|
||||
int snprintf(char *str, size_t size, const char *format, ...);
|
||||
|
||||
/* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */
|
||||
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
|
||||
#endif /* !defined(_MSC_VER) || _MSC_VER < 1400 */
|
||||
|
||||
/* getopt - only used in main.c */
|
||||
int getopt(int argc, char *const argv[], const char *optstring);
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
#ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF
|
||||
#ifndef __socklen_t_defined
|
||||
typedef int socklen_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* inline - define as __inline or just define it to be empty, if needed */
|
||||
#ifdef CONFIG_NO_INLINE
|
||||
#define inline
|
||||
#else
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
#ifndef __func__
|
||||
#define __func__ "__func__ not defined"
|
||||
#endif
|
||||
|
||||
#ifndef bswap_16
|
||||
#define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff))
|
||||
#endif
|
||||
|
||||
#ifndef bswap_32
|
||||
#define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \
|
||||
(((u32) (a) << 8) & 0xff0000) | \
|
||||
(((u32) (a) >> 8) & 0xff00) | \
|
||||
(((u32) (a) >> 24) & 0xff))
|
||||
#endif
|
||||
|
||||
#ifndef MSG_DONTWAIT
|
||||
#define MSG_DONTWAIT 0
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
void perror(const char *s);
|
||||
#endif /* _WIN32_WCE */
|
||||
|
||||
#endif /* CONFIG_ANSI_C_EXTRA */
|
||||
|
||||
#ifndef MAC2STR
|
||||
#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
|
||||
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
|
||||
/*
|
||||
* Compact form for string representation of MAC address
|
||||
* To be used, e.g., for constructing dbus paths for P2P Devices
|
||||
*/
|
||||
#define COMPACT_MACSTR "%02x%02x%02x%02x%02x%02x"
|
||||
#endif
|
||||
|
||||
#ifndef BIT
|
||||
#define BIT(x) (1U << (x))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Definitions for sparse validation
|
||||
* (http://kernel.org/pub/linux/kernel/people/josh/sparse/)
|
||||
*/
|
||||
#ifdef __CHECKER__
|
||||
#define __force __attribute__((force))
|
||||
#undef __bitwise
|
||||
#define __bitwise __attribute__((bitwise))
|
||||
#else
|
||||
#define __force
|
||||
#define __bitwise
|
||||
#endif
|
||||
|
||||
typedef u16 __bitwise be16;
|
||||
typedef u16 __bitwise le16;
|
||||
typedef u32 __bitwise be32;
|
||||
typedef u32 __bitwise le32;
|
||||
typedef u64 __bitwise be64;
|
||||
typedef u64 __bitwise le64;
|
||||
|
||||
#ifndef __must_check
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
#define __must_check __attribute__((__warn_unused_result__))
|
||||
#else
|
||||
#define __must_check
|
||||
#endif /* __GNUC__ */
|
||||
#endif /* __must_check */
|
||||
|
||||
#ifndef __maybe_unused
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
#define __maybe_unused __attribute__((unused))
|
||||
#else
|
||||
#define __maybe_unused
|
||||
#endif /* __GNUC__ */
|
||||
#endif /* __must_check */
|
||||
|
||||
#define SSID_MAX_LEN 32
|
||||
|
||||
struct wpa_ssid_value {
|
||||
u8 ssid[SSID_MAX_LEN];
|
||||
size_t ssid_len;
|
||||
};
|
||||
|
||||
int hwaddr_aton(const char *txt, u8 *addr);
|
||||
int hwaddr_masked_aton(const char *txt, u8 *addr, u8 *mask, u8 maskable);
|
||||
int hwaddr_compact_aton(const char *txt, u8 *addr);
|
||||
int hwaddr_aton2(const char *txt, u8 *addr);
|
||||
int hex2byte(const char *hex);
|
||||
int hexstr2bin(const char *hex, u8 *buf, size_t len);
|
||||
void inc_byte_array(u8 *counter, size_t len);
|
||||
void wpa_get_ntp_timestamp(u8 *buf);
|
||||
int wpa_scnprintf(char *buf, size_t size, const char *fmt, ...);
|
||||
int wpa_snprintf_hex_sep(char *buf, size_t buf_size, const u8 *data, size_t len,
|
||||
char sep);
|
||||
int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len);
|
||||
int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data,
|
||||
size_t len);
|
||||
|
||||
int hwaddr_mask_txt(char *buf, size_t len, const u8 *addr, const u8 *mask);
|
||||
int ssid_parse(const char *buf, struct wpa_ssid_value *ssid);
|
||||
|
||||
#ifdef CONFIG_NATIVE_WINDOWS
|
||||
void wpa_unicode2ascii_inplace(TCHAR *str);
|
||||
TCHAR * wpa_strdup_tchar(const char *str);
|
||||
#else /* CONFIG_NATIVE_WINDOWS */
|
||||
#define wpa_unicode2ascii_inplace(s) do { } while (0)
|
||||
#define wpa_strdup_tchar(s) strdup((s))
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
void printf_encode(char *txt, size_t maxlen, const u8 *data, size_t len);
|
||||
size_t printf_decode(u8 *buf, size_t maxlen, const char *str);
|
||||
|
||||
const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len);
|
||||
|
||||
char * wpa_config_parse_string(const char *value, size_t *len);
|
||||
int is_hex(const u8 *data, size_t len);
|
||||
int has_ctrl_char(const u8 *data, size_t len);
|
||||
int has_newline(const char *str);
|
||||
size_t merge_byte_arrays(u8 *res, size_t res_len,
|
||||
const u8 *src1, size_t src1_len,
|
||||
const u8 *src2, size_t src2_len);
|
||||
char * dup_binstr(const void *src, size_t len);
|
||||
|
||||
static inline int is_zero_ether_addr(const u8 *a)
|
||||
{
|
||||
return !(a[0] | a[1] | a[2] | a[3] | a[4] | a[5]);
|
||||
}
|
||||
|
||||
static inline int is_broadcast_ether_addr(const u8 *a)
|
||||
{
|
||||
return (a[0] & a[1] & a[2] & a[3] & a[4] & a[5]) == 0xff;
|
||||
}
|
||||
|
||||
static inline int is_multicast_ether_addr(const u8 *a)
|
||||
{
|
||||
return a[0] & 0x01;
|
||||
}
|
||||
|
||||
#define broadcast_ether_addr (const u8 *) "\xff\xff\xff\xff\xff\xff"
|
||||
|
||||
#include "wpa_debug.h"
|
||||
|
||||
|
||||
struct wpa_freq_range_list {
|
||||
struct wpa_freq_range {
|
||||
unsigned int min;
|
||||
unsigned int max;
|
||||
} *range;
|
||||
unsigned int num;
|
||||
};
|
||||
|
||||
int freq_range_list_parse(struct wpa_freq_range_list *res, const char *value);
|
||||
int freq_range_list_includes(const struct wpa_freq_range_list *list,
|
||||
unsigned int freq);
|
||||
char * freq_range_list_str(const struct wpa_freq_range_list *list);
|
||||
|
||||
int int_array_len(const int *a);
|
||||
void int_array_concat(int **res, const int *a);
|
||||
void int_array_sort_unique(int *a);
|
||||
void int_array_add_unique(int **res, int a);
|
||||
|
||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||
|
||||
void str_clear_free(char *str);
|
||||
void bin_clear_free(void *bin, size_t len);
|
||||
|
||||
int random_mac_addr(u8 *addr);
|
||||
int random_mac_addr_keep_oui(u8 *addr);
|
||||
|
||||
const char * cstr_token(const char *str, const char *delim, const char **last);
|
||||
char * str_token(char *str, const char *delim, char **context);
|
||||
size_t utf8_escape(const char *inp, size_t in_size,
|
||||
char *outp, size_t out_size);
|
||||
size_t utf8_unescape(const char *inp, size_t in_size,
|
||||
char *outp, size_t out_size);
|
||||
int is_ctrl_char(char c);
|
||||
|
||||
int str_starts(const char *str, const char *start);
|
||||
|
||||
|
||||
/*
|
||||
* gcc 4.4 ends up generating strict-aliasing warnings about some very common
|
||||
* networking socket uses that do not really result in a real problem and
|
||||
* cannot be easily avoided with union-based type-punning due to struct
|
||||
* definitions including another struct in system header files. To avoid having
|
||||
* to fully disable strict-aliasing warnings, provide a mechanism to hide the
|
||||
* typecast from aliasing for now. A cleaner solution will hopefully be found
|
||||
* in the future to handle these cases.
|
||||
*/
|
||||
void * __hide_aliasing_typecast(void *foo);
|
||||
#define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a))
|
||||
|
||||
#ifdef CONFIG_VALGRIND
|
||||
#include <valgrind/memcheck.h>
|
||||
#define WPA_MEM_DEFINED(ptr, len) VALGRIND_MAKE_MEM_DEFINED((ptr), (len))
|
||||
#else /* CONFIG_VALGRIND */
|
||||
#define WPA_MEM_DEFINED(ptr, len) do { } while (0)
|
||||
#endif /* CONFIG_VALGRIND */
|
||||
|
||||
#endif /* COMMON_H */
|
||||
45
wpa_supplicant/src/utils/includes.h
Normal file
45
wpa_supplicant/src/utils/includes.h
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* wpa_supplicant/hostapd - Default include files
|
||||
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*
|
||||
* This header file is included into all C files so that commonly used header
|
||||
* files can be selected with OS specific ifdef blocks in one place instead of
|
||||
* having to have OS/C library specific selection in many files.
|
||||
*/
|
||||
|
||||
#ifndef INCLUDES_H
|
||||
#define INCLUDES_H
|
||||
|
||||
/* Include possible build time configuration before including anything else */
|
||||
#include "build_config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#ifndef _WIN32_WCE
|
||||
#include <signal.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#endif /* _WIN32_WCE */
|
||||
#include <ctype.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
#ifndef CONFIG_NATIVE_WINDOWS
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#ifndef __vxworks
|
||||
#include <sys/uio.h>
|
||||
#include <sys/time.h>
|
||||
#endif /* __vxworks */
|
||||
#endif /* CONFIG_NATIVE_WINDOWS */
|
||||
|
||||
#endif /* INCLUDES_H */
|
||||
668
wpa_supplicant/src/utils/os.h
Normal file
668
wpa_supplicant/src/utils/os.h
Normal file
|
|
@ -0,0 +1,668 @@
|
|||
/*
|
||||
* OS specific functions
|
||||
* Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef OS_H
|
||||
#define OS_H
|
||||
|
||||
typedef long os_time_t;
|
||||
|
||||
/**
|
||||
* os_sleep - Sleep (sec, usec)
|
||||
* @sec: Number of seconds to sleep
|
||||
* @usec: Number of microseconds to sleep
|
||||
*/
|
||||
void os_sleep(os_time_t sec, os_time_t usec);
|
||||
|
||||
struct os_time {
|
||||
os_time_t sec;
|
||||
os_time_t usec;
|
||||
};
|
||||
|
||||
struct os_reltime {
|
||||
os_time_t sec;
|
||||
os_time_t usec;
|
||||
};
|
||||
|
||||
/**
|
||||
* os_get_time - Get current time (sec, usec)
|
||||
* @t: Pointer to buffer for the time
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*/
|
||||
int os_get_time(struct os_time *t);
|
||||
|
||||
/**
|
||||
* os_get_reltime - Get relative time (sec, usec)
|
||||
* @t: Pointer to buffer for the time
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*/
|
||||
int os_get_reltime(struct os_reltime *t);
|
||||
|
||||
|
||||
/* Helpers for handling struct os_time */
|
||||
|
||||
static inline int os_time_before(struct os_time *a, struct os_time *b)
|
||||
{
|
||||
return (a->sec < b->sec) ||
|
||||
(a->sec == b->sec && a->usec < b->usec);
|
||||
}
|
||||
|
||||
|
||||
static inline void os_time_sub(struct os_time *a, struct os_time *b,
|
||||
struct os_time *res)
|
||||
{
|
||||
res->sec = a->sec - b->sec;
|
||||
res->usec = a->usec - b->usec;
|
||||
if (res->usec < 0) {
|
||||
res->sec--;
|
||||
res->usec += 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Helpers for handling struct os_reltime */
|
||||
|
||||
static inline int os_reltime_before(struct os_reltime *a,
|
||||
struct os_reltime *b)
|
||||
{
|
||||
return (a->sec < b->sec) ||
|
||||
(a->sec == b->sec && a->usec < b->usec);
|
||||
}
|
||||
|
||||
|
||||
static inline void os_reltime_sub(struct os_reltime *a, struct os_reltime *b,
|
||||
struct os_reltime *res)
|
||||
{
|
||||
res->sec = a->sec - b->sec;
|
||||
res->usec = a->usec - b->usec;
|
||||
if (res->usec < 0) {
|
||||
res->sec--;
|
||||
res->usec += 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline void os_reltime_age(struct os_reltime *start,
|
||||
struct os_reltime *age)
|
||||
{
|
||||
struct os_reltime now;
|
||||
|
||||
os_get_reltime(&now);
|
||||
os_reltime_sub(&now, start, age);
|
||||
}
|
||||
|
||||
|
||||
static inline int os_reltime_expired(struct os_reltime *now,
|
||||
struct os_reltime *ts,
|
||||
os_time_t timeout_secs)
|
||||
{
|
||||
struct os_reltime age;
|
||||
|
||||
os_reltime_sub(now, ts, &age);
|
||||
return (age.sec > timeout_secs) ||
|
||||
(age.sec == timeout_secs && age.usec > 0);
|
||||
}
|
||||
|
||||
|
||||
static inline int os_reltime_initialized(struct os_reltime *t)
|
||||
{
|
||||
return t->sec != 0 || t->usec != 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* os_mktime - Convert broken-down time into seconds since 1970-01-01
|
||||
* @year: Four digit year
|
||||
* @month: Month (1 .. 12)
|
||||
* @day: Day of month (1 .. 31)
|
||||
* @hour: Hour (0 .. 23)
|
||||
* @min: Minute (0 .. 59)
|
||||
* @sec: Second (0 .. 60)
|
||||
* @t: Buffer for returning calendar time representation (seconds since
|
||||
* 1970-01-01 00:00:00)
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*
|
||||
* Note: The result is in seconds from Epoch, i.e., in UTC, not in local time
|
||||
* which is used by POSIX mktime().
|
||||
*/
|
||||
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||
os_time_t *t);
|
||||
|
||||
struct os_tm {
|
||||
int sec; /* 0..59 or 60 for leap seconds */
|
||||
int min; /* 0..59 */
|
||||
int hour; /* 0..23 */
|
||||
int day; /* 1..31 */
|
||||
int month; /* 1..12 */
|
||||
int year; /* Four digit year */
|
||||
};
|
||||
|
||||
int os_gmtime(os_time_t t, struct os_tm *tm);
|
||||
|
||||
/**
|
||||
* os_daemonize - Run in the background (detach from the controlling terminal)
|
||||
* @pid_file: File name to write the process ID to or %NULL to skip this
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*/
|
||||
int os_daemonize(const char *pid_file);
|
||||
|
||||
/**
|
||||
* os_daemonize_terminate - Stop running in the background (remove pid file)
|
||||
* @pid_file: File name to write the process ID to or %NULL to skip this
|
||||
*/
|
||||
void os_daemonize_terminate(const char *pid_file);
|
||||
|
||||
/**
|
||||
* os_get_random - Get cryptographically strong pseudo random data
|
||||
* @buf: Buffer for pseudo random data
|
||||
* @len: Length of the buffer
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*/
|
||||
int os_get_random(unsigned char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* os_random - Get pseudo random value (not necessarily very strong)
|
||||
* Returns: Pseudo random value
|
||||
*/
|
||||
unsigned long os_random(void);
|
||||
|
||||
/**
|
||||
* os_rel2abs_path - Get an absolute path for a file
|
||||
* @rel_path: Relative path to a file
|
||||
* Returns: Absolute path for the file or %NULL on failure
|
||||
*
|
||||
* This function tries to convert a relative path of a file to an absolute path
|
||||
* in order for the file to be found even if current working directory has
|
||||
* changed. The returned value is allocated and caller is responsible for
|
||||
* freeing it. It is acceptable to just return the same path in an allocated
|
||||
* buffer, e.g., return strdup(rel_path). This function is only used to find
|
||||
* configuration files when os_daemonize() may have changed the current working
|
||||
* directory and relative path would be pointing to a different location.
|
||||
*/
|
||||
char * os_rel2abs_path(const char *rel_path);
|
||||
|
||||
/**
|
||||
* os_program_init - Program initialization (called at start)
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*
|
||||
* This function is called when a programs starts. If there are any OS specific
|
||||
* processing that is needed, it can be placed here. It is also acceptable to
|
||||
* just return 0 if not special processing is needed.
|
||||
*/
|
||||
int os_program_init(void);
|
||||
|
||||
/**
|
||||
* os_program_deinit - Program deinitialization (called just before exit)
|
||||
*
|
||||
* This function is called just before a program exists. If there are any OS
|
||||
* specific processing, e.g., freeing resourced allocated in os_program_init(),
|
||||
* it should be done here. It is also acceptable for this function to do
|
||||
* nothing.
|
||||
*/
|
||||
void os_program_deinit(void);
|
||||
|
||||
/**
|
||||
* os_setenv - Set environment variable
|
||||
* @name: Name of the variable
|
||||
* @value: Value to set to the variable
|
||||
* @overwrite: Whether existing variable should be overwritten
|
||||
* Returns: 0 on success, -1 on error
|
||||
*
|
||||
* This function is only used for wpa_cli action scripts. OS wrapper does not
|
||||
* need to implement this if such functionality is not needed.
|
||||
*/
|
||||
int os_setenv(const char *name, const char *value, int overwrite);
|
||||
|
||||
/**
|
||||
* os_unsetenv - Delete environent variable
|
||||
* @name: Name of the variable
|
||||
* Returns: 0 on success, -1 on error
|
||||
*
|
||||
* This function is only used for wpa_cli action scripts. OS wrapper does not
|
||||
* need to implement this if such functionality is not needed.
|
||||
*/
|
||||
int os_unsetenv(const char *name);
|
||||
|
||||
/**
|
||||
* os_readfile - Read a file to an allocated memory buffer
|
||||
* @name: Name of the file to read
|
||||
* @len: For returning the length of the allocated buffer
|
||||
* Returns: Pointer to the allocated buffer or %NULL on failure
|
||||
*
|
||||
* This function allocates memory and reads the given file to this buffer. Both
|
||||
* binary and text files can be read with this function. The caller is
|
||||
* responsible for freeing the returned buffer with os_free().
|
||||
*/
|
||||
char * os_readfile(const char *name, size_t *len);
|
||||
|
||||
/**
|
||||
* os_file_exists - Check whether the specified file exists
|
||||
* @fname: Path and name of the file
|
||||
* Returns: 1 if the file exists or 0 if not
|
||||
*/
|
||||
int os_file_exists(const char *fname);
|
||||
|
||||
/**
|
||||
* os_fdatasync - Sync a file's (for a given stream) state with storage device
|
||||
* @stream: the stream to be flushed
|
||||
* Returns: 0 if the operation succeeded or -1 on failure
|
||||
*/
|
||||
int os_fdatasync(FILE *stream);
|
||||
|
||||
/**
|
||||
* os_zalloc - Allocate and zero memory
|
||||
* @size: Number of bytes to allocate
|
||||
* Returns: Pointer to allocated and zeroed memory or %NULL on failure
|
||||
*
|
||||
* Caller is responsible for freeing the returned buffer with os_free().
|
||||
*/
|
||||
void * os_zalloc(size_t size);
|
||||
|
||||
/**
|
||||
* os_calloc - Allocate and zero memory for an array
|
||||
* @nmemb: Number of members in the array
|
||||
* @size: Number of bytes in each member
|
||||
* Returns: Pointer to allocated and zeroed memory or %NULL on failure
|
||||
*
|
||||
* This function can be used as a wrapper for os_zalloc(nmemb * size) when an
|
||||
* allocation is used for an array. The main benefit over os_zalloc() is in
|
||||
* having an extra check to catch integer overflows in multiplication.
|
||||
*
|
||||
* Caller is responsible for freeing the returned buffer with os_free().
|
||||
*/
|
||||
static inline void * os_calloc(size_t nmemb, size_t size)
|
||||
{
|
||||
if (size && nmemb > (~(size_t) 0) / size)
|
||||
return NULL;
|
||||
return os_zalloc(nmemb * size);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The following functions are wrapper for standard ANSI C or POSIX functions.
|
||||
* By default, they are just defined to use the standard function name and no
|
||||
* os_*.c implementation is needed for them. This avoids extra function calls
|
||||
* by allowing the C pre-processor take care of the function name mapping.
|
||||
*
|
||||
* If the target system uses a C library that does not provide these functions,
|
||||
* build_config.h can be used to define the wrappers to use a different
|
||||
* function name. This can be done on function-by-function basis since the
|
||||
* defines here are only used if build_config.h does not define the os_* name.
|
||||
* If needed, os_*.c file can be used to implement the functions that are not
|
||||
* included in the C library on the target system. Alternatively,
|
||||
* OS_NO_C_LIB_DEFINES can be defined to skip all defines here in which case
|
||||
* these functions need to be implemented in os_*.c file for the target system.
|
||||
*/
|
||||
|
||||
#ifdef OS_NO_C_LIB_DEFINES
|
||||
|
||||
/**
|
||||
* os_malloc - Allocate dynamic memory
|
||||
* @size: Size of the buffer to allocate
|
||||
* Returns: Allocated buffer or %NULL on failure
|
||||
*
|
||||
* Caller is responsible for freeing the returned buffer with os_free().
|
||||
*/
|
||||
void * os_malloc(size_t size);
|
||||
|
||||
/**
|
||||
* os_realloc - Re-allocate dynamic memory
|
||||
* @ptr: Old buffer from os_malloc() or os_realloc()
|
||||
* @size: Size of the new buffer
|
||||
* Returns: Allocated buffer or %NULL on failure
|
||||
*
|
||||
* Caller is responsible for freeing the returned buffer with os_free().
|
||||
* If re-allocation fails, %NULL is returned and the original buffer (ptr) is
|
||||
* not freed and caller is still responsible for freeing it.
|
||||
*/
|
||||
void * os_realloc(void *ptr, size_t size);
|
||||
|
||||
/**
|
||||
* os_free - Free dynamic memory
|
||||
* @ptr: Old buffer from os_malloc() or os_realloc(); can be %NULL
|
||||
*/
|
||||
void os_free(void *ptr);
|
||||
|
||||
/**
|
||||
* os_memcpy - Copy memory area
|
||||
* @dest: Destination
|
||||
* @src: Source
|
||||
* @n: Number of bytes to copy
|
||||
* Returns: dest
|
||||
*
|
||||
* The memory areas src and dst must not overlap. os_memmove() can be used with
|
||||
* overlapping memory.
|
||||
*/
|
||||
void * os_memcpy(void *dest, const void *src, size_t n);
|
||||
|
||||
/**
|
||||
* os_memmove - Copy memory area
|
||||
* @dest: Destination
|
||||
* @src: Source
|
||||
* @n: Number of bytes to copy
|
||||
* Returns: dest
|
||||
*
|
||||
* The memory areas src and dst may overlap.
|
||||
*/
|
||||
void * os_memmove(void *dest, const void *src, size_t n);
|
||||
|
||||
/**
|
||||
* os_memset - Fill memory with a constant byte
|
||||
* @s: Memory area to be filled
|
||||
* @c: Constant byte
|
||||
* @n: Number of bytes started from s to fill with c
|
||||
* Returns: s
|
||||
*/
|
||||
void * os_memset(void *s, int c, size_t n);
|
||||
|
||||
/**
|
||||
* os_memcmp - Compare memory areas
|
||||
* @s1: First buffer
|
||||
* @s2: Second buffer
|
||||
* @n: Maximum numbers of octets to compare
|
||||
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||
* found to be less than, to match, or be greater than s2. Only first n
|
||||
* characters will be compared.
|
||||
*/
|
||||
int os_memcmp(const void *s1, const void *s2, size_t n);
|
||||
|
||||
/**
|
||||
* os_strdup - Duplicate a string
|
||||
* @s: Source string
|
||||
* Returns: Allocated buffer with the string copied into it or %NULL on failure
|
||||
*
|
||||
* Caller is responsible for freeing the returned buffer with os_free().
|
||||
*/
|
||||
char * os_strdup(const char *s);
|
||||
|
||||
/**
|
||||
* os_strlen - Calculate the length of a string
|
||||
* @s: '\0' terminated string
|
||||
* Returns: Number of characters in s (not counting the '\0' terminator)
|
||||
*/
|
||||
size_t os_strlen(const char *s);
|
||||
|
||||
/**
|
||||
* os_strcasecmp - Compare two strings ignoring case
|
||||
* @s1: First string
|
||||
* @s2: Second string
|
||||
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||
* found to be less than, to match, or be greatred than s2
|
||||
*/
|
||||
int os_strcasecmp(const char *s1, const char *s2);
|
||||
|
||||
/**
|
||||
* os_strncasecmp - Compare two strings ignoring case
|
||||
* @s1: First string
|
||||
* @s2: Second string
|
||||
* @n: Maximum numbers of characters to compare
|
||||
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||
* found to be less than, to match, or be greater than s2. Only first n
|
||||
* characters will be compared.
|
||||
*/
|
||||
int os_strncasecmp(const char *s1, const char *s2, size_t n);
|
||||
|
||||
/**
|
||||
* os_strchr - Locate the first occurrence of a character in string
|
||||
* @s: String
|
||||
* @c: Character to search for
|
||||
* Returns: Pointer to the matched character or %NULL if not found
|
||||
*/
|
||||
char * os_strchr(const char *s, int c);
|
||||
|
||||
/**
|
||||
* os_strrchr - Locate the last occurrence of a character in string
|
||||
* @s: String
|
||||
* @c: Character to search for
|
||||
* Returns: Pointer to the matched character or %NULL if not found
|
||||
*/
|
||||
char * os_strrchr(const char *s, int c);
|
||||
|
||||
/**
|
||||
* os_strcmp - Compare two strings
|
||||
* @s1: First string
|
||||
* @s2: Second string
|
||||
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||
* found to be less than, to match, or be greatred than s2
|
||||
*/
|
||||
int os_strcmp(const char *s1, const char *s2);
|
||||
|
||||
/**
|
||||
* os_strncmp - Compare two strings
|
||||
* @s1: First string
|
||||
* @s2: Second string
|
||||
* @n: Maximum numbers of characters to compare
|
||||
* Returns: An integer less than, equal to, or greater than zero if s1 is
|
||||
* found to be less than, to match, or be greater than s2. Only first n
|
||||
* characters will be compared.
|
||||
*/
|
||||
int os_strncmp(const char *s1, const char *s2, size_t n);
|
||||
|
||||
/**
|
||||
* os_strstr - Locate a substring
|
||||
* @haystack: String (haystack) to search from
|
||||
* @needle: Needle to search from haystack
|
||||
* Returns: Pointer to the beginning of the substring or %NULL if not found
|
||||
*/
|
||||
char * os_strstr(const char *haystack, const char *needle);
|
||||
|
||||
/**
|
||||
* os_snprintf - Print to a memory buffer
|
||||
* @str: Memory buffer to print into
|
||||
* @size: Maximum length of the str buffer
|
||||
* @format: printf format
|
||||
* Returns: Number of characters printed (not including trailing '\0').
|
||||
*
|
||||
* If the output buffer is truncated, number of characters which would have
|
||||
* been written is returned. Since some C libraries return -1 in such a case,
|
||||
* the caller must be prepared on that value, too, to indicate truncation.
|
||||
*
|
||||
* Note: Some C library implementations of snprintf() may not guarantee null
|
||||
* termination in case the output is truncated. The OS wrapper function of
|
||||
* os_snprintf() should provide this guarantee, i.e., to null terminate the
|
||||
* output buffer if a C library version of the function is used and if that
|
||||
* function does not guarantee null termination.
|
||||
*
|
||||
* If the target system does not include snprintf(), see, e.g.,
|
||||
* http://www.ijs.si/software/snprintf/ for an example of a portable
|
||||
* implementation of snprintf.
|
||||
*/
|
||||
int os_snprintf(char *str, size_t size, const char *format, ...);
|
||||
|
||||
#else /* OS_NO_C_LIB_DEFINES */
|
||||
|
||||
#ifdef WPA_TRACE
|
||||
void * os_malloc(size_t size);
|
||||
void * os_realloc(void *ptr, size_t size);
|
||||
void os_free(void *ptr);
|
||||
char * os_strdup(const char *s);
|
||||
#else /* WPA_TRACE */
|
||||
#ifndef os_malloc
|
||||
#define os_malloc(s) malloc((s))
|
||||
#endif
|
||||
#ifndef os_realloc
|
||||
#define os_realloc(p, s) realloc((p), (s))
|
||||
#endif
|
||||
#ifndef os_free
|
||||
#define os_free(p) free((p))
|
||||
#endif
|
||||
#ifndef os_strdup
|
||||
#ifdef _MSC_VER
|
||||
#define os_strdup(s) _strdup(s)
|
||||
#else
|
||||
#define os_strdup(s) strdup(s)
|
||||
#endif
|
||||
#endif
|
||||
#endif /* WPA_TRACE */
|
||||
|
||||
#ifndef os_memcpy
|
||||
#define os_memcpy(d, s, n) memcpy((d), (s), (n))
|
||||
#endif
|
||||
#ifndef os_memmove
|
||||
#define os_memmove(d, s, n) memmove((d), (s), (n))
|
||||
#endif
|
||||
#ifndef os_memset
|
||||
#define os_memset(s, c, n) memset(s, c, n)
|
||||
#endif
|
||||
#ifndef os_memcmp
|
||||
#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n))
|
||||
#endif
|
||||
|
||||
#ifndef os_strlen
|
||||
#define os_strlen(s) strlen(s)
|
||||
#endif
|
||||
#ifndef os_strcasecmp
|
||||
#ifdef _MSC_VER
|
||||
#define os_strcasecmp(s1, s2) _stricmp((s1), (s2))
|
||||
#else
|
||||
#define os_strcasecmp(s1, s2) strcasecmp((s1), (s2))
|
||||
#endif
|
||||
#endif
|
||||
#ifndef os_strncasecmp
|
||||
#ifdef _MSC_VER
|
||||
#define os_strncasecmp(s1, s2, n) _strnicmp((s1), (s2), (n))
|
||||
#else
|
||||
#define os_strncasecmp(s1, s2, n) strncasecmp((s1), (s2), (n))
|
||||
#endif
|
||||
#endif
|
||||
#ifndef os_strchr
|
||||
#define os_strchr(s, c) strchr((s), (c))
|
||||
#endif
|
||||
#ifndef os_strcmp
|
||||
#define os_strcmp(s1, s2) strcmp((s1), (s2))
|
||||
#endif
|
||||
#ifndef os_strncmp
|
||||
#define os_strncmp(s1, s2, n) strncmp((s1), (s2), (n))
|
||||
#endif
|
||||
#ifndef os_strrchr
|
||||
#define os_strrchr(s, c) strrchr((s), (c))
|
||||
#endif
|
||||
#ifndef os_strstr
|
||||
#define os_strstr(h, n) strstr((h), (n))
|
||||
#endif
|
||||
|
||||
#ifndef os_snprintf
|
||||
#ifdef _MSC_VER
|
||||
#define os_snprintf _snprintf
|
||||
#else
|
||||
#define os_snprintf snprintf
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* OS_NO_C_LIB_DEFINES */
|
||||
|
||||
|
||||
static inline int os_snprintf_error(size_t size, int res)
|
||||
{
|
||||
return res < 0 || (unsigned int) res >= size;
|
||||
}
|
||||
|
||||
|
||||
static inline void * os_realloc_array(void *ptr, size_t nmemb, size_t size)
|
||||
{
|
||||
if (size && nmemb > (~(size_t) 0) / size)
|
||||
return NULL;
|
||||
return os_realloc(ptr, nmemb * size);
|
||||
}
|
||||
|
||||
/**
|
||||
* os_remove_in_array - Remove a member from an array by index
|
||||
* @ptr: Pointer to the array
|
||||
* @nmemb: Current member count of the array
|
||||
* @size: The size per member of the array
|
||||
* @idx: Index of the member to be removed
|
||||
*/
|
||||
static inline void os_remove_in_array(void *ptr, size_t nmemb, size_t size,
|
||||
size_t idx)
|
||||
{
|
||||
if (idx < nmemb - 1)
|
||||
os_memmove(((unsigned char *) ptr) + idx * size,
|
||||
((unsigned char *) ptr) + (idx + 1) * size,
|
||||
(nmemb - idx - 1) * size);
|
||||
}
|
||||
|
||||
/**
|
||||
* os_strlcpy - Copy a string with size bound and NUL-termination
|
||||
* @dest: Destination
|
||||
* @src: Source
|
||||
* @siz: Size of the target buffer
|
||||
* Returns: Total length of the target string (length of src) (not including
|
||||
* NUL-termination)
|
||||
*
|
||||
* This function matches in behavior with the strlcpy(3) function in OpenBSD.
|
||||
*/
|
||||
size_t os_strlcpy(char *dest, const char *src, size_t siz);
|
||||
|
||||
/**
|
||||
* os_memcmp_const - Constant time memory comparison
|
||||
* @a: First buffer to compare
|
||||
* @b: Second buffer to compare
|
||||
* @len: Number of octets to compare
|
||||
* Returns: 0 if buffers are equal, non-zero if not
|
||||
*
|
||||
* This function is meant for comparing passwords or hash values where
|
||||
* difference in execution time could provide external observer information
|
||||
* about the location of the difference in the memory buffers. The return value
|
||||
* does not behave like os_memcmp(), i.e., os_memcmp_const() cannot be used to
|
||||
* sort items into a defined order. Unlike os_memcmp(), execution time of
|
||||
* os_memcmp_const() does not depend on the contents of the compared memory
|
||||
* buffers, but only on the total compared length.
|
||||
*/
|
||||
int os_memcmp_const(const void *a, const void *b, size_t len);
|
||||
|
||||
/**
|
||||
* os_exec - Execute an external program
|
||||
* @program: Path to the program
|
||||
* @arg: Command line argument string
|
||||
* @wait_completion: Whether to wait until the program execution completes
|
||||
* Returns: 0 on success, -1 on error
|
||||
*/
|
||||
int os_exec(const char *program, const char *arg, int wait_completion);
|
||||
|
||||
|
||||
#ifdef OS_REJECT_C_LIB_FUNCTIONS
|
||||
#define malloc OS_DO_NOT_USE_malloc
|
||||
#define realloc OS_DO_NOT_USE_realloc
|
||||
#define free OS_DO_NOT_USE_free
|
||||
#define memcpy OS_DO_NOT_USE_memcpy
|
||||
#define memmove OS_DO_NOT_USE_memmove
|
||||
#define memset OS_DO_NOT_USE_memset
|
||||
#define memcmp OS_DO_NOT_USE_memcmp
|
||||
#undef strdup
|
||||
#define strdup OS_DO_NOT_USE_strdup
|
||||
#define strlen OS_DO_NOT_USE_strlen
|
||||
#define strcasecmp OS_DO_NOT_USE_strcasecmp
|
||||
#define strncasecmp OS_DO_NOT_USE_strncasecmp
|
||||
#undef strchr
|
||||
#define strchr OS_DO_NOT_USE_strchr
|
||||
#undef strcmp
|
||||
#define strcmp OS_DO_NOT_USE_strcmp
|
||||
#undef strncmp
|
||||
#define strncmp OS_DO_NOT_USE_strncmp
|
||||
#undef strncpy
|
||||
#define strncpy OS_DO_NOT_USE_strncpy
|
||||
#define strrchr OS_DO_NOT_USE_strrchr
|
||||
#define strstr OS_DO_NOT_USE_strstr
|
||||
#undef snprintf
|
||||
#define snprintf OS_DO_NOT_USE_snprintf
|
||||
|
||||
#define strcpy OS_DO_NOT_USE_strcpy
|
||||
#endif /* OS_REJECT_C_LIB_FUNCTIONS */
|
||||
|
||||
|
||||
#if defined(WPA_TRACE_BFD) && defined(CONFIG_TESTING_OPTIONS)
|
||||
#define TEST_FAIL() testing_test_fail()
|
||||
int testing_test_fail(void);
|
||||
extern char wpa_trace_fail_func[256];
|
||||
extern unsigned int wpa_trace_fail_after;
|
||||
extern char wpa_trace_test_fail_func[256];
|
||||
extern unsigned int wpa_trace_test_fail_after;
|
||||
#else
|
||||
#define TEST_FAIL() 0
|
||||
#endif
|
||||
|
||||
#endif /* OS_H */
|
||||
819
wpa_supplicant/src/utils/os_unix.c
Normal file
819
wpa_supplicant/src/utils/os_unix.c
Normal file
|
|
@ -0,0 +1,819 @@
|
|||
/*
|
||||
* OS specific functions for UNIX/POSIX systems
|
||||
* Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <sys/capability.h>
|
||||
#include <sys/prctl.h>
|
||||
#include <private/android_filesystem_config.h>
|
||||
#endif /* ANDROID */
|
||||
|
||||
#ifdef __MACH__
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
#endif /* __MACH__ */
|
||||
|
||||
#include "os.h"
|
||||
#include "common.h"
|
||||
|
||||
#ifdef WPA_TRACE
|
||||
|
||||
#include "wpa_debug.h"
|
||||
#include "trace.h"
|
||||
#include "list.h"
|
||||
|
||||
static struct dl_list alloc_list = DL_LIST_HEAD_INIT(alloc_list);
|
||||
|
||||
#define ALLOC_MAGIC 0xa84ef1b2
|
||||
#define FREED_MAGIC 0x67fd487a
|
||||
|
||||
struct os_alloc_trace {
|
||||
unsigned int magic;
|
||||
struct dl_list list;
|
||||
size_t len;
|
||||
WPA_TRACE_INFO
|
||||
} __attribute__((aligned(16)));
|
||||
|
||||
#endif /* WPA_TRACE */
|
||||
|
||||
|
||||
void os_sleep(os_time_t sec, os_time_t usec)
|
||||
{
|
||||
if (sec)
|
||||
sleep(sec);
|
||||
if (usec)
|
||||
usleep(usec);
|
||||
}
|
||||
|
||||
|
||||
int os_get_time(struct os_time *t)
|
||||
{
|
||||
int res;
|
||||
struct timeval tv;
|
||||
res = gettimeofday(&tv, NULL);
|
||||
t->sec = tv.tv_sec;
|
||||
t->usec = tv.tv_usec;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int os_get_reltime(struct os_reltime *t)
|
||||
{
|
||||
#ifndef __MACH__
|
||||
#if defined(CLOCK_BOOTTIME)
|
||||
static clockid_t clock_id = CLOCK_BOOTTIME;
|
||||
#elif defined(CLOCK_MONOTONIC)
|
||||
static clockid_t clock_id = CLOCK_MONOTONIC;
|
||||
#else
|
||||
static clockid_t clock_id = CLOCK_REALTIME;
|
||||
#endif
|
||||
struct timespec ts;
|
||||
int res;
|
||||
|
||||
while (1) {
|
||||
res = clock_gettime(clock_id, &ts);
|
||||
if (res == 0) {
|
||||
t->sec = ts.tv_sec;
|
||||
t->usec = ts.tv_nsec / 1000;
|
||||
return 0;
|
||||
}
|
||||
switch (clock_id) {
|
||||
#ifdef CLOCK_BOOTTIME
|
||||
case CLOCK_BOOTTIME:
|
||||
clock_id = CLOCK_MONOTONIC;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CLOCK_MONOTONIC
|
||||
case CLOCK_MONOTONIC:
|
||||
clock_id = CLOCK_REALTIME;
|
||||
break;
|
||||
#endif
|
||||
case CLOCK_REALTIME:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#else /* __MACH__ */
|
||||
uint64_t abstime, nano;
|
||||
static mach_timebase_info_data_t info = { 0, 0 };
|
||||
|
||||
if (!info.denom) {
|
||||
if (mach_timebase_info(&info) != KERN_SUCCESS)
|
||||
return -1;
|
||||
}
|
||||
|
||||
abstime = mach_absolute_time();
|
||||
nano = (abstime * info.numer) / info.denom;
|
||||
|
||||
t->sec = nano / NSEC_PER_SEC;
|
||||
t->usec = (nano - (((uint64_t) t->sec) * NSEC_PER_SEC)) / NSEC_PER_USEC;
|
||||
|
||||
return 0;
|
||||
#endif /* __MACH__ */
|
||||
}
|
||||
|
||||
|
||||
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||
os_time_t *t)
|
||||
{
|
||||
struct tm tm, *tm1;
|
||||
time_t t_local, t1, t2;
|
||||
os_time_t tz_offset;
|
||||
|
||||
if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
|
||||
hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
|
||||
sec > 60)
|
||||
return -1;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = year - 1900;
|
||||
tm.tm_mon = month - 1;
|
||||
tm.tm_mday = day;
|
||||
tm.tm_hour = hour;
|
||||
tm.tm_min = min;
|
||||
tm.tm_sec = sec;
|
||||
|
||||
t_local = mktime(&tm);
|
||||
|
||||
/* figure out offset to UTC */
|
||||
tm1 = localtime(&t_local);
|
||||
if (tm1) {
|
||||
t1 = mktime(tm1);
|
||||
tm1 = gmtime(&t_local);
|
||||
if (tm1) {
|
||||
t2 = mktime(tm1);
|
||||
tz_offset = t2 - t1;
|
||||
} else
|
||||
tz_offset = 0;
|
||||
} else
|
||||
tz_offset = 0;
|
||||
|
||||
*t = (os_time_t) t_local - tz_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int os_gmtime(os_time_t t, struct os_tm *tm)
|
||||
{
|
||||
struct tm *tm2;
|
||||
time_t t2 = t;
|
||||
|
||||
tm2 = gmtime(&t2);
|
||||
if (tm2 == NULL)
|
||||
return -1;
|
||||
tm->sec = tm2->tm_sec;
|
||||
tm->min = tm2->tm_min;
|
||||
tm->hour = tm2->tm_hour;
|
||||
tm->day = tm2->tm_mday;
|
||||
tm->month = tm2->tm_mon + 1;
|
||||
tm->year = tm2->tm_year + 1900;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <fcntl.h>
|
||||
static int os_daemon(int nochdir, int noclose)
|
||||
{
|
||||
int devnull;
|
||||
|
||||
if (chdir("/") < 0)
|
||||
return -1;
|
||||
|
||||
devnull = open("/dev/null", O_RDWR);
|
||||
if (devnull < 0)
|
||||
return -1;
|
||||
|
||||
if (dup2(devnull, STDIN_FILENO) < 0) {
|
||||
close(devnull);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (dup2(devnull, STDOUT_FILENO) < 0) {
|
||||
close(devnull);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (dup2(devnull, STDERR_FILENO) < 0) {
|
||||
close(devnull);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else /* __APPLE__ */
|
||||
#define os_daemon daemon
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
|
||||
int os_daemonize(const char *pid_file)
|
||||
{
|
||||
#if defined(__uClinux__) || defined(__sun__)
|
||||
return -1;
|
||||
#else /* defined(__uClinux__) || defined(__sun__) */
|
||||
if (os_daemon(0, 0)) {
|
||||
perror("daemon");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pid_file) {
|
||||
FILE *f = fopen(pid_file, "w");
|
||||
if (f) {
|
||||
fprintf(f, "%u\n", getpid());
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
return -0;
|
||||
#endif /* defined(__uClinux__) || defined(__sun__) */
|
||||
}
|
||||
|
||||
|
||||
void os_daemonize_terminate(const char *pid_file)
|
||||
{
|
||||
if (pid_file)
|
||||
unlink(pid_file);
|
||||
}
|
||||
|
||||
|
||||
int os_get_random(unsigned char *buf, size_t len)
|
||||
{
|
||||
FILE *f;
|
||||
size_t rc;
|
||||
|
||||
if (TEST_FAIL())
|
||||
return -1;
|
||||
|
||||
f = fopen("/dev/urandom", "rb");
|
||||
if (f == NULL) {
|
||||
printf("Could not open /dev/urandom.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = fread(buf, 1, len, f);
|
||||
fclose(f);
|
||||
|
||||
return rc != len ? -1 : 0;
|
||||
}
|
||||
|
||||
|
||||
unsigned long os_random(void)
|
||||
{
|
||||
return random();
|
||||
}
|
||||
|
||||
|
||||
char * os_rel2abs_path(const char *rel_path)
|
||||
{
|
||||
char *buf = NULL, *cwd, *ret;
|
||||
size_t len = 128, cwd_len, rel_len, ret_len;
|
||||
int last_errno;
|
||||
|
||||
if (!rel_path)
|
||||
return NULL;
|
||||
|
||||
if (rel_path[0] == '/')
|
||||
return os_strdup(rel_path);
|
||||
|
||||
for (;;) {
|
||||
buf = os_malloc(len);
|
||||
if (buf == NULL)
|
||||
return NULL;
|
||||
cwd = getcwd(buf, len);
|
||||
if (cwd == NULL) {
|
||||
last_errno = errno;
|
||||
os_free(buf);
|
||||
if (last_errno != ERANGE)
|
||||
return NULL;
|
||||
len *= 2;
|
||||
if (len > 2000)
|
||||
return NULL;
|
||||
} else {
|
||||
buf[len - 1] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cwd_len = os_strlen(cwd);
|
||||
rel_len = os_strlen(rel_path);
|
||||
ret_len = cwd_len + 1 + rel_len + 1;
|
||||
ret = os_malloc(ret_len);
|
||||
if (ret) {
|
||||
os_memcpy(ret, cwd, cwd_len);
|
||||
ret[cwd_len] = '/';
|
||||
os_memcpy(ret + cwd_len + 1, rel_path, rel_len);
|
||||
ret[ret_len - 1] = '\0';
|
||||
}
|
||||
os_free(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int os_program_init(void)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
/*
|
||||
* We ignore errors here since errors are normal if we
|
||||
* are already running as non-root.
|
||||
*/
|
||||
#ifdef ANDROID_SETGROUPS_OVERRIDE
|
||||
gid_t groups[] = { ANDROID_SETGROUPS_OVERRIDE };
|
||||
#else /* ANDROID_SETGROUPS_OVERRIDE */
|
||||
gid_t groups[] = { AID_INET, AID_WIFI, AID_KEYSTORE };
|
||||
#endif /* ANDROID_SETGROUPS_OVERRIDE */
|
||||
struct __user_cap_header_struct header;
|
||||
struct __user_cap_data_struct cap;
|
||||
|
||||
setgroups(ARRAY_SIZE(groups), groups);
|
||||
|
||||
prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
|
||||
|
||||
setgid(AID_WIFI);
|
||||
setuid(AID_WIFI);
|
||||
|
||||
header.version = _LINUX_CAPABILITY_VERSION;
|
||||
header.pid = 0;
|
||||
cap.effective = cap.permitted =
|
||||
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
|
||||
cap.inheritable = 0;
|
||||
capset(&header, &cap);
|
||||
#endif /* ANDROID */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void os_program_deinit(void)
|
||||
{
|
||||
#ifdef WPA_TRACE
|
||||
struct os_alloc_trace *a;
|
||||
unsigned long total = 0;
|
||||
dl_list_for_each(a, &alloc_list, struct os_alloc_trace, list) {
|
||||
total += a->len;
|
||||
if (a->magic != ALLOC_MAGIC) {
|
||||
wpa_printf(MSG_INFO, "MEMLEAK[%p]: invalid magic 0x%x "
|
||||
"len %lu",
|
||||
a, a->magic, (unsigned long) a->len);
|
||||
continue;
|
||||
}
|
||||
wpa_printf(MSG_INFO, "MEMLEAK[%p]: len %lu",
|
||||
a, (unsigned long) a->len);
|
||||
wpa_trace_dump("memleak", a);
|
||||
}
|
||||
if (total)
|
||||
wpa_printf(MSG_INFO, "MEMLEAK: total %lu bytes",
|
||||
(unsigned long) total);
|
||||
wpa_trace_deinit();
|
||||
#endif /* WPA_TRACE */
|
||||
}
|
||||
|
||||
|
||||
int os_setenv(const char *name, const char *value, int overwrite)
|
||||
{
|
||||
return setenv(name, value, overwrite);
|
||||
}
|
||||
|
||||
|
||||
int os_unsetenv(const char *name)
|
||||
{
|
||||
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__APPLE__) || \
|
||||
defined(__OpenBSD__)
|
||||
unsetenv(name);
|
||||
return 0;
|
||||
#else
|
||||
return unsetenv(name);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
char * os_readfile(const char *name, size_t *len)
|
||||
{
|
||||
FILE *f;
|
||||
char *buf;
|
||||
long pos;
|
||||
|
||||
f = fopen(name, "rb");
|
||||
if (f == NULL)
|
||||
return NULL;
|
||||
|
||||
if (fseek(f, 0, SEEK_END) < 0 || (pos = ftell(f)) < 0) {
|
||||
fclose(f);
|
||||
return NULL;
|
||||
}
|
||||
*len = pos;
|
||||
if (fseek(f, 0, SEEK_SET) < 0) {
|
||||
fclose(f);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buf = os_malloc(*len);
|
||||
if (buf == NULL) {
|
||||
fclose(f);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fread(buf, 1, *len, f) != *len) {
|
||||
fclose(f);
|
||||
os_free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
int os_file_exists(const char *fname)
|
||||
{
|
||||
return access(fname, F_OK) == 0;
|
||||
}
|
||||
|
||||
|
||||
int os_fdatasync(FILE *stream)
|
||||
{
|
||||
if (!fflush(stream)) {
|
||||
#ifdef __linux__
|
||||
return fdatasync(fileno(stream));
|
||||
#else /* !__linux__ */
|
||||
#ifdef F_FULLFSYNC
|
||||
/* OS X does not implement fdatasync(). */
|
||||
return fcntl(fileno(stream), F_FULLFSYNC);
|
||||
#else /* F_FULLFSYNC */
|
||||
return fsync(fileno(stream));
|
||||
#endif /* F_FULLFSYNC */
|
||||
#endif /* __linux__ */
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#ifndef WPA_TRACE
|
||||
void * os_zalloc(size_t size)
|
||||
{
|
||||
return calloc(1, size);
|
||||
}
|
||||
#endif /* WPA_TRACE */
|
||||
|
||||
|
||||
size_t os_strlcpy(char *dest, const char *src, size_t siz)
|
||||
{
|
||||
const char *s = src;
|
||||
size_t left = siz;
|
||||
|
||||
if (left) {
|
||||
/* Copy string up to the maximum size of the dest buffer */
|
||||
while (--left != 0) {
|
||||
if ((*dest++ = *s++) == '\0')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (left == 0) {
|
||||
/* Not enough room for the string; force NUL-termination */
|
||||
if (siz != 0)
|
||||
*dest = '\0';
|
||||
while (*s++)
|
||||
; /* determine total src string length */
|
||||
}
|
||||
|
||||
return s - src - 1;
|
||||
}
|
||||
|
||||
|
||||
int os_memcmp_const(const void *a, const void *b, size_t len)
|
||||
{
|
||||
const u8 *aa = a;
|
||||
const u8 *bb = b;
|
||||
size_t i;
|
||||
u8 res;
|
||||
|
||||
for (res = 0, i = 0; i < len; i++)
|
||||
res |= aa[i] ^ bb[i];
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
#ifdef WPA_TRACE
|
||||
|
||||
#if defined(WPA_TRACE_BFD) && defined(CONFIG_TESTING_OPTIONS)
|
||||
char wpa_trace_fail_func[256] = { 0 };
|
||||
unsigned int wpa_trace_fail_after;
|
||||
|
||||
static int testing_fail_alloc(void)
|
||||
{
|
||||
const char *func[WPA_TRACE_LEN];
|
||||
size_t i, res, len;
|
||||
char *pos, *next;
|
||||
int match;
|
||||
|
||||
if (!wpa_trace_fail_after)
|
||||
return 0;
|
||||
|
||||
res = wpa_trace_calling_func(func, WPA_TRACE_LEN);
|
||||
i = 0;
|
||||
if (i < res && os_strcmp(func[i], __func__) == 0)
|
||||
i++;
|
||||
if (i < res && os_strcmp(func[i], "os_malloc") == 0)
|
||||
i++;
|
||||
if (i < res && os_strcmp(func[i], "os_zalloc") == 0)
|
||||
i++;
|
||||
if (i < res && os_strcmp(func[i], "os_calloc") == 0)
|
||||
i++;
|
||||
if (i < res && os_strcmp(func[i], "os_realloc") == 0)
|
||||
i++;
|
||||
if (i < res && os_strcmp(func[i], "os_realloc_array") == 0)
|
||||
i++;
|
||||
if (i < res && os_strcmp(func[i], "os_strdup") == 0)
|
||||
i++;
|
||||
|
||||
pos = wpa_trace_fail_func;
|
||||
|
||||
match = 0;
|
||||
while (i < res) {
|
||||
int allow_skip = 1;
|
||||
int maybe = 0;
|
||||
|
||||
if (*pos == '=') {
|
||||
allow_skip = 0;
|
||||
pos++;
|
||||
} else if (*pos == '?') {
|
||||
maybe = 1;
|
||||
pos++;
|
||||
}
|
||||
next = os_strchr(pos, ';');
|
||||
if (next)
|
||||
len = next - pos;
|
||||
else
|
||||
len = os_strlen(pos);
|
||||
if (os_memcmp(pos, func[i], len) != 0) {
|
||||
if (maybe && next) {
|
||||
pos = next + 1;
|
||||
continue;
|
||||
}
|
||||
if (allow_skip) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (!next) {
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
pos = next + 1;
|
||||
i++;
|
||||
}
|
||||
if (!match)
|
||||
return 0;
|
||||
|
||||
wpa_trace_fail_after--;
|
||||
if (wpa_trace_fail_after == 0) {
|
||||
wpa_printf(MSG_INFO, "TESTING: fail allocation at %s",
|
||||
wpa_trace_fail_func);
|
||||
for (i = 0; i < res; i++)
|
||||
wpa_printf(MSG_INFO, "backtrace[%d] = %s",
|
||||
(int) i, func[i]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
char wpa_trace_test_fail_func[256] = { 0 };
|
||||
unsigned int wpa_trace_test_fail_after;
|
||||
|
||||
int testing_test_fail(void)
|
||||
{
|
||||
const char *func[WPA_TRACE_LEN];
|
||||
size_t i, res, len;
|
||||
char *pos, *next;
|
||||
int match;
|
||||
|
||||
if (!wpa_trace_test_fail_after)
|
||||
return 0;
|
||||
|
||||
res = wpa_trace_calling_func(func, WPA_TRACE_LEN);
|
||||
i = 0;
|
||||
if (i < res && os_strcmp(func[i], __func__) == 0)
|
||||
i++;
|
||||
|
||||
pos = wpa_trace_test_fail_func;
|
||||
|
||||
match = 0;
|
||||
while (i < res) {
|
||||
int allow_skip = 1;
|
||||
int maybe = 0;
|
||||
|
||||
if (*pos == '=') {
|
||||
allow_skip = 0;
|
||||
pos++;
|
||||
} else if (*pos == '?') {
|
||||
maybe = 1;
|
||||
pos++;
|
||||
}
|
||||
next = os_strchr(pos, ';');
|
||||
if (next)
|
||||
len = next - pos;
|
||||
else
|
||||
len = os_strlen(pos);
|
||||
if (os_memcmp(pos, func[i], len) != 0) {
|
||||
if (maybe && next) {
|
||||
pos = next + 1;
|
||||
continue;
|
||||
}
|
||||
if (allow_skip) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (!next) {
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
pos = next + 1;
|
||||
i++;
|
||||
}
|
||||
if (!match)
|
||||
return 0;
|
||||
|
||||
wpa_trace_test_fail_after--;
|
||||
if (wpa_trace_test_fail_after == 0) {
|
||||
wpa_printf(MSG_INFO, "TESTING: fail at %s",
|
||||
wpa_trace_test_fail_func);
|
||||
for (i = 0; i < res; i++)
|
||||
wpa_printf(MSG_INFO, "backtrace[%d] = %s",
|
||||
(int) i, func[i]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int testing_fail_alloc(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void * os_malloc(size_t size)
|
||||
{
|
||||
struct os_alloc_trace *a;
|
||||
|
||||
if (testing_fail_alloc())
|
||||
return NULL;
|
||||
|
||||
a = malloc(sizeof(*a) + size);
|
||||
if (a == NULL)
|
||||
return NULL;
|
||||
a->magic = ALLOC_MAGIC;
|
||||
dl_list_add(&alloc_list, &a->list);
|
||||
a->len = size;
|
||||
wpa_trace_record(a);
|
||||
return a + 1;
|
||||
}
|
||||
|
||||
|
||||
void * os_realloc(void *ptr, size_t size)
|
||||
{
|
||||
struct os_alloc_trace *a;
|
||||
size_t copy_len;
|
||||
void *n;
|
||||
|
||||
if (ptr == NULL)
|
||||
return os_malloc(size);
|
||||
|
||||
a = (struct os_alloc_trace *) ptr - 1;
|
||||
if (a->magic != ALLOC_MAGIC) {
|
||||
wpa_printf(MSG_INFO, "REALLOC[%p]: invalid magic 0x%x%s",
|
||||
a, a->magic,
|
||||
a->magic == FREED_MAGIC ? " (already freed)" : "");
|
||||
wpa_trace_show("Invalid os_realloc() call");
|
||||
abort();
|
||||
}
|
||||
n = os_malloc(size);
|
||||
if (n == NULL)
|
||||
return NULL;
|
||||
copy_len = a->len;
|
||||
if (copy_len > size)
|
||||
copy_len = size;
|
||||
os_memcpy(n, a + 1, copy_len);
|
||||
os_free(ptr);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
void os_free(void *ptr)
|
||||
{
|
||||
struct os_alloc_trace *a;
|
||||
|
||||
if (ptr == NULL)
|
||||
return;
|
||||
a = (struct os_alloc_trace *) ptr - 1;
|
||||
if (a->magic != ALLOC_MAGIC) {
|
||||
wpa_printf(MSG_INFO, "FREE[%p]: invalid magic 0x%x%s",
|
||||
a, a->magic,
|
||||
a->magic == FREED_MAGIC ? " (already freed)" : "");
|
||||
wpa_trace_show("Invalid os_free() call");
|
||||
abort();
|
||||
}
|
||||
dl_list_del(&a->list);
|
||||
a->magic = FREED_MAGIC;
|
||||
|
||||
wpa_trace_check_ref(ptr);
|
||||
free(a);
|
||||
}
|
||||
|
||||
|
||||
void * os_zalloc(size_t size)
|
||||
{
|
||||
void *ptr = os_malloc(size);
|
||||
if (ptr)
|
||||
os_memset(ptr, 0, size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
char * os_strdup(const char *s)
|
||||
{
|
||||
size_t len;
|
||||
char *d;
|
||||
len = os_strlen(s);
|
||||
d = os_malloc(len + 1);
|
||||
if (d == NULL)
|
||||
return NULL;
|
||||
os_memcpy(d, s, len);
|
||||
d[len] = '\0';
|
||||
return d;
|
||||
}
|
||||
|
||||
#endif /* WPA_TRACE */
|
||||
|
||||
|
||||
int os_exec(const char *program, const char *arg, int wait_completion)
|
||||
{
|
||||
pid_t pid;
|
||||
int pid_status;
|
||||
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
perror("fork");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pid == 0) {
|
||||
/* run the external command in the child process */
|
||||
const int MAX_ARG = 30;
|
||||
char *_program, *_arg, *pos;
|
||||
char *argv[MAX_ARG + 1];
|
||||
int i;
|
||||
|
||||
_program = os_strdup(program);
|
||||
_arg = os_strdup(arg);
|
||||
|
||||
argv[0] = _program;
|
||||
|
||||
i = 1;
|
||||
pos = _arg;
|
||||
while (i < MAX_ARG && pos && *pos) {
|
||||
while (*pos == ' ')
|
||||
pos++;
|
||||
if (*pos == '\0')
|
||||
break;
|
||||
argv[i++] = pos;
|
||||
pos = os_strchr(pos, ' ');
|
||||
if (pos)
|
||||
*pos++ = '\0';
|
||||
}
|
||||
argv[i] = NULL;
|
||||
|
||||
execv(program, argv);
|
||||
perror("execv");
|
||||
os_free(_program);
|
||||
os_free(_arg);
|
||||
exit(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (wait_completion) {
|
||||
/* wait for the child process to complete in the parent */
|
||||
waitpid(pid, &pid_status, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
370
wpa_supplicant/src/utils/wpa_debug.h
Normal file
370
wpa_supplicant/src/utils/wpa_debug.h
Normal file
|
|
@ -0,0 +1,370 @@
|
|||
/*
|
||||
* wpa_supplicant/hostapd / Debug prints
|
||||
* Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef WPA_DEBUG_H
|
||||
#define WPA_DEBUG_H
|
||||
|
||||
#include "wpabuf.h"
|
||||
|
||||
extern int wpa_debug_level;
|
||||
extern int wpa_debug_show_keys;
|
||||
extern int wpa_debug_timestamp;
|
||||
|
||||
/* Debugging function - conditional printf and hex dump. Driver wrappers can
|
||||
* use these for debugging purposes. */
|
||||
|
||||
enum {
|
||||
MSG_EXCESSIVE, MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NO_STDOUT_DEBUG
|
||||
|
||||
#define wpa_debug_print_timestamp() do { } while (0)
|
||||
#define wpa_printf(args...) do { } while (0)
|
||||
#define wpa_hexdump(l,t,b,le) do { } while (0)
|
||||
#define wpa_hexdump_buf(l,t,b) do { } while (0)
|
||||
#define wpa_hexdump_key(l,t,b,le) do { } while (0)
|
||||
#define wpa_hexdump_buf_key(l,t,b) do { } while (0)
|
||||
#define wpa_hexdump_ascii(l,t,b,le) do { } while (0)
|
||||
#define wpa_hexdump_ascii_key(l,t,b,le) do { } while (0)
|
||||
#define wpa_debug_open_file(p) do { } while (0)
|
||||
#define wpa_debug_close_file() do { } while (0)
|
||||
#define wpa_debug_setup_stdout() do { } while (0)
|
||||
#define wpa_dbg(args...) do { } while (0)
|
||||
|
||||
static inline int wpa_debug_reopen_file(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* CONFIG_NO_STDOUT_DEBUG */
|
||||
|
||||
int wpa_debug_open_file(const char *path);
|
||||
int wpa_debug_reopen_file(void);
|
||||
void wpa_debug_close_file(void);
|
||||
void wpa_debug_setup_stdout(void);
|
||||
|
||||
/**
|
||||
* wpa_debug_printf_timestamp - Print timestamp for debug output
|
||||
*
|
||||
* This function prints a timestamp in seconds_from_1970.microsoconds
|
||||
* format if debug output has been configured to include timestamps in debug
|
||||
* messages.
|
||||
*/
|
||||
void wpa_debug_print_timestamp(void);
|
||||
|
||||
/**
|
||||
* wpa_printf - conditional printf
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages. The
|
||||
* output may be directed to stdout, stderr, and/or syslog based on
|
||||
* configuration.
|
||||
*
|
||||
* Note: New line '\n' is added to the end of the text when printing to stdout.
|
||||
*/
|
||||
void wpa_printf(int level, const char *fmt, ...)
|
||||
PRINTF_FORMAT(2, 3);
|
||||
|
||||
/**
|
||||
* wpa_hexdump - conditional hex dump
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @title: title of for the message
|
||||
* @buf: data buffer to be dumped
|
||||
* @len: length of the buf
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages. The
|
||||
* output may be directed to stdout, stderr, and/or syslog based on
|
||||
* configuration. The contents of buf is printed out has hex dump.
|
||||
*/
|
||||
void wpa_hexdump(int level, const char *title, const void *buf, size_t len);
|
||||
|
||||
static inline void wpa_hexdump_buf(int level, const char *title,
|
||||
const struct wpabuf *buf)
|
||||
{
|
||||
wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL,
|
||||
buf ? wpabuf_len(buf) : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* wpa_hexdump_key - conditional hex dump, hide keys
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @title: title of for the message
|
||||
* @buf: data buffer to be dumped
|
||||
* @len: length of the buf
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages. The
|
||||
* output may be directed to stdout, stderr, and/or syslog based on
|
||||
* configuration. The contents of buf is printed out has hex dump. This works
|
||||
* like wpa_hexdump(), but by default, does not include secret keys (passwords,
|
||||
* etc.) in debug output.
|
||||
*/
|
||||
void wpa_hexdump_key(int level, const char *title, const void *buf, size_t len);
|
||||
|
||||
static inline void wpa_hexdump_buf_key(int level, const char *title,
|
||||
const struct wpabuf *buf)
|
||||
{
|
||||
wpa_hexdump_key(level, title, buf ? wpabuf_head(buf) : NULL,
|
||||
buf ? wpabuf_len(buf) : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* wpa_hexdump_ascii - conditional hex dump
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @title: title of for the message
|
||||
* @buf: data buffer to be dumped
|
||||
* @len: length of the buf
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages. The
|
||||
* output may be directed to stdout, stderr, and/or syslog based on
|
||||
* configuration. The contents of buf is printed out has hex dump with both
|
||||
* the hex numbers and ASCII characters (for printable range) are shown. 16
|
||||
* bytes per line will be shown.
|
||||
*/
|
||||
void wpa_hexdump_ascii(int level, const char *title, const void *buf,
|
||||
size_t len);
|
||||
|
||||
/**
|
||||
* wpa_hexdump_ascii_key - conditional hex dump, hide keys
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @title: title of for the message
|
||||
* @buf: data buffer to be dumped
|
||||
* @len: length of the buf
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages. The
|
||||
* output may be directed to stdout, stderr, and/or syslog based on
|
||||
* configuration. The contents of buf is printed out has hex dump with both
|
||||
* the hex numbers and ASCII characters (for printable range) are shown. 16
|
||||
* bytes per line will be shown. This works like wpa_hexdump_ascii(), but by
|
||||
* default, does not include secret keys (passwords, etc.) in debug output.
|
||||
*/
|
||||
void wpa_hexdump_ascii_key(int level, const char *title, const void *buf,
|
||||
size_t len);
|
||||
|
||||
/*
|
||||
* wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce
|
||||
* binary size. As such, it should be used with debugging messages that are not
|
||||
* needed in the control interface while wpa_msg() has to be used for anything
|
||||
* that needs to shown to control interface monitors.
|
||||
*/
|
||||
#define wpa_dbg(args...) wpa_msg(args)
|
||||
|
||||
#endif /* CONFIG_NO_STDOUT_DEBUG */
|
||||
|
||||
|
||||
#ifdef CONFIG_NO_WPA_MSG
|
||||
#define wpa_msg(args...) do { } while (0)
|
||||
#define wpa_msg_ctrl(args...) do { } while (0)
|
||||
#define wpa_msg_global(args...) do { } while (0)
|
||||
#define wpa_msg_global_ctrl(args...) do { } while (0)
|
||||
#define wpa_msg_no_global(args...) do { } while (0)
|
||||
#define wpa_msg_global_only(args...) do { } while (0)
|
||||
#define wpa_msg_register_cb(f) do { } while (0)
|
||||
#define wpa_msg_register_ifname_cb(f) do { } while (0)
|
||||
#else /* CONFIG_NO_WPA_MSG */
|
||||
/**
|
||||
* wpa_msg - Conditional printf for default target and ctrl_iface monitors
|
||||
* @ctx: Pointer to context data; this is the ctx variable registered
|
||||
* with struct wpa_driver_ops::init()
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages. The
|
||||
* output may be directed to stdout, stderr, and/or syslog based on
|
||||
* configuration. This function is like wpa_printf(), but it also sends the
|
||||
* same message to all attached ctrl_iface monitors.
|
||||
*
|
||||
* Note: New line '\n' is added to the end of the text when printing to stdout.
|
||||
*/
|
||||
void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4);
|
||||
|
||||
/**
|
||||
* wpa_msg_ctrl - Conditional printf for ctrl_iface monitors
|
||||
* @ctx: Pointer to context data; this is the ctx variable registered
|
||||
* with struct wpa_driver_ops::init()
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages.
|
||||
* This function is like wpa_msg(), but it sends the output only to the
|
||||
* attached ctrl_iface monitors. In other words, it can be used for frequent
|
||||
* events that do not need to be sent to syslog.
|
||||
*/
|
||||
void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
|
||||
PRINTF_FORMAT(3, 4);
|
||||
|
||||
/**
|
||||
* wpa_msg_global - Global printf for ctrl_iface monitors
|
||||
* @ctx: Pointer to context data; this is the ctx variable registered
|
||||
* with struct wpa_driver_ops::init()
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages.
|
||||
* This function is like wpa_msg(), but it sends the output as a global event,
|
||||
* i.e., without being specific to an interface. For backwards compatibility,
|
||||
* an old style event is also delivered on one of the interfaces (the one
|
||||
* specified by the context data).
|
||||
*/
|
||||
void wpa_msg_global(void *ctx, int level, const char *fmt, ...)
|
||||
PRINTF_FORMAT(3, 4);
|
||||
|
||||
/**
|
||||
* wpa_msg_global_ctrl - Conditional global printf for ctrl_iface monitors
|
||||
* @ctx: Pointer to context data; this is the ctx variable registered
|
||||
* with struct wpa_driver_ops::init()
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages.
|
||||
* This function is like wpa_msg_global(), but it sends the output only to the
|
||||
* attached global ctrl_iface monitors. In other words, it can be used for
|
||||
* frequent events that do not need to be sent to syslog.
|
||||
*/
|
||||
void wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...)
|
||||
PRINTF_FORMAT(3, 4);
|
||||
|
||||
/**
|
||||
* wpa_msg_no_global - Conditional printf for ctrl_iface monitors
|
||||
* @ctx: Pointer to context data; this is the ctx variable registered
|
||||
* with struct wpa_driver_ops::init()
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages.
|
||||
* This function is like wpa_msg(), but it does not send the output as a global
|
||||
* event.
|
||||
*/
|
||||
void wpa_msg_no_global(void *ctx, int level, const char *fmt, ...)
|
||||
PRINTF_FORMAT(3, 4);
|
||||
|
||||
/**
|
||||
* wpa_msg_global_only - Conditional printf for ctrl_iface monitors
|
||||
* @ctx: Pointer to context data; this is the ctx variable registered
|
||||
* with struct wpa_driver_ops::init()
|
||||
* @level: priority level (MSG_*) of the message
|
||||
* @fmt: printf format string, followed by optional arguments
|
||||
*
|
||||
* This function is used to print conditional debugging and error messages.
|
||||
* This function is like wpa_msg_global(), but it sends the output only as a
|
||||
* global event.
|
||||
*/
|
||||
void wpa_msg_global_only(void *ctx, int level, const char *fmt, ...)
|
||||
PRINTF_FORMAT(3, 4);
|
||||
|
||||
enum wpa_msg_type {
|
||||
WPA_MSG_PER_INTERFACE,
|
||||
WPA_MSG_GLOBAL,
|
||||
WPA_MSG_NO_GLOBAL,
|
||||
WPA_MSG_ONLY_GLOBAL,
|
||||
};
|
||||
|
||||
typedef void (*wpa_msg_cb_func)(void *ctx, int level, enum wpa_msg_type type,
|
||||
const char *txt, size_t len);
|
||||
|
||||
/**
|
||||
* wpa_msg_register_cb - Register callback function for wpa_msg() messages
|
||||
* @func: Callback function (%NULL to unregister)
|
||||
*/
|
||||
void wpa_msg_register_cb(wpa_msg_cb_func func);
|
||||
|
||||
typedef const char * (*wpa_msg_get_ifname_func)(void *ctx);
|
||||
void wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func);
|
||||
|
||||
#endif /* CONFIG_NO_WPA_MSG */
|
||||
|
||||
#ifdef CONFIG_NO_HOSTAPD_LOGGER
|
||||
#define hostapd_logger(args...) do { } while (0)
|
||||
#define hostapd_logger_register_cb(f) do { } while (0)
|
||||
#else /* CONFIG_NO_HOSTAPD_LOGGER */
|
||||
void hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level,
|
||||
const char *fmt, ...) PRINTF_FORMAT(5, 6);
|
||||
|
||||
typedef void (*hostapd_logger_cb_func)(void *ctx, const u8 *addr,
|
||||
unsigned int module, int level,
|
||||
const char *txt, size_t len);
|
||||
|
||||
/**
|
||||
* hostapd_logger_register_cb - Register callback function for hostapd_logger()
|
||||
* @func: Callback function (%NULL to unregister)
|
||||
*/
|
||||
void hostapd_logger_register_cb(hostapd_logger_cb_func func);
|
||||
#endif /* CONFIG_NO_HOSTAPD_LOGGER */
|
||||
|
||||
#define HOSTAPD_MODULE_IEEE80211 0x00000001
|
||||
#define HOSTAPD_MODULE_IEEE8021X 0x00000002
|
||||
#define HOSTAPD_MODULE_RADIUS 0x00000004
|
||||
#define HOSTAPD_MODULE_WPA 0x00000008
|
||||
#define HOSTAPD_MODULE_DRIVER 0x00000010
|
||||
#define HOSTAPD_MODULE_IAPP 0x00000020
|
||||
#define HOSTAPD_MODULE_MLME 0x00000040
|
||||
|
||||
enum hostapd_logger_level {
|
||||
HOSTAPD_LEVEL_DEBUG_VERBOSE = 0,
|
||||
HOSTAPD_LEVEL_DEBUG = 1,
|
||||
HOSTAPD_LEVEL_INFO = 2,
|
||||
HOSTAPD_LEVEL_NOTICE = 3,
|
||||
HOSTAPD_LEVEL_WARNING = 4
|
||||
};
|
||||
|
||||
|
||||
#ifdef CONFIG_DEBUG_SYSLOG
|
||||
|
||||
void wpa_debug_open_syslog(void);
|
||||
void wpa_debug_close_syslog(void);
|
||||
|
||||
#else /* CONFIG_DEBUG_SYSLOG */
|
||||
|
||||
static inline void wpa_debug_open_syslog(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void wpa_debug_close_syslog(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DEBUG_SYSLOG */
|
||||
|
||||
#ifdef CONFIG_DEBUG_LINUX_TRACING
|
||||
|
||||
int wpa_debug_open_linux_tracing(void);
|
||||
void wpa_debug_close_linux_tracing(void);
|
||||
|
||||
#else /* CONFIG_DEBUG_LINUX_TRACING */
|
||||
|
||||
static inline int wpa_debug_open_linux_tracing(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void wpa_debug_close_linux_tracing(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DEBUG_LINUX_TRACING */
|
||||
|
||||
|
||||
#ifdef EAPOL_TEST
|
||||
#define WPA_ASSERT(a) \
|
||||
do { \
|
||||
if (!(a)) { \
|
||||
printf("WPA_ASSERT FAILED '" #a "' " \
|
||||
"%s %s:%d\n", \
|
||||
__FUNCTION__, __FILE__, __LINE__); \
|
||||
exit(1); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define WPA_ASSERT(a) do { } while (0)
|
||||
#endif
|
||||
|
||||
const char * debug_level_str(int level);
|
||||
int str_to_debug_level(const char *s);
|
||||
|
||||
#endif /* WPA_DEBUG_H */
|
||||
164
wpa_supplicant/src/utils/wpabuf.h
Normal file
164
wpa_supplicant/src/utils/wpabuf.h
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
* Dynamic data buffer
|
||||
* Copyright (c) 2007-2012, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef WPABUF_H
|
||||
#define WPABUF_H
|
||||
|
||||
/* wpabuf::buf is a pointer to external data */
|
||||
#define WPABUF_FLAG_EXT_DATA BIT(0)
|
||||
|
||||
/*
|
||||
* Internal data structure for wpabuf. Please do not touch this directly from
|
||||
* elsewhere. This is only defined in header file to allow inline functions
|
||||
* from this file to access data.
|
||||
*/
|
||||
struct wpabuf {
|
||||
size_t size; /* total size of the allocated buffer */
|
||||
size_t used; /* length of data in the buffer */
|
||||
u8 *buf; /* pointer to the head of the buffer */
|
||||
unsigned int flags;
|
||||
/* optionally followed by the allocated buffer */
|
||||
};
|
||||
|
||||
|
||||
int wpabuf_resize(struct wpabuf **buf, size_t add_len);
|
||||
struct wpabuf * wpabuf_alloc(size_t len);
|
||||
struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len);
|
||||
struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len);
|
||||
struct wpabuf * wpabuf_dup(const struct wpabuf *src);
|
||||
void wpabuf_free(struct wpabuf *buf);
|
||||
void wpabuf_clear_free(struct wpabuf *buf);
|
||||
void * wpabuf_put(struct wpabuf *buf, size_t len);
|
||||
struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b);
|
||||
struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len);
|
||||
void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3);
|
||||
struct wpabuf * wpabuf_parse_bin(const char *buf);
|
||||
|
||||
|
||||
/**
|
||||
* wpabuf_size - Get the currently allocated size of a wpabuf buffer
|
||||
* @buf: wpabuf buffer
|
||||
* Returns: Currently allocated size of the buffer
|
||||
*/
|
||||
static inline size_t wpabuf_size(const struct wpabuf *buf)
|
||||
{
|
||||
return buf->size;
|
||||
}
|
||||
|
||||
/**
|
||||
* wpabuf_len - Get the current length of a wpabuf buffer data
|
||||
* @buf: wpabuf buffer
|
||||
* Returns: Currently used length of the buffer
|
||||
*/
|
||||
static inline size_t wpabuf_len(const struct wpabuf *buf)
|
||||
{
|
||||
return buf->used;
|
||||
}
|
||||
|
||||
/**
|
||||
* wpabuf_tailroom - Get size of available tail room in the end of the buffer
|
||||
* @buf: wpabuf buffer
|
||||
* Returns: Tail room (in bytes) of available space in the end of the buffer
|
||||
*/
|
||||
static inline size_t wpabuf_tailroom(const struct wpabuf *buf)
|
||||
{
|
||||
return buf->size - buf->used;
|
||||
}
|
||||
|
||||
/**
|
||||
* wpabuf_head - Get pointer to the head of the buffer data
|
||||
* @buf: wpabuf buffer
|
||||
* Returns: Pointer to the head of the buffer data
|
||||
*/
|
||||
static inline const void * wpabuf_head(const struct wpabuf *buf)
|
||||
{
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf)
|
||||
{
|
||||
return (const u8 *) wpabuf_head(buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* wpabuf_mhead - Get modifiable pointer to the head of the buffer data
|
||||
* @buf: wpabuf buffer
|
||||
* Returns: Pointer to the head of the buffer data
|
||||
*/
|
||||
static inline void * wpabuf_mhead(struct wpabuf *buf)
|
||||
{
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf)
|
||||
{
|
||||
return (u8 *) wpabuf_mhead(buf);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data)
|
||||
{
|
||||
u8 *pos = (u8 *) wpabuf_put(buf, 1);
|
||||
*pos = data;
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data)
|
||||
{
|
||||
u8 *pos = (u8 *) wpabuf_put(buf, 2);
|
||||
WPA_PUT_LE16(pos, data);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data)
|
||||
{
|
||||
u8 *pos = (u8 *) wpabuf_put(buf, 4);
|
||||
WPA_PUT_LE32(pos, data);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data)
|
||||
{
|
||||
u8 *pos = (u8 *) wpabuf_put(buf, 2);
|
||||
WPA_PUT_BE16(pos, data);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data)
|
||||
{
|
||||
u8 *pos = (u8 *) wpabuf_put(buf, 3);
|
||||
WPA_PUT_BE24(pos, data);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data)
|
||||
{
|
||||
u8 *pos = (u8 *) wpabuf_put(buf, 4);
|
||||
WPA_PUT_BE32(pos, data);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_data(struct wpabuf *buf, const void *data,
|
||||
size_t len)
|
||||
{
|
||||
if (data)
|
||||
os_memcpy(wpabuf_put(buf, len), data, len);
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_buf(struct wpabuf *dst,
|
||||
const struct wpabuf *src)
|
||||
{
|
||||
wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src));
|
||||
}
|
||||
|
||||
static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len)
|
||||
{
|
||||
buf->buf = (u8 *) data;
|
||||
buf->flags = WPABUF_FLAG_EXT_DATA;
|
||||
buf->size = buf->used = len;
|
||||
}
|
||||
|
||||
static inline void wpabuf_put_str(struct wpabuf *dst, const char *str)
|
||||
{
|
||||
wpabuf_put_data(dst, str, os_strlen(str));
|
||||
}
|
||||
|
||||
#endif /* WPABUF_H */
|
||||
Loading…
Add table
Reference in a new issue