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