Imported Upstream version 1.24 upstream/1.24
authorZhang zhengguang <zhengguang.zhang@intel.com>
Thu, 17 Jul 2014 02:37:39 +0000 (10:37 +0800)
committerZhang zhengguang <zhengguang.zhang@intel.com>
Thu, 17 Jul 2014 02:37:39 +0000 (10:37 +0800)
216 files changed:
.gitignore [deleted file]
.mailmap [deleted file]
AUTHORS
ChangeLog
HACKING [deleted file]
Makefile.am
Makefile.in [new file with mode: 0644]
Makefile.plugins
README
TODO
acinclude.m4
aclocal.m4 [new file with mode: 0644]
bootstrap [deleted file]
bootstrap-configure [deleted file]
client/agent.c
client/commands.c
client/commands.h
client/dbus_helpers.c
client/dbus_helpers.h
client/input.c
client/input.h
client/peers.c [new file with mode: 0644]
client/peers.h [moved from include/types.h with 61% similarity]
client/services.c
client/vpnconnections.c
compile [new file with mode: 0755]
config.guess [new file with mode: 0755]
config.h.in [new file with mode: 0644]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
configure.ac
depcomp [new file with mode: 0755]
doc/Makefile.am [deleted file]
doc/advanced-configuration.txt
doc/coding-style.txt [deleted file]
doc/config-format.txt
doc/connman-docs.xml [deleted file]
doc/connman-introduction.xml [deleted file]
doc/connman.conf.5
doc/connmanctl.1 [deleted file]
doc/gtk-doc.make [deleted file]
doc/manager-api.txt
doc/overview-api.txt
doc/plugin-api.txt
doc/service-api.txt
doc/session-overview.txt
doc/technology-api.txt
doc/valgrind.suppressions [deleted file]
doc/version.xml.in [deleted file]
doc/vpn-agent-api.txt [deleted file]
doc/vpn-config-format.txt [deleted file]
gdbus/client.c
gdbus/gdbus.h
gdbus/mainloop.c
gdbus/object.c
gdbus/watch.c
gdhcp/client.c
gdhcp/common.c
gdhcp/common.h
gdhcp/gdhcp.h
gdhcp/ipv4ll.c
gdhcp/server.c
gsupplicant/dbus.c
gsupplicant/dbus.h
gsupplicant/gsupplicant.h
gsupplicant/supplicant.c
gweb/giognutls.c
gweb/giognutls.h
gweb/gionotls.c
gweb/gresolv.c
gweb/gresolv.h
gweb/gweb.c
gweb/gweb.h
include/agent.h
include/dbus.h
include/device.h
include/inet.h
include/ipaddress.h
include/log.h
include/network.h
include/notifier.h
include/peer.h [new file with mode: 0644]
include/provider.h
include/provision.h
include/service.h
include/session.h
include/setting.h
include/technology.h
install-sh [new file with mode: 0755]
ltmain.sh [new file with mode: 0644]
missing [new file with mode: 0755]
plugins/bluetooth.c
plugins/bluetooth_legacy.c
plugins/dundee.c
plugins/ethernet.c
plugins/gadget.c [new file with mode: 0644]
plugins/hh2serial-gps.c
plugins/iospm.c
plugins/loopback.c
plugins/neard.c
plugins/nmcompat.c
plugins/ofono.c
plugins/pacrunner.c
plugins/session_policy_local.c
plugins/tist.c
plugins/vpn.c
plugins/wifi.c
scripts/libppp-plugin.c
scripts/openconnect-script.c
scripts/openvpn-script.c
src/6to4.c
src/agent-connman.c
src/agent.c
src/bridge.c
src/clock.c
src/config.c
src/connection.c
src/connman.h
src/connman.service.in
src/counter.c
src/dbus.c
src/detect.c
src/device.c
src/dhcp.c
src/dhcpv6.c
src/dnsproxy.c
src/eduroam.config [new file with mode: 0644]
src/error.c
src/firewall.c
src/inet.c
src/inotify.c
src/ipaddress.c
src/ipconfig.c
src/ippool.c
src/iptables.c
src/ipv6pd.c [new file with mode: 0644]
src/log.c
src/main.c
src/main.conf
src/manager.c
src/nat.c
src/net.connman.service.in [new file with mode: 0644]
src/network.c
src/notifier.c
src/ntp.c
src/peer.c [new file with mode: 0644]
src/plugin.c
src/provider.c
src/proxy.c
src/resolver.c
src/rfkill.c
src/rtnl.c
src/service.c
src/session.c
src/shared/debugfs.c [deleted file]
src/shared/debugfs.h [deleted file]
src/shared/netlink.c [new file with mode: 0644]
src/shared/netlink.h [new file with mode: 0644]
src/shared/util.h
src/stats.c
src/storage.c
src/task.c
src/technology.c
src/tethering.c
src/timeserver.c
src/timezone.c
src/utsname.c
src/wispr.c
src/wpad.c
test/p2p-on-supplicant [new file with mode: 0755]
test/test-supplicant [deleted file]
tools/dbus-test.c
tools/dhcp-server-test.c
tools/dhcp-test.c
tools/dnsproxy-test.c
tools/iptables-test.c
tools/iptables-unit.c
tools/manager-api.c
tools/netlink-test.c [new file with mode: 0644]
tools/polkit-test.c
tools/private-network-test.c
tools/resolv-test.c
tools/session-api.c
tools/session-test.c
tools/session-test.h
tools/session-utils.c
tools/stats-tool.c
tools/supplicant-dbus.c
tools/supplicant-test.c
tools/supplicant.c
tools/tap-test.c
tools/web-test.c
tools/wispr.c
tools/wpad-test.c
unit/test-ippool.c
unit/test-pbkdf2-sha1.c
unit/test-prf-sha1.c
vpn/connman-vpn.conf [deleted file]
vpn/connman-vpn.service.in
vpn/main.c
vpn/plugins/l2tp.c
vpn/plugins/openconnect.c
vpn/plugins/openvpn.c
vpn/plugins/pptp.c
vpn/plugins/vpn.c
vpn/plugins/vpn.h
vpn/plugins/vpnc.c
vpn/vpn-agent.c
vpn/vpn-agent.h
vpn/vpn-config.c
vpn/vpn-ipconfig.c
vpn/vpn-manager.c
vpn/vpn-provider.c
vpn/vpn-provider.h
vpn/vpn-rtnl.c
vpn/vpn.h

diff --git a/.gitignore b/.gitignore
deleted file mode 100644 (file)
index 65fdc6a..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-*.o
-*.a
-*.lo
-*.la
-.deps
-.libs
-.dirstamp
-Makefile
-Makefile.in
-aclocal.m4
-config.guess
-config.h
-config.h.in
-config.log
-config.status
-config.sub
-configure
-depcomp
-compile
-install-sh
-libtool
-ltmain.sh
-missing
-stamp-h1
-autom4te.cache
-
-connman.pc
-include/connman
-include/version.h
-src/builtin.h
-src/connmand
-src/connman.conf
-src/connman.service
-src/*-connman.rules
-plugins/connman.policy
-scripts/connman
-scripts/openconnect-script
-scripts/openvpn-script
-client/connmanctl
-tools/wispr
-tools/dhcp-test
-tools/dhcp-server-test
-tools/addr-test
-tools/tap-test
-tools/web-test
-tools/wpad-test
-tools/resolv-test
-tools/polkit-test
-tools/iptables-test
-tools/iptables-unit
-tools/dnsproxy-test
-tools/supplicant-test
-tools/dbus-test
-tools/stats-tool
-tools/stats-ringbuffer-dump
-tools/private-network-test
-tools/session-test
-unit/test-ippool
-unit/test-nat
-unit/test-pbkdf2-sha1
-unit/test-prf-sha1
-
-doc/*.bak
-doc/*.stamp
-doc/connman.*
-!doc/connman.8
-!doc/connman.conf.5
-doc/connman-*.txt
-doc/*.sgml
-doc/version.xml
-doc/xml
-doc/html
-
-vpn/builtin.h
-vpn/connman-vpnd
-vpn/connman-vpn.service
-vpn/net.connman.vpn.service
diff --git a/.mailmap b/.mailmap
deleted file mode 100644 (file)
index 93fae59..0000000
--- a/.mailmap
+++ /dev/null
@@ -1,4 +0,0 @@
-Luiz Augusto von Dentz <luiz.dentz-von@nokia.com>      <luiz.dentz-von@nokia.com>
-Leena Gunda <leena.gunda@wipro.com>                    <leena.gunda@wipro.com>
-Flávio Ceolin <flavio.ceolin@profusion.mobi>          <flavio.ceolin@profusion.mobi>
-Daniel Wagner <daniel.wagner@bmw-carit.de>             <daniel.wagner@bmw-carit.de>
diff --git a/AUTHORS b/AUTHORS
index 4eb89e7..df0b8f1 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -52,3 +52,25 @@ Ceara Chewning <ceara.k.chewning@intel.com>
 Johannes Berg <johannes.berg@intel.com>
 Justin Maggard <jmaggard10@gmail.com>
 Yann E. Morin <yann.morin.1998@free.fr>
+Constantin Musca <constantinx.musca@intel.com>
+Terry Simons <terry.simons@gmail.com>
+Luciano Coelho <luciano.coelho@intel.com>
+Peter Meerwald <pmeerw@pmeerw.net>
+Chengyi Zhao <chengyix.zhao@gmail.com>
+Tysen Moore <tysen.moore@xs-embedded.com>
+Bastien Nocera <hadess@hadess.net>
+Michael Ikey Doherty <michael.i.doherty@intel.com>
+Mateusz Potrola <mateuszx.potrola@intel.com>
+Jaehyun Kim <jeik01.kim@samsung.com>
+Zhang Zhengguang <zhengguang.zhang@intel.com>
+Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+Alban Crequy <alban.crequy@collabora.co.uk>
+Philippe Coval <philippe.coval@open.eurogiciel.org>
+Hannu Mallat <hannu.mallat@jollamobile.com>
+Glenn Schmottlach <Glenn.Schmottlach@xs-embedded.com>
+Jonathan Liu <net147@gmail.com>
+Andrew LeCain <electricalpanel@gmail.com>
+Maneesh Jain <maneesh.jain@samsung.com>
+Eduardo Abinader <eduardo.abinader@openbossa.org>
+Guoqiang Liu <guoqiang.liu@archermind.com>
+Eric Bouxirot <eric.bouxirot@azimut-monitoring.com>
index a1340af..d622a84 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,88 @@
+ver 1.24:
+       Fix issue with handling slave interfaces.
+       Fix issue with handling DHCPv4 broadcast flag.
+       Fix issue with handling DHCPv4 lease expiration.
+       Fix issue with handling WiFi auto-scanning timeout.
+       Fix issue with handling domain and DNS server changes.
+       Fix issue with double free and agent messages.
+
+ver 1.23:
+       Fix issue with memory leak in technology handling.
+       Fix issue with not removing host route of OpenVPN.
+       Fix issue with double free in DHCP cleanup handling.
+       Fix issue with handling DHCP method from oFono.
+       Fix issue with IPv6-PD when disabling tethering.
+       Fix issue with DNS proxy when disabling tethering.
+       Fix issue with Bluetooth start and stop interaction.
+       Fix issue with Bluetooth PAN networks on adapter change.
+
+ver 1.22:
+       Fix issue with WPS state synchronization.
+       Fix issue with DNS servers and default service.
+       Fix issue with DHCP client and rebooting state.
+       Add support for NTP exponential backoff handling.
+       Add support for NTP kiss-of-death packet handling.
+       Add support for Ethernet gadget networking.
+
+ver 1.21:
+       Fix issue with WiFi networks and zero SSID length.
+       Fix issue with security details for hidden WiFi networks.
+       Fix issue with handling IPv6 proxy address resolving.
+       Fix issue with enabling Bluetooth controllers.
+
+ver 1.20:
+       Fix issue with invalid cache of DNS proxy support.
+       Fix issue with stopping DHCP for failed connections.
+       Fix issue with not stopping IPv4 Link-Local state machine.
+       Fix issue with service type handling for unknown interfaces.
+       Fix issue with using interface names instead of indexes.
+       Fix issue with resetting network retry counter on failure.
+       Fix issue with using nameservers when its type is not enabled.
+       Fix issue with fallback nameservers not being used.
+       Add support for NTP version 3 protocol.
+
+ver 1.19:
+       Fix issue with not correctly storing IPv4 method.
+       Fix issue with changing the default service too early.
+       Fix issue with service reference count and WISPr checks.
+       Fix issue with service auto-connect handling and ordering.
+       Fix issue with host and domain names when service changes.
+       Fix issue with proxy result and WISPr handling.
+       Fix issue with proxy reset when disconnecting.
+       Fix issue with handling fallback nameservers.
+       Add support for multiple agents.
+
+ver 1.18:
+       Fix issue with alignment calculation for iptables.
+       Fix issue with WEP key index parameter handling.
+       Fix issue with handling of 802.1x credentials.
+       Fix issue with command line parameter parsing.
+       Add support for completion handling in client tool.
+
+ver 1.17:
+       Fix issue with handling consecutive WiFi scanning.
+       Fix issue with WiFi handling and RFKILL soft block.
+       Fix issue with handling external RFKILL events.
+       Fix issue with handling USB gadget devices.
+       Fix issue with network reference handling.
+       Fix issue with byte order and DHCP discover options.
+       Fix issue with DHCP retry handling during IPv4-LL.
+       Fix issue with DHCPv6 rebind handling.
+       Add support for DHCPv6 decline message handling.
+       Add support for DHCPv6 duplicate address detection.
+
+ver 1.16:
+       Fix issue with missing signals during connection changes.
+       Fix issue with missing notification of proxy properties.
+       Fix issue with missing DHCPv6 domain list option.
+       Fix issue with missing DHCPv6 release message.
+       Fix issue with missing DHCPv6 error handling.
+       Fix issue with wrong IPCMv6 checksum calculation.
+       Fix issue with wrong service disconnect state.
+       Fix issue with failure to enable offline mode.
+       Add support for Netfilter Accounting (NFACCT).
+       Add support for IPv6 prefix delegation handling.
+
 ver 1.15:
        Fix issue with missing cleanup for IPv4-LL handling.
        Fix issue with missing property update for domain names.
diff --git a/HACKING b/HACKING
deleted file mode 100644 (file)
index 05fb69c..0000000
--- a/HACKING
+++ /dev/null
@@ -1,144 +0,0 @@
-Hacking on Connection Manager
-*****************************
-
-
-Build tools requirements
-========================
-
-When building and testing directly from the repository it is important to
-have at least automake version 1.10 or later installed. All modern
-distributions should default to the latest version, but it seems that
-Debian's default is still an earlier version:
-
-  Check version
-    # dpkg -l '*automake*'
-
-  Install new version
-    # apt-get install automake1.10
-    # update-alternatives --config automake
-
-
-Working with the source code repository
-=======================================
-
-The repository contains two extra scripts that accomplish the bootstrap
-process. One is called "bootstrap" which is the basic scripts that uses the
-autotools scripts to create the needed files for building and installing.
-It makes sure to call the right programs depending on the usage of shared or
-static libraries or translations etc.
-
-The second program is called "bootstrap-configure". This program will make
-sure to properly clean the repository, call the "bootstrap" script and then
-call configure with proper settings for development. It will use the best
-options and pass them over to configure. These options normally include
-the enabling the maintainer mode and the debugging features.
-
-So while in a normal source project the call "./configure ..." is used to
-configure the project with its settings like prefix and extra options. In
-case of bare repositories call "./bootstrap-configure" and it will bootstrap
-the repository and calls configure with all the correct options to make
-development easier.
-
-In case of preparing for a release with "make distcheck", don't use
-bootstrap-configure since it could export development specific settings.
-
-So the normal steps to checkout, build and install such a repository is
-like this:
-
-  Checkout repository
-    # git clone git://git.kernel.org/pub/scm/network/connman/connman.git
-    # cd connman
-
-  Configure and build
-    # ./bootstrap-configure
-    # make
-
-  Check installation
-    # make install DESTDIR=$PWD/x
-    # find x
-    # rm -rf x
-
-  Check distribution
-    # make distcheck
-
-  Final installation
-    # sudo make install
-
-  Remove autogenerated files
-    # make maintainer-clean
-
-
-Running from within the source code repository
-==============================================
-
-When using "./configure --enable-maintainer-mode" the automake scripts will
-use the plugins directly from within the repository. This removes the need
-to use "make install" when testing "connmand". The "bootstrap-configure"
-automatically includes this option.
-
-  Run daemon in foreground with debugging
-    # sudo ./src/connmand -n -d 'plugins/*'
-
-The debugging option -d takes an argument. This argument can be a comma
-separated list of file names like 'plugins/wifi.c,plugins/ethernet.c' to
-enable debugs in these files. Simple glob style pattern matching is
-supported in this list.
-
-For production installations or distribution packaging it is important that
-the "--enable-maintainer-mode" option is NOT used.
-
-Some times it is important to restrict the available interfaces. For example
-in cases where testing happens over a network connection. The "-i" command
-line switch allows to specify a glob pattern for the interface names.
-
-  Run daemon for wireless interfaces
-    # sudo ./src/connmand -n -i wlan*
-
-
-Debugging the D-Bus interface during runtime
-============================================
-
-Running the daemon with debugging information in the foreground is quite
-verbose and sometimes not really helpful. The "monitor-connman" script
-allows to monitor "PropertyChanged" D-Bus signals from various interfaces.
-
-Every "PropertyChanged" signal will generate a line of output. Some of them
-can get very complex. The first detail inside "{ ... }" is the interface
-name (without its service name prefix). The second detail inside "[ ... ]"
-is the object path. And after that it is followed by a key and value of
-the property that changed.
-
-
-Generating source code documentation
-====================================
-
-The source code is annotated using the gtk-doc style documentation. This
-allows an easy way of generating API documentation. The "bootstrap-configure"
-script will use the "--enable-gtk-doc" configure to enable the generation of
-the documentation.
-
-To make the gtk-doc process work, the gtk-doc tools need to be installed.
-Every distribution should provide a package for this, but the naming of the
-package might be different:
-
-  Debian
-    # apt-get install gtk-doc-tools
-
-  Ubuntu
-    # apt-get install gtk-doc-utils
-
-  Fedora
-    # yum install gtk-doc
-
-In case "bootstrap-configure" is not used, the manual steps for generating
-the documentation files are like this:
-
-  Configuring the repository
-    # ./configure --enable-gtk-doc
-
-  Generate the documentation
-    # cd doc && make
-
-  View documentation
-    # firefox doc/html/index.html
-
index a51c64f..53bf799 100644 (file)
@@ -1,15 +1,17 @@
 
 AM_MAKEFLAGS = --no-print-directory
 
+noinst_LTLIBRARIES =
+
 includedir = @includedir@/connman
 
-include_HEADERS = include/types.h include/log.h include/plugin.h \
+include_HEADERS = include/log.h include/plugin.h \
                        include/notifier.h include/service.h \
                        include/resolver.h include/ipconfig.h \
                        include/device.h include/network.h include/inet.h \
                        include/storage.h include/provision.h \
                        include/session.h include/ipaddress.h include/agent.h \
-                       include/inotify.h
+                       include/inotify.h include/peer.h
 
 nodist_include_HEADERS = include/version.h
 
@@ -23,7 +25,10 @@ local_headers = $(foreach file,$(include_HEADERS) $(nodist_include_HEADERS) \
                        $(noinst_HEADERS), include/connman/$(notdir $(file)))
 
 
-gdbus_sources = gdbus/gdbus.h gdbus/mainloop.c gdbus/watch.c \
+noinst_LTLIBRARIES += gdbus/libgdbus-internal.la
+
+gdbus_libgdbus_internal_la_SOURCES = gdbus/gdbus.h \
+                               gdbus/mainloop.c gdbus/watch.c \
                                gdbus/object.c gdbus/client.c gdbus/polkit.c
 
 gdhcp_sources = gdhcp/gdhcp.h gdhcp/common.h gdhcp/common.c gdhcp/client.c \
@@ -37,6 +42,9 @@ else
 gweb_sources += gweb/giognutls.h gweb/gionotls.c
 endif
 
+shared_sources = src/shared/util.h src/shared/util.c \
+               src/shared/netlink.h src/shared/netlink.c
+
 if DATAFILES
 
 if NMCOMPAT
@@ -81,8 +89,8 @@ MANUAL_PAGES =
 
 sbin_PROGRAMS = src/connmand
 
-src_connmand_SOURCES = $(gdbus_sources) $(gdhcp_sources) $(gweb_sources) \
-                       $(builtin_sources) src/connman.ver \
+src_connmand_SOURCES = $(gdhcp_sources) $(gweb_sources) \
+                       $(builtin_sources) $(shared_sources) src/connman.ver \
                        src/main.c src/connman.h src/log.c \
                        src/error.c src/plugin.c src/task.c \
                        src/device.c src/network.c src/connection.c \
@@ -97,10 +105,11 @@ src_connmand_SOURCES = $(gdbus_sources) $(gdhcp_sources) $(gweb_sources) \
                        src/session.c src/tethering.c src/wpad.c src/wispr.c \
                        src/stats.c src/iptables.c src/dnsproxy.c src/6to4.c \
                        src/ippool.c src/bridge.c src/nat.c src/ipaddress.c \
-                       src/inotify.c src/firewall.c
+                       src/inotify.c src/firewall.c src/ipv6pd.c src/peer.c
 
-src_connmand_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ \
-                               @XTABLES_LIBS@ @GNUTLS_LIBS@ -lresolv -ldl -lrt
+src_connmand_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \
+                       @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ @GNUTLS_LIBS@ \
+                       -lresolv -ldl -lrt
 
 src_connmand_LDFLAGS = -Wl,--export-dynamic \
                                -Wl,--version-script=$(srcdir)/src/connman.ver
@@ -117,7 +126,7 @@ builtin_vpn_cflags =
 
 sbin_PROGRAMS += vpn/connman-vpnd
 
-vpn_connman_vpnd_SOURCES = $(gdbus_sources) $(builtin_vpn_sources) \
+vpn_connman_vpnd_SOURCES = $(builtin_vpn_sources) \
                        $(gweb_sources) vpn/vpn.ver vpn/main.c vpn/vpn.h \
                        src/log.c src/error.c src/plugin.c src/task.c \
                        vpn/vpn-manager.c vpn/vpn-provider.c \
@@ -127,8 +136,9 @@ vpn_connman_vpnd_SOURCES = $(gdbus_sources) $(builtin_vpn_sources) \
                        vpn/vpn-agent.c vpn/vpn-agent.h src/inotify.c \
                        vpn/vpn-config.c
 
-vpn_connman_vpnd_LDADD = $(builtin_vpn_libadd) @GLIB_LIBS@ @DBUS_LIBS@ \
-                               @GNUTLS_LIBS@ -lresolv -ldl
+vpn_connman_vpnd_LDADD = gdbus/libgdbus-internal.la $(builtin_vpn_libadd) \
+                               @GLIB_LIBS@ @DBUS_LIBS@ @GNUTLS_LIBS@ \
+                               -lresolv -ldl
 
 vpn_connman_vpnd_LDFLAGS = -Wl,--export-dynamic \
                                -Wl,--version-script=$(srcdir)/vpn/vpn.ver
@@ -143,6 +153,7 @@ endif
 CLEANFILES = src/connman.conf $(BUILT_SOURCES)
 
 statedir = $(localstatedir)/run/connman
+vpn_statedir = $(localstatedir)/run/connman-vpn
 
 if VPN
 vpn_plugindir = $(libdir)/connman/plugins-vpn
@@ -175,6 +186,7 @@ AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ \
                                @GNUTLS_CFLAGS@ $(builtin_cflags) \
                                -DCONNMAN_PLUGIN_BUILTIN \
                                -DSTATEDIR=\""$(statedir)"\" \
+                               -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                -DPLUGINDIR=\""$(build_plugindir)"\" \
                                -DSCRIPTDIR=\""$(build_scriptdir)"\" \
                                -DSTORAGEDIR=\""$(storagedir)\"" \
@@ -205,7 +217,7 @@ if VPN
 vpn_connman_vpnd_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ \
                                $(builtin_vpn_cflags) \
                                -DCONNMAN_PLUGIN_BUILTIN \
-                               -DSTATEDIR=\""$(statedir)"\" \
+                               -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                -DPLUGINDIR=\""$(build_vpn_plugindir)"\" \
                                -DSCRIPTDIR=\""$(build_scriptdir)"\" \
                                -DSTORAGEDIR=\""$(storagedir)\"" \
@@ -228,16 +240,17 @@ noinst_PROGRAMS += client/connmanctl
 
 noinst_MANUAL_PAGES = doc/connmanctl.1
 
-client_connmanctl_SOURCES =  $(gdbus_sources) \
-                       client/dbus_helpers.h client/dbus_helpers.c \
+client_connmanctl_SOURCES = client/dbus_helpers.h client/dbus_helpers.c \
                        client/services.h client/services.c \
                        client/commands.h client/commands.c \
                        client/input.h client/input.c \
                        client/agent.h client/agent.c \
+                       client/peers.h client/peers.c \
                        client/vpnconnections.h client/vpnconnections.c \
                        client/main.c
 
-client_connmanctl_LDADD = @DBUS_LIBS@ @GLIB_LIBS@ -lreadline -ldl
+client_connmanctl_LDADD = gdbus/libgdbus-internal.la @DBUS_LIBS@ @GLIB_LIBS@ \
+                               -lreadline -ldl
 endif
 
 noinst_PROGRAMS += unit/test-pbkdf2-sha1 unit/test-prf-sha1 unit/test-ippool
@@ -250,9 +263,9 @@ unit_test_prf_sha1_SOURCES = unit/test-prf-sha1.c \
                                src/shared/sha1.h src/shared/sha1.c
 unit_test_prf_sha1_LDADD = @GLIB_LIBS@
 
-unit_test_ippool_SOURCES = $(gdbus_sources) src/log.c src/dbus.c \
-                src/ippool.c unit/test-ippool.c
-unit_test_ippool_LDADD = @GLIB_LIBS@ @DBUS_LIBS@ -ldl
+unit_test_ippool_SOURCES = src/log.c src/dbus.c src/ippool.c unit/test-ippool.c
+unit_test_ippool_LDADD = gdbus/libgdbus-internal.la \
+                               @GLIB_LIBS@ @DBUS_LIBS@ -ldl
 
 TESTS = unit/test-pbkdf2-sha1 unit/test-prf-sha1 unit/test-ippool
 
@@ -271,12 +284,13 @@ noinst_PROGRAMS += tools/supplicant-test \
                        tools/iptables-test tools/tap-test tools/wpad-test \
                        tools/stats-tool tools/private-network-test \
                        tools/session-test tools/iptables-unit \
-                       tools/dnsproxy-test
+                       tools/dnsproxy-test tools/netlink-test
 
-tools_supplicant_test_SOURCES = $(gdbus_sources) tools/supplicant-test.c \
+tools_supplicant_test_SOURCES = tools/supplicant-test.c \
                        tools/supplicant-dbus.h tools/supplicant-dbus.c \
                        tools/supplicant.h tools/supplicant.c
-tools_supplicant_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
+tools_supplicant_test_LDADD = gdbus/libgdbus-internal.la \
+                               @GLIB_LIBS@ @DBUS_LIBS@
 
 tools_web_test_SOURCES = $(gweb_sources) tools/web-test.c
 tools_web_test_LDADD = @GLIB_LIBS@ @GNUTLS_LIBS@ -lresolv
@@ -295,8 +309,8 @@ tools_dhcp_test_LDADD = @GLIB_LIBS@
 tools_dhcp_server_test_SOURCES = $(gdhcp_sources) tools/dhcp-server-test.c
 tools_dhcp_server_test_LDADD = @GLIB_LIBS@
 
-tools_dbus_test_SOURCES = $(gdbus_sources) tools/dbus-test.c
-tools_dbus_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
+tools_dbus_test_SOURCES = tools/dbus-test.c
+tools_dbus_test_LDADD = gdbus/libgdbus-internal.la @GLIB_LIBS@ @DBUS_LIBS@
 
 tools_polkit_test_LDADD = @DBUS_LIBS@
 
@@ -305,20 +319,25 @@ tools_iptables_test_LDADD = @GLIB_LIBS@ @XTABLES_LIBS@ -ldl
 
 tools_private_network_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
 
-tools_session_test_SOURCES = $(gdbus_sources) src/log.c src/dbus.c \
+tools_session_test_SOURCES = src/log.c src/dbus.c \
                tools/session-test.c tools/session-utils.c tools/manager-api.c \
                tools/session-api.c tools/session-test.h
-tools_session_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@ -ldl
+tools_session_test_LDADD = gdbus/libgdbus-internal.la \
+                               @GLIB_LIBS@ @DBUS_LIBS@ -ldl
 
 tools_iptables_unit_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ \
                -DIPTABLES_SAVE=\""${IPTABLES_SAVE}"\"
-tools_iptables_unit_SOURCES = $(gdbus_sources) src/log.c \
+tools_iptables_unit_SOURCES = src/log.c \
                 src/iptables.c src/firewall.c src/nat.c tools/iptables-unit.c
-tools_iptables_unit_LDADD = @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ -ldl
+tools_iptables_unit_LDADD = gdbus/libgdbus-internal.la \
+                               @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ -ldl
 
 tools_dnsproxy_test_SOURCES = tools/dnsproxy-test.c
 tools_dnsproxy_test_LDADD = @GLIB_LIBS@
 
+tools_netlink_test_SOURCES =$(shared_sources) tools/netlink-test.c
+tools_netlink_test_LDADD = @GLIB_LIBS@
+
 endif
 
 test_scripts = test/get-state test/list-services \
@@ -329,7 +348,7 @@ test_scripts = test/get-state test/list-services \
                test/test-counter test/set-ipv4-method test/set-ipv6-method \
                test/get-services test/get-proxy-autoconfig test/set-proxy \
                test/enable-tethering test/disable-tethering test/backtrace \
-               test/test-session test/test-supplicant \
+               test/test-session test/p2p-on-supplicant \
                test/test-new-supplicant test/service-move-before \
                test/set-global-timeservers test/get-global-timeservers \
                test/set-nameservers test/set-domains test/set-timeservers \
@@ -357,7 +376,8 @@ EXTRA_DIST += doc/overview-api.txt doc/behavior-api.txt \
                                doc/vpn-manager-api.txt doc/vpn-overview.txt \
                                doc/session-policy-format.txt
 
-EXTRA_DIST += src/main.conf
+EXTRA_DIST += src/main.conf \
+               src/eduroam.config
 
 MANUAL_PAGES += doc/connman.8 doc/connman.conf.5
 
@@ -367,8 +387,7 @@ pkgconfigdir = $(libdir)/pkgconfig
 
 pkgconfig_DATA = connman.pc
 
-DISTCHECK_CONFIGURE_FLAGS = --disable-gtk-doc \
-                               --disable-datafiles \
+DISTCHECK_CONFIGURE_FLAGS = --disable-datafiles \
                                --enable-hh2serial-gps \
                                --enable-openconnect \
                                --enable-openvpn \
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..f65924d
--- /dev/null
@@ -0,0 +1,5060 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WISPR_TRUE@am__append_1 = gweb/giognutls.h gweb/giognutls.c
+@WISPR_FALSE@am__append_2 = gweb/giognutls.h gweb/gionotls.c
+@DATAFILES_TRUE@@VPN_TRUE@am__append_3 = vpn/connman-vpn-dbus.conf
+@DATAFILES_TRUE@@SYSTEMD_TRUE@@VPN_TRUE@am__append_4 = vpn/connman-vpn.service
+noinst_PROGRAMS = $(am__EXEEXT_1) unit/test-pbkdf2-sha1$(EXEEXT) \
+       unit/test-prf-sha1$(EXEEXT) unit/test-ippool$(EXEEXT) \
+       $(am__EXEEXT_2) $(am__EXEEXT_3)
+sbin_PROGRAMS = src/connmand$(EXEEXT) $(am__EXEEXT_4)
+@VPN_TRUE@am__append_5 = vpn/connman-vpnd
+@VPN_TRUE@am__append_6 = vpn/builtin.h
+script_PROGRAMS = $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7)
+DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \
+       $(include_HEADERS) $(noinst_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/Makefile.plugins \
+       $(srcdir)/config.h.in $(srcdir)/connman.pc.in \
+       $(top_srcdir)/configure $(top_srcdir)/include/version.h.in \
+       $(top_srcdir)/scripts/connman.in \
+       $(top_srcdir)/src/connman.service.in \
+       $(top_srcdir)/src/net.connman.service.in \
+       $(top_srcdir)/vpn/connman-vpn.service.in \
+       $(top_srcdir)/vpn/net.connman.vpn.service.in AUTHORS COPYING \
+       ChangeLog INSTALL NEWS TODO compile config.guess config.sub \
+       depcomp install-sh ltmain.sh missing
+@LOOPBACK_TRUE@am__append_7 = loopback
+@LOOPBACK_TRUE@am__append_8 = plugins/loopback.c
+@ETHERNET_TRUE@am__append_9 = ethernet
+@ETHERNET_TRUE@am__append_10 = plugins/ethernet.c
+@GADGET_TRUE@am__append_11 = gadget
+@GADGET_TRUE@am__append_12 = plugins/gadget.c
+@WIFI_TRUE@am__append_13 = wifi
+@WIFI_TRUE@am__append_14 = plugins/wifi.c $(gsupplicant_sources)
+@BLUETOOTH_TRUE@am__append_15 = bluetooth_legacy bluetooth
+@BLUETOOTH_TRUE@am__append_16 = plugins/bluetooth_legacy.c \
+@BLUETOOTH_TRUE@       plugins/bluetooth.c
+@HH2SERIAL_GPS_BUILTIN_TRUE@@HH2SERIAL_GPS_TRUE@am__append_17 = hh2serial_gps
+@HH2SERIAL_GPS_BUILTIN_TRUE@@HH2SERIAL_GPS_TRUE@am__append_18 = plugins/hh2serial-gps.c
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@am__append_19 = plugins/hh2serial-gps.la
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@am__append_20 = $(plugins_hh2serial_gps_la_OBJECTS)
+@OFONO_TRUE@am__append_21 = ofono
+@OFONO_TRUE@am__append_22 = plugins/mcc.h plugins/ofono.c
+@DUNDEE_TRUE@am__append_23 = dundee
+@DUNDEE_TRUE@am__append_24 = plugins/dundee.c
+@VPN_TRUE@am__append_25 = vpn
+@VPN_TRUE@am__append_26 = plugins/vpn.c
+@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@am__append_27 = openconnect
+@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@am__append_28 = vpn/plugins/openconnect.c
+@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@am__append_29 = -DOPENCONNECT=\"@OPENCONNECT@\"
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@am__append_30 = vpn/plugins/openconnect.la
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@am__append_31 = $(plugins_openconnect_la_OBJECTS)
+@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__append_32 = openvpn
+@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__append_33 = vpn/plugins/openvpn.c
+@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__append_34 = -DOPENVPN=\"@OPENVPN@\"
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@am__append_35 = vpn/plugins/openvpn.la
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@am__append_36 = $(plugins_openvpn_la_OBJECTS)
+@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__append_37 = vpnc
+@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__append_38 = vpn/plugins/vpnc.c
+@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__append_39 = -DVPNC=\"@VPNC@\"
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@am__append_40 = vpn/plugins/vpnc.la
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@am__append_41 = $(plugins_vpnc_la_OBJECTS)
+@L2TP_BUILTIN_TRUE@@L2TP_TRUE@@VPN_TRUE@am__append_42 = l2tp
+@L2TP_BUILTIN_TRUE@@L2TP_TRUE@@VPN_TRUE@am__append_43 = vpn/plugins/l2tp.c
+@L2TP_BUILTIN_TRUE@@L2TP_TRUE@@VPN_TRUE@am__append_44 = -DL2TP=\"@L2TP@\"
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@am__append_45 = vpn/plugins/l2tp.la
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@am__append_46 = $(plugins_l2tp_la_OBJECTS)
+@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__append_47 = pptp
+@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__append_48 = vpn/plugins/pptp.c
+@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__append_49 = -DPPPD=\"@PPPD@\" -DPPTP=\"@PPTP@\"
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@am__append_50 = vpn/plugins/pptp.la
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@am__append_51 = $(plugins_pptp_la_OBJECTS)
+@PPTP_TRUE@@VPN_TRUE@am__append_52 = scripts/libppp-plugin.la
+@L2TP_TRUE@@PPTP_FALSE@@VPN_TRUE@am__append_53 = scripts/libppp-plugin.la
+@PACRUNNER_TRUE@am__append_54 = pacrunner
+@PACRUNNER_TRUE@am__append_55 = plugins/pacrunner.c
+@POLKIT_TRUE@am__append_56 = polkit
+@POLKIT_TRUE@am__append_57 = plugins/polkit.c
+@DATAFILES_TRUE@@POLKIT_TRUE@@VPN_TRUE@am__append_58 = vpn/net.connman.vpn.policy
+@IOSPM_TRUE@am__append_59 = plugins/iospm.la
+@IOSPM_TRUE@am__append_60 = $(plugins_iospm_la_OBJECTS)
+@OPENCONNECT_TRUE@am__append_61 = scripts/openconnect-script
+@OPENCONNECT_FALSE@@VPNC_TRUE@am__append_62 = scripts/openconnect-script
+@OPENVPN_TRUE@am__append_63 = scripts/openvpn-script
+@NMCOMPAT_TRUE@am__append_64 = nmcompat
+@NMCOMPAT_TRUE@am__append_65 = plugins/nmcompat.c
+@TIST_BUILTIN_TRUE@@TIST_TRUE@am__append_66 = tist
+@TIST_BUILTIN_TRUE@@TIST_TRUE@am__append_67 = plugins/tist.c
+@TIST_BUILTIN_FALSE@@TIST_TRUE@am__append_68 = plugins/tist.la
+@TIST_BUILTIN_FALSE@@TIST_TRUE@am__append_69 = $(plugins_tist_la_OBJECTS)
+@SESSION_POLICY_LOCAL_BUILTIN_TRUE@@SESSION_POLICY_LOCAL_TRUE@am__append_70 = session_policy_local
+@SESSION_POLICY_LOCAL_BUILTIN_TRUE@@SESSION_POLICY_LOCAL_TRUE@am__append_71 = plugins/session_policy_local.c
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@am__append_72 = plugins/session_policy_local.la
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@am__append_73 = $(plugins_session_policy_local_la_OBJECTS)
+@NEARD_TRUE@am__append_74 = neard
+@NEARD_TRUE@am__append_75 = plugins/neard.c
+@CLIENT_TRUE@am__append_76 = client/connmanctl
+TESTS = unit/test-pbkdf2-sha1$(EXEEXT) unit/test-prf-sha1$(EXEEXT) \
+       unit/test-ippool$(EXEEXT)
+@WISPR_TRUE@am__append_77 = tools/wispr
+@TOOLS_TRUE@am__append_78 = tools/supplicant-test \
+@TOOLS_TRUE@                   tools/dhcp-test tools/dhcp-server-test \
+@TOOLS_TRUE@                   tools/addr-test tools/web-test tools/resolv-test \
+@TOOLS_TRUE@                   tools/dbus-test tools/polkit-test \
+@TOOLS_TRUE@                   tools/iptables-test tools/tap-test tools/wpad-test \
+@TOOLS_TRUE@                   tools/stats-tool tools/private-network-test \
+@TOOLS_TRUE@                   tools/session-test tools/iptables-unit \
+@TOOLS_TRUE@                   tools/dnsproxy-test tools/netlink-test
+
+@SELINUX_TRUE@@VPN_TRUE@am__append_79 = connman-task.pp
+@SELINUX_TRUE@@VPN_TRUE@am__append_80 = connman-task.pp
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = include/version.h src/connman.service \
+       vpn/connman-vpn.service vpn/net.connman.vpn.service \
+       scripts/connman connman.pc src/net.connman.service
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(scriptdir)" \
+       "$(DESTDIR)$(vpn_plugindir)" "$(DESTDIR)$(sbindir)" \
+       "$(DESTDIR)$(scriptdir)" "$(DESTDIR)$(testdir)" \
+       "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" \
+       "$(DESTDIR)$(dbusconfdir)" "$(DESTDIR)$(dbusservicedir)" \
+       "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(policydir)" \
+       "$(DESTDIR)$(scriptdir)" "$(DESTDIR)$(systemdunitdir)" \
+       "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(noinst_LTLIBRARIES) $(plugin_LTLIBRARIES) \
+       $(script_LTLIBRARIES) $(vpn_plugin_LTLIBRARIES)
+gdbus_libgdbus_internal_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_gdbus_libgdbus_internal_la_OBJECTS = gdbus/mainloop.lo \
+       gdbus/watch.lo gdbus/object.lo gdbus/client.lo gdbus/polkit.lo
+gdbus_libgdbus_internal_la_OBJECTS =  \
+       $(am_gdbus_libgdbus_internal_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+plugins_hh2serial_gps_la_LIBADD =
+plugins_hh2serial_gps_la_SOURCES = plugins/hh2serial-gps.c
+plugins_hh2serial_gps_la_OBJECTS =  \
+       plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo
+plugins_hh2serial_gps_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(plugins_hh2serial_gps_la_CFLAGS) $(CFLAGS) \
+       $(plugins_hh2serial_gps_la_LDFLAGS) $(LDFLAGS) -o $@
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@am_plugins_hh2serial_gps_la_rpath =  \
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@      -rpath \
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@      $(plugindir)
+plugins_iospm_la_LIBADD =
+plugins_iospm_la_SOURCES = plugins/iospm.c
+plugins_iospm_la_OBJECTS = plugins/plugins_iospm_la-iospm.lo
+plugins_iospm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(plugins_iospm_la_CFLAGS) $(CFLAGS) \
+       $(plugins_iospm_la_LDFLAGS) $(LDFLAGS) -o $@
+@IOSPM_TRUE@am_plugins_iospm_la_rpath = -rpath $(plugindir)
+plugins_session_policy_local_la_LIBADD =
+plugins_session_policy_local_la_SOURCES =  \
+       plugins/session_policy_local.c
+plugins_session_policy_local_la_OBJECTS = plugins/plugins_session_policy_local_la-session_policy_local.lo
+plugins_session_policy_local_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(plugins_session_policy_local_la_CFLAGS) $(CFLAGS) \
+       $(plugins_session_policy_local_la_LDFLAGS) $(LDFLAGS) -o $@
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@am_plugins_session_policy_local_la_rpath = -rpath \
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@        $(plugindir)
+plugins_tist_la_LIBADD =
+plugins_tist_la_SOURCES = plugins/tist.c
+plugins_tist_la_OBJECTS = plugins/plugins_tist_la-tist.lo
+plugins_tist_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(plugins_tist_la_CFLAGS) $(CFLAGS) $(plugins_tist_la_LDFLAGS) \
+       $(LDFLAGS) -o $@
+@TIST_BUILTIN_FALSE@@TIST_TRUE@am_plugins_tist_la_rpath = -rpath \
+@TIST_BUILTIN_FALSE@@TIST_TRUE@        $(plugindir)
+scripts_libppp_plugin_la_DEPENDENCIES =
+scripts_libppp_plugin_la_SOURCES = scripts/libppp-plugin.c
+scripts_libppp_plugin_la_OBJECTS = scripts/libppp-plugin.lo
+scripts_libppp_plugin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(AM_CFLAGS) $(CFLAGS) $(scripts_libppp_plugin_la_LDFLAGS) \
+       $(LDFLAGS) -o $@
+@L2TP_TRUE@@PPTP_FALSE@@VPN_TRUE@am_scripts_libppp_plugin_la_rpath =  \
+@L2TP_TRUE@@PPTP_FALSE@@VPN_TRUE@      -rpath $(scriptdir)
+@PPTP_TRUE@@VPN_TRUE@am_scripts_libppp_plugin_la_rpath = -rpath \
+@PPTP_TRUE@@VPN_TRUE@  $(scriptdir)
+vpn_plugins_l2tp_la_LIBADD =
+am__vpn_plugins_l2tp_la_SOURCES_DIST = vpn/plugins/vpn.h \
+       vpn/plugins/vpn.c vpn/plugins/l2tp.c
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@am_vpn_plugins_l2tp_la_OBJECTS = vpn/plugins/vpn_plugins_l2tp_la-vpn.lo \
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@      vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo
+vpn_plugins_l2tp_la_OBJECTS = $(am_vpn_plugins_l2tp_la_OBJECTS)
+vpn_plugins_l2tp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(vpn_plugins_l2tp_la_CFLAGS) $(CFLAGS) \
+       $(vpn_plugins_l2tp_la_LDFLAGS) $(LDFLAGS) -o $@
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@am_vpn_plugins_l2tp_la_rpath =  \
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@      -rpath \
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@      $(vpn_plugindir)
+vpn_plugins_openconnect_la_LIBADD =
+am__vpn_plugins_openconnect_la_SOURCES_DIST = vpn/plugins/vpn.h \
+       vpn/plugins/vpn.c vpn/plugins/openconnect.c
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@am_vpn_plugins_openconnect_la_OBJECTS = vpn/plugins/vpn_plugins_openconnect_la-vpn.lo \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@        vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo
+vpn_plugins_openconnect_la_OBJECTS =  \
+       $(am_vpn_plugins_openconnect_la_OBJECTS)
+vpn_plugins_openconnect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(vpn_plugins_openconnect_la_CFLAGS) $(CFLAGS) \
+       $(vpn_plugins_openconnect_la_LDFLAGS) $(LDFLAGS) -o $@
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@am_vpn_plugins_openconnect_la_rpath =  \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@        -rpath \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@        $(vpn_plugindir)
+vpn_plugins_openvpn_la_LIBADD =
+am__vpn_plugins_openvpn_la_SOURCES_DIST = vpn/plugins/vpn.h \
+       vpn/plugins/vpn.c vpn/plugins/openvpn.c
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@am_vpn_plugins_openvpn_la_OBJECTS = vpn/plugins/vpn_plugins_openvpn_la-vpn.lo \
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@        vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo
+vpn_plugins_openvpn_la_OBJECTS = $(am_vpn_plugins_openvpn_la_OBJECTS)
+vpn_plugins_openvpn_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(vpn_plugins_openvpn_la_CFLAGS) $(CFLAGS) \
+       $(vpn_plugins_openvpn_la_LDFLAGS) $(LDFLAGS) -o $@
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@am_vpn_plugins_openvpn_la_rpath =  \
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@        -rpath \
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@        $(vpn_plugindir)
+vpn_plugins_pptp_la_LIBADD =
+am__vpn_plugins_pptp_la_SOURCES_DIST = vpn/plugins/vpn.h \
+       vpn/plugins/vpn.c vpn/plugins/pptp.c
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@am_vpn_plugins_pptp_la_OBJECTS = vpn/plugins/vpn_plugins_pptp_la-vpn.lo \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@      vpn/plugins/vpn_plugins_pptp_la-pptp.lo
+vpn_plugins_pptp_la_OBJECTS = $(am_vpn_plugins_pptp_la_OBJECTS)
+vpn_plugins_pptp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(vpn_plugins_pptp_la_CFLAGS) $(CFLAGS) \
+       $(vpn_plugins_pptp_la_LDFLAGS) $(LDFLAGS) -o $@
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@am_vpn_plugins_pptp_la_rpath =  \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@      -rpath \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@      $(vpn_plugindir)
+vpn_plugins_vpnc_la_LIBADD =
+am__vpn_plugins_vpnc_la_SOURCES_DIST = vpn/plugins/vpn.h \
+       vpn/plugins/vpn.c vpn/plugins/vpnc.c
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@am_vpn_plugins_vpnc_la_OBJECTS = vpn/plugins/vpn_plugins_vpnc_la-vpn.lo \
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@      vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo
+vpn_plugins_vpnc_la_OBJECTS = $(am_vpn_plugins_vpnc_la_OBJECTS)
+vpn_plugins_vpnc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(vpn_plugins_vpnc_la_CFLAGS) $(CFLAGS) \
+       $(vpn_plugins_vpnc_la_LDFLAGS) $(LDFLAGS) -o $@
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@am_vpn_plugins_vpnc_la_rpath =  \
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@      -rpath \
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@      $(vpn_plugindir)
+@CLIENT_TRUE@am__EXEEXT_1 = client/connmanctl$(EXEEXT)
+@WISPR_TRUE@am__EXEEXT_2 = tools/wispr$(EXEEXT)
+@TOOLS_TRUE@am__EXEEXT_3 = tools/supplicant-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/dhcp-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/dhcp-server-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/addr-test$(EXEEXT) tools/web-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/resolv-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/dbus-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/polkit-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/iptables-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/tap-test$(EXEEXT) tools/wpad-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/stats-tool$(EXEEXT) \
+@TOOLS_TRUE@   tools/private-network-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/session-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/iptables-unit$(EXEEXT) \
+@TOOLS_TRUE@   tools/dnsproxy-test$(EXEEXT) \
+@TOOLS_TRUE@   tools/netlink-test$(EXEEXT)
+@VPN_TRUE@am__EXEEXT_4 = vpn/connman-vpnd$(EXEEXT)
+@OPENCONNECT_TRUE@am__EXEEXT_5 = scripts/openconnect-script$(EXEEXT)
+@OPENCONNECT_FALSE@@VPNC_TRUE@am__EXEEXT_6 = scripts/openconnect-script$(EXEEXT)
+@OPENVPN_TRUE@am__EXEEXT_7 = scripts/openvpn-script$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS) $(script_PROGRAMS)
+am__client_connmanctl_SOURCES_DIST = client/dbus_helpers.h \
+       client/dbus_helpers.c client/services.h client/services.c \
+       client/commands.h client/commands.c client/input.h \
+       client/input.c client/agent.h client/agent.c client/peers.h \
+       client/peers.c client/vpnconnections.h client/vpnconnections.c \
+       client/main.c
+@CLIENT_TRUE@am_client_connmanctl_OBJECTS =  \
+@CLIENT_TRUE@  client/dbus_helpers.$(OBJEXT) \
+@CLIENT_TRUE@  client/services.$(OBJEXT) \
+@CLIENT_TRUE@  client/commands.$(OBJEXT) client/input.$(OBJEXT) \
+@CLIENT_TRUE@  client/agent.$(OBJEXT) client/peers.$(OBJEXT) \
+@CLIENT_TRUE@  client/vpnconnections.$(OBJEXT) \
+@CLIENT_TRUE@  client/main.$(OBJEXT)
+client_connmanctl_OBJECTS = $(am_client_connmanctl_OBJECTS)
+@CLIENT_TRUE@client_connmanctl_DEPENDENCIES =  \
+@CLIENT_TRUE@  gdbus/libgdbus-internal.la
+scripts_openconnect_script_SOURCES = scripts/openconnect-script.c
+scripts_openconnect_script_OBJECTS =  \
+       scripts/openconnect-script.$(OBJEXT)
+scripts_openconnect_script_DEPENDENCIES =
+scripts_openvpn_script_SOURCES = scripts/openvpn-script.c
+scripts_openvpn_script_OBJECTS = scripts/openvpn-script.$(OBJEXT)
+scripts_openvpn_script_DEPENDENCIES =
+am__src_connmand_SOURCES_DIST = gdhcp/gdhcp.h gdhcp/common.h \
+       gdhcp/common.c gdhcp/client.c gdhcp/server.c gdhcp/ipv4ll.h \
+       gdhcp/ipv4ll.c gdhcp/unaligned.h gweb/gweb.h gweb/gweb.c \
+       gweb/gresolv.h gweb/gresolv.c gweb/giognutls.h \
+       gweb/giognutls.c gweb/gionotls.c plugins/loopback.c \
+       plugins/ethernet.c plugins/gadget.c plugins/wifi.c \
+       gsupplicant/gsupplicant.h gsupplicant/dbus.h \
+       gsupplicant/supplicant.c gsupplicant/dbus.c \
+       plugins/bluetooth_legacy.c plugins/bluetooth.c \
+       plugins/hh2serial-gps.c plugins/mcc.h plugins/ofono.c \
+       plugins/dundee.c plugins/vpn.c plugins/pacrunner.c \
+       plugins/polkit.c plugins/nmcompat.c plugins/tist.c \
+       plugins/session_policy_local.c plugins/neard.c \
+       src/shared/util.h src/shared/util.c src/shared/netlink.h \
+       src/shared/netlink.c src/connman.ver src/main.c src/connman.h \
+       src/log.c src/error.c src/plugin.c src/task.c src/device.c \
+       src/network.c src/connection.c src/manager.c src/service.c \
+       src/clock.c src/timezone.c src/agent-connman.c src/agent.c \
+       src/notifier.c src/provider.c src/resolver.c src/ipconfig.c \
+       src/detect.c src/inet.c src/dhcp.c src/dhcpv6.c src/rtnl.c \
+       src/proxy.c src/utsname.c src/timeserver.c src/rfkill.c \
+       src/storage.c src/dbus.c src/config.c src/technology.c \
+       src/counter.c src/ntp.c src/session.c src/tethering.c \
+       src/wpad.c src/wispr.c src/stats.c src/iptables.c \
+       src/dnsproxy.c src/6to4.c src/ippool.c src/bridge.c src/nat.c \
+       src/ipaddress.c src/inotify.c src/firewall.c src/ipv6pd.c \
+       src/peer.c
+am__objects_1 = gdhcp/src_connmand-common.$(OBJEXT) \
+       gdhcp/src_connmand-client.$(OBJEXT) \
+       gdhcp/src_connmand-server.$(OBJEXT) \
+       gdhcp/src_connmand-ipv4ll.$(OBJEXT)
+@WISPR_TRUE@am__objects_2 = gweb/src_connmand-giognutls.$(OBJEXT)
+@WISPR_FALSE@am__objects_3 = gweb/src_connmand-gionotls.$(OBJEXT)
+am__objects_4 = gweb/src_connmand-gweb.$(OBJEXT) \
+       gweb/src_connmand-gresolv.$(OBJEXT) $(am__objects_2) \
+       $(am__objects_3)
+@LOOPBACK_TRUE@am__objects_5 =  \
+@LOOPBACK_TRUE@        plugins/src_connmand-loopback.$(OBJEXT)
+@ETHERNET_TRUE@am__objects_6 =  \
+@ETHERNET_TRUE@        plugins/src_connmand-ethernet.$(OBJEXT)
+@GADGET_TRUE@am__objects_7 = plugins/src_connmand-gadget.$(OBJEXT)
+am__objects_8 = gsupplicant/src_connmand-supplicant.$(OBJEXT) \
+       gsupplicant/src_connmand-dbus.$(OBJEXT)
+@WIFI_TRUE@am__objects_9 = plugins/src_connmand-wifi.$(OBJEXT) \
+@WIFI_TRUE@    $(am__objects_8)
+@BLUETOOTH_TRUE@am__objects_10 = plugins/src_connmand-bluetooth_legacy.$(OBJEXT) \
+@BLUETOOTH_TRUE@       plugins/src_connmand-bluetooth.$(OBJEXT)
+@HH2SERIAL_GPS_BUILTIN_TRUE@@HH2SERIAL_GPS_TRUE@am__objects_11 = plugins/src_connmand-hh2serial-gps.$(OBJEXT)
+@OFONO_TRUE@am__objects_12 = plugins/src_connmand-ofono.$(OBJEXT)
+@DUNDEE_TRUE@am__objects_13 = plugins/src_connmand-dundee.$(OBJEXT)
+@VPN_TRUE@am__objects_14 = plugins/src_connmand-vpn.$(OBJEXT)
+@PACRUNNER_TRUE@am__objects_15 =  \
+@PACRUNNER_TRUE@       plugins/src_connmand-pacrunner.$(OBJEXT)
+@POLKIT_TRUE@am__objects_16 = plugins/src_connmand-polkit.$(OBJEXT)
+@NMCOMPAT_TRUE@am__objects_17 =  \
+@NMCOMPAT_TRUE@        plugins/src_connmand-nmcompat.$(OBJEXT)
+@TIST_BUILTIN_TRUE@@TIST_TRUE@am__objects_18 = plugins/src_connmand-tist.$(OBJEXT)
+@SESSION_POLICY_LOCAL_BUILTIN_TRUE@@SESSION_POLICY_LOCAL_TRUE@am__objects_19 = plugins/src_connmand-session_policy_local.$(OBJEXT)
+@NEARD_TRUE@am__objects_20 = plugins/src_connmand-neard.$(OBJEXT)
+am__objects_21 = $(am__objects_5) $(am__objects_6) $(am__objects_7) \
+       $(am__objects_9) $(am__objects_10) $(am__objects_11) \
+       $(am__objects_12) $(am__objects_13) $(am__objects_14) \
+       $(am__objects_15) $(am__objects_16) $(am__objects_17) \
+       $(am__objects_18) $(am__objects_19) $(am__objects_20)
+am__objects_22 = src/shared/src_connmand-util.$(OBJEXT) \
+       src/shared/src_connmand-netlink.$(OBJEXT)
+am_src_connmand_OBJECTS = $(am__objects_1) $(am__objects_4) \
+       $(am__objects_21) $(am__objects_22) \
+       src/src_connmand-main.$(OBJEXT) src/src_connmand-log.$(OBJEXT) \
+       src/src_connmand-error.$(OBJEXT) \
+       src/src_connmand-plugin.$(OBJEXT) \
+       src/src_connmand-task.$(OBJEXT) \
+       src/src_connmand-device.$(OBJEXT) \
+       src/src_connmand-network.$(OBJEXT) \
+       src/src_connmand-connection.$(OBJEXT) \
+       src/src_connmand-manager.$(OBJEXT) \
+       src/src_connmand-service.$(OBJEXT) \
+       src/src_connmand-clock.$(OBJEXT) \
+       src/src_connmand-timezone.$(OBJEXT) \
+       src/src_connmand-agent-connman.$(OBJEXT) \
+       src/src_connmand-agent.$(OBJEXT) \
+       src/src_connmand-notifier.$(OBJEXT) \
+       src/src_connmand-provider.$(OBJEXT) \
+       src/src_connmand-resolver.$(OBJEXT) \
+       src/src_connmand-ipconfig.$(OBJEXT) \
+       src/src_connmand-detect.$(OBJEXT) \
+       src/src_connmand-inet.$(OBJEXT) \
+       src/src_connmand-dhcp.$(OBJEXT) \
+       src/src_connmand-dhcpv6.$(OBJEXT) \
+       src/src_connmand-rtnl.$(OBJEXT) \
+       src/src_connmand-proxy.$(OBJEXT) \
+       src/src_connmand-utsname.$(OBJEXT) \
+       src/src_connmand-timeserver.$(OBJEXT) \
+       src/src_connmand-rfkill.$(OBJEXT) \
+       src/src_connmand-storage.$(OBJEXT) \
+       src/src_connmand-dbus.$(OBJEXT) \
+       src/src_connmand-config.$(OBJEXT) \
+       src/src_connmand-technology.$(OBJEXT) \
+       src/src_connmand-counter.$(OBJEXT) \
+       src/src_connmand-ntp.$(OBJEXT) \
+       src/src_connmand-session.$(OBJEXT) \
+       src/src_connmand-tethering.$(OBJEXT) \
+       src/src_connmand-wpad.$(OBJEXT) \
+       src/src_connmand-wispr.$(OBJEXT) \
+       src/src_connmand-stats.$(OBJEXT) \
+       src/src_connmand-iptables.$(OBJEXT) \
+       src/src_connmand-dnsproxy.$(OBJEXT) \
+       src/src_connmand-6to4.$(OBJEXT) \
+       src/src_connmand-ippool.$(OBJEXT) \
+       src/src_connmand-bridge.$(OBJEXT) \
+       src/src_connmand-nat.$(OBJEXT) \
+       src/src_connmand-ipaddress.$(OBJEXT) \
+       src/src_connmand-inotify.$(OBJEXT) \
+       src/src_connmand-firewall.$(OBJEXT) \
+       src/src_connmand-ipv6pd.$(OBJEXT) \
+       src/src_connmand-peer.$(OBJEXT)
+src_connmand_OBJECTS = $(am_src_connmand_OBJECTS)
+am__DEPENDENCIES_1 =
+src_connmand_DEPENDENCIES = gdbus/libgdbus-internal.la \
+       $(am__DEPENDENCIES_1)
+src_connmand_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(src_connmand_CFLAGS) \
+       $(CFLAGS) $(src_connmand_LDFLAGS) $(LDFLAGS) -o $@
+tools_addr_test_SOURCES = tools/addr-test.c
+tools_addr_test_OBJECTS = tools/addr-test.$(OBJEXT)
+tools_addr_test_LDADD = $(LDADD)
+am__tools_dbus_test_SOURCES_DIST = tools/dbus-test.c
+@TOOLS_TRUE@am_tools_dbus_test_OBJECTS = tools/dbus-test.$(OBJEXT)
+tools_dbus_test_OBJECTS = $(am_tools_dbus_test_OBJECTS)
+@TOOLS_TRUE@tools_dbus_test_DEPENDENCIES = gdbus/libgdbus-internal.la
+am__tools_dhcp_server_test_SOURCES_DIST = gdhcp/gdhcp.h gdhcp/common.h \
+       gdhcp/common.c gdhcp/client.c gdhcp/server.c gdhcp/ipv4ll.h \
+       gdhcp/ipv4ll.c gdhcp/unaligned.h tools/dhcp-server-test.c
+am__objects_23 = gdhcp/common.$(OBJEXT) gdhcp/client.$(OBJEXT) \
+       gdhcp/server.$(OBJEXT) gdhcp/ipv4ll.$(OBJEXT)
+@TOOLS_TRUE@am_tools_dhcp_server_test_OBJECTS = $(am__objects_23) \
+@TOOLS_TRUE@   tools/dhcp-server-test.$(OBJEXT)
+tools_dhcp_server_test_OBJECTS = $(am_tools_dhcp_server_test_OBJECTS)
+tools_dhcp_server_test_DEPENDENCIES =
+am__tools_dhcp_test_SOURCES_DIST = gdhcp/gdhcp.h gdhcp/common.h \
+       gdhcp/common.c gdhcp/client.c gdhcp/server.c gdhcp/ipv4ll.h \
+       gdhcp/ipv4ll.c gdhcp/unaligned.h tools/dhcp-test.c
+@TOOLS_TRUE@am_tools_dhcp_test_OBJECTS = $(am__objects_23) \
+@TOOLS_TRUE@   tools/dhcp-test.$(OBJEXT)
+tools_dhcp_test_OBJECTS = $(am_tools_dhcp_test_OBJECTS)
+tools_dhcp_test_DEPENDENCIES =
+am__tools_dnsproxy_test_SOURCES_DIST = tools/dnsproxy-test.c
+@TOOLS_TRUE@am_tools_dnsproxy_test_OBJECTS =  \
+@TOOLS_TRUE@   tools/dnsproxy-test.$(OBJEXT)
+tools_dnsproxy_test_OBJECTS = $(am_tools_dnsproxy_test_OBJECTS)
+tools_dnsproxy_test_DEPENDENCIES =
+am__tools_iptables_test_SOURCES_DIST = src/log.c src/iptables.c \
+       tools/iptables-test.c
+@TOOLS_TRUE@am_tools_iptables_test_OBJECTS = src/log.$(OBJEXT) \
+@TOOLS_TRUE@   src/iptables.$(OBJEXT) \
+@TOOLS_TRUE@   tools/iptables-test.$(OBJEXT)
+tools_iptables_test_OBJECTS = $(am_tools_iptables_test_OBJECTS)
+tools_iptables_test_DEPENDENCIES =
+am__tools_iptables_unit_SOURCES_DIST = src/log.c src/iptables.c \
+       src/firewall.c src/nat.c tools/iptables-unit.c
+@TOOLS_TRUE@am_tools_iptables_unit_OBJECTS =  \
+@TOOLS_TRUE@   src/tools_iptables_unit-log.$(OBJEXT) \
+@TOOLS_TRUE@   src/tools_iptables_unit-iptables.$(OBJEXT) \
+@TOOLS_TRUE@   src/tools_iptables_unit-firewall.$(OBJEXT) \
+@TOOLS_TRUE@   src/tools_iptables_unit-nat.$(OBJEXT) \
+@TOOLS_TRUE@   tools/tools_iptables_unit-iptables-unit.$(OBJEXT)
+tools_iptables_unit_OBJECTS = $(am_tools_iptables_unit_OBJECTS)
+@TOOLS_TRUE@tools_iptables_unit_DEPENDENCIES =  \
+@TOOLS_TRUE@   gdbus/libgdbus-internal.la
+tools_iptables_unit_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(tools_iptables_unit_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+       $(LDFLAGS) -o $@
+am__tools_netlink_test_SOURCES_DIST = src/shared/util.h \
+       src/shared/util.c src/shared/netlink.h src/shared/netlink.c \
+       tools/netlink-test.c
+am__objects_24 = src/shared/util.$(OBJEXT) \
+       src/shared/netlink.$(OBJEXT)
+@TOOLS_TRUE@am_tools_netlink_test_OBJECTS = $(am__objects_24) \
+@TOOLS_TRUE@   tools/netlink-test.$(OBJEXT)
+tools_netlink_test_OBJECTS = $(am_tools_netlink_test_OBJECTS)
+tools_netlink_test_DEPENDENCIES =
+tools_polkit_test_SOURCES = tools/polkit-test.c
+tools_polkit_test_OBJECTS = tools/polkit-test.$(OBJEXT)
+tools_polkit_test_DEPENDENCIES =
+tools_private_network_test_SOURCES = tools/private-network-test.c
+tools_private_network_test_OBJECTS =  \
+       tools/private-network-test.$(OBJEXT)
+tools_private_network_test_DEPENDENCIES =
+am__tools_resolv_test_SOURCES_DIST = gweb/gresolv.h gweb/gresolv.c \
+       tools/resolv-test.c
+@TOOLS_TRUE@am_tools_resolv_test_OBJECTS = gweb/gresolv.$(OBJEXT) \
+@TOOLS_TRUE@   tools/resolv-test.$(OBJEXT)
+tools_resolv_test_OBJECTS = $(am_tools_resolv_test_OBJECTS)
+tools_resolv_test_DEPENDENCIES =
+am__tools_session_test_SOURCES_DIST = src/log.c src/dbus.c \
+       tools/session-test.c tools/session-utils.c tools/manager-api.c \
+       tools/session-api.c tools/session-test.h
+@TOOLS_TRUE@am_tools_session_test_OBJECTS = src/log.$(OBJEXT) \
+@TOOLS_TRUE@   src/dbus.$(OBJEXT) tools/session-test.$(OBJEXT) \
+@TOOLS_TRUE@   tools/session-utils.$(OBJEXT) \
+@TOOLS_TRUE@   tools/manager-api.$(OBJEXT) \
+@TOOLS_TRUE@   tools/session-api.$(OBJEXT)
+tools_session_test_OBJECTS = $(am_tools_session_test_OBJECTS)
+@TOOLS_TRUE@tools_session_test_DEPENDENCIES =  \
+@TOOLS_TRUE@   gdbus/libgdbus-internal.la
+tools_stats_tool_SOURCES = tools/stats-tool.c
+tools_stats_tool_OBJECTS = tools/stats-tool.$(OBJEXT)
+tools_stats_tool_DEPENDENCIES =
+am__tools_supplicant_test_SOURCES_DIST = tools/supplicant-test.c \
+       tools/supplicant-dbus.h tools/supplicant-dbus.c \
+       tools/supplicant.h tools/supplicant.c
+@TOOLS_TRUE@am_tools_supplicant_test_OBJECTS =  \
+@TOOLS_TRUE@   tools/supplicant-test.$(OBJEXT) \
+@TOOLS_TRUE@   tools/supplicant-dbus.$(OBJEXT) \
+@TOOLS_TRUE@   tools/supplicant.$(OBJEXT)
+tools_supplicant_test_OBJECTS = $(am_tools_supplicant_test_OBJECTS)
+@TOOLS_TRUE@tools_supplicant_test_DEPENDENCIES =  \
+@TOOLS_TRUE@   gdbus/libgdbus-internal.la
+tools_tap_test_SOURCES = tools/tap-test.c
+tools_tap_test_OBJECTS = tools/tap-test.$(OBJEXT)
+tools_tap_test_LDADD = $(LDADD)
+am__tools_web_test_SOURCES_DIST = gweb/gweb.h gweb/gweb.c \
+       gweb/gresolv.h gweb/gresolv.c gweb/giognutls.h \
+       gweb/giognutls.c gweb/gionotls.c tools/web-test.c
+@WISPR_TRUE@am__objects_25 = gweb/giognutls.$(OBJEXT)
+@WISPR_FALSE@am__objects_26 = gweb/gionotls.$(OBJEXT)
+am__objects_27 = gweb/gweb.$(OBJEXT) gweb/gresolv.$(OBJEXT) \
+       $(am__objects_25) $(am__objects_26)
+@TOOLS_TRUE@am_tools_web_test_OBJECTS = $(am__objects_27) \
+@TOOLS_TRUE@   tools/web-test.$(OBJEXT)
+tools_web_test_OBJECTS = $(am_tools_web_test_OBJECTS)
+tools_web_test_DEPENDENCIES =
+am__tools_wispr_SOURCES_DIST = gweb/gweb.h gweb/gweb.c gweb/gresolv.h \
+       gweb/gresolv.c gweb/giognutls.h gweb/giognutls.c \
+       gweb/gionotls.c tools/wispr.c
+@WISPR_TRUE@am_tools_wispr_OBJECTS = $(am__objects_27) \
+@WISPR_TRUE@   tools/wispr.$(OBJEXT)
+tools_wispr_OBJECTS = $(am_tools_wispr_OBJECTS)
+tools_wispr_DEPENDENCIES =
+am__tools_wpad_test_SOURCES_DIST = gweb/gresolv.h gweb/gresolv.c \
+       tools/wpad-test.c
+@TOOLS_TRUE@am_tools_wpad_test_OBJECTS = gweb/gresolv.$(OBJEXT) \
+@TOOLS_TRUE@   tools/wpad-test.$(OBJEXT)
+tools_wpad_test_OBJECTS = $(am_tools_wpad_test_OBJECTS)
+tools_wpad_test_DEPENDENCIES =
+am_unit_test_ippool_OBJECTS = src/log.$(OBJEXT) src/dbus.$(OBJEXT) \
+       src/ippool.$(OBJEXT) unit/test-ippool.$(OBJEXT)
+unit_test_ippool_OBJECTS = $(am_unit_test_ippool_OBJECTS)
+unit_test_ippool_DEPENDENCIES = gdbus/libgdbus-internal.la
+am_unit_test_pbkdf2_sha1_OBJECTS = unit/test-pbkdf2-sha1.$(OBJEXT) \
+       src/shared/sha1.$(OBJEXT)
+unit_test_pbkdf2_sha1_OBJECTS = $(am_unit_test_pbkdf2_sha1_OBJECTS)
+unit_test_pbkdf2_sha1_DEPENDENCIES =
+am_unit_test_prf_sha1_OBJECTS = unit/test-prf-sha1.$(OBJEXT) \
+       src/shared/sha1.$(OBJEXT)
+unit_test_prf_sha1_OBJECTS = $(am_unit_test_prf_sha1_OBJECTS)
+unit_test_prf_sha1_DEPENDENCIES =
+am__vpn_connman_vpnd_SOURCES_DIST = vpn/plugins/openconnect.c \
+       vpn/plugins/openvpn.c vpn/plugins/vpnc.c vpn/plugins/l2tp.c \
+       vpn/plugins/pptp.c vpn/plugins/vpn.c vpn/plugins/vpn.h \
+       gweb/gweb.h gweb/gweb.c gweb/gresolv.h gweb/gresolv.c \
+       gweb/giognutls.h gweb/giognutls.c gweb/gionotls.c vpn/vpn.ver \
+       vpn/main.c vpn/vpn.h src/log.c src/error.c src/plugin.c \
+       src/task.c vpn/vpn-manager.c vpn/vpn-provider.c \
+       vpn/vpn-provider.h vpn/vpn-rtnl.h vpn/vpn-ipconfig.c \
+       src/inet.c vpn/vpn-rtnl.c src/dbus.c src/storage.c \
+       src/ipaddress.c src/agent.c vpn/vpn-agent.c vpn/vpn-agent.h \
+       src/inotify.c vpn/vpn-config.c
+@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@am__objects_28 = vpn/plugins/vpn_connman_vpnd-openconnect.$(OBJEXT)
+@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__objects_29 = vpn/plugins/vpn_connman_vpnd-openvpn.$(OBJEXT)
+@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_30 = vpn/plugins/vpn_connman_vpnd-vpnc.$(OBJEXT)
+@L2TP_BUILTIN_TRUE@@L2TP_TRUE@@VPN_TRUE@am__objects_31 = vpn/plugins/vpn_connman_vpnd-l2tp.$(OBJEXT)
+@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_32 = vpn/plugins/vpn_connman_vpnd-pptp.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_FALSE@@OPENCONNECT_FALSE@@OPENVPN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_BUILTIN_TRUE@@L2TP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_FALSE@@OPENVPN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_FALSE@@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@L2TP_FALSE@@OPENCONNECT_FALSE@@OPENVPN_FALSE@@PPTP_FALSE@@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@am__objects_33 = vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+@VPN_TRUE@am__objects_34 = $(am__objects_28) $(am__objects_29) \
+@VPN_TRUE@     $(am__objects_30) $(am__objects_31) \
+@VPN_TRUE@     $(am__objects_32) $(am__objects_33)
+@WISPR_TRUE@am__objects_35 =  \
+@WISPR_TRUE@   gweb/vpn_connman_vpnd-giognutls.$(OBJEXT)
+@WISPR_FALSE@am__objects_36 =  \
+@WISPR_FALSE@  gweb/vpn_connman_vpnd-gionotls.$(OBJEXT)
+am__objects_37 = gweb/vpn_connman_vpnd-gweb.$(OBJEXT) \
+       gweb/vpn_connman_vpnd-gresolv.$(OBJEXT) $(am__objects_35) \
+       $(am__objects_36)
+@VPN_TRUE@am_vpn_connman_vpnd_OBJECTS = $(am__objects_34) \
+@VPN_TRUE@     $(am__objects_37) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-main.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-log.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-error.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-plugin.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-task.$(OBJEXT) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-vpn-manager.$(OBJEXT) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-vpn-provider.$(OBJEXT) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-vpn-ipconfig.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-inet.$(OBJEXT) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-vpn-rtnl.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-dbus.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-storage.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-ipaddress.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-agent.$(OBJEXT) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-vpn-agent.$(OBJEXT) \
+@VPN_TRUE@     src/vpn_connman_vpnd-inotify.$(OBJEXT) \
+@VPN_TRUE@     vpn/vpn_connman_vpnd-vpn-config.$(OBJEXT)
+vpn_connman_vpnd_OBJECTS = $(am_vpn_connman_vpnd_OBJECTS)
+@VPN_TRUE@vpn_connman_vpnd_DEPENDENCIES = gdbus/libgdbus-internal.la \
+@VPN_TRUE@     $(am__DEPENDENCIES_1)
+vpn_connman_vpnd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) \
+       $(vpn_connman_vpnd_LDFLAGS) $(LDFLAGS) -o $@
+SCRIPTS = $(test_SCRIPTS)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(gdbus_libgdbus_internal_la_SOURCES) \
+       plugins/hh2serial-gps.c plugins/iospm.c \
+       plugins/session_policy_local.c plugins/tist.c \
+       scripts/libppp-plugin.c $(vpn_plugins_l2tp_la_SOURCES) \
+       $(vpn_plugins_openconnect_la_SOURCES) \
+       $(vpn_plugins_openvpn_la_SOURCES) \
+       $(vpn_plugins_pptp_la_SOURCES) $(vpn_plugins_vpnc_la_SOURCES) \
+       $(client_connmanctl_SOURCES) scripts/openconnect-script.c \
+       scripts/openvpn-script.c $(src_connmand_SOURCES) \
+       tools/addr-test.c $(tools_dbus_test_SOURCES) \
+       $(tools_dhcp_server_test_SOURCES) $(tools_dhcp_test_SOURCES) \
+       $(tools_dnsproxy_test_SOURCES) $(tools_iptables_test_SOURCES) \
+       $(tools_iptables_unit_SOURCES) $(tools_netlink_test_SOURCES) \
+       tools/polkit-test.c tools/private-network-test.c \
+       $(tools_resolv_test_SOURCES) $(tools_session_test_SOURCES) \
+       tools/stats-tool.c $(tools_supplicant_test_SOURCES) \
+       tools/tap-test.c $(tools_web_test_SOURCES) \
+       $(tools_wispr_SOURCES) $(tools_wpad_test_SOURCES) \
+       $(unit_test_ippool_SOURCES) $(unit_test_pbkdf2_sha1_SOURCES) \
+       $(unit_test_prf_sha1_SOURCES) $(vpn_connman_vpnd_SOURCES)
+DIST_SOURCES = $(gdbus_libgdbus_internal_la_SOURCES) \
+       plugins/hh2serial-gps.c plugins/iospm.c \
+       plugins/session_policy_local.c plugins/tist.c \
+       scripts/libppp-plugin.c \
+       $(am__vpn_plugins_l2tp_la_SOURCES_DIST) \
+       $(am__vpn_plugins_openconnect_la_SOURCES_DIST) \
+       $(am__vpn_plugins_openvpn_la_SOURCES_DIST) \
+       $(am__vpn_plugins_pptp_la_SOURCES_DIST) \
+       $(am__vpn_plugins_vpnc_la_SOURCES_DIST) \
+       $(am__client_connmanctl_SOURCES_DIST) \
+       scripts/openconnect-script.c scripts/openvpn-script.c \
+       $(am__src_connmand_SOURCES_DIST) tools/addr-test.c \
+       $(am__tools_dbus_test_SOURCES_DIST) \
+       $(am__tools_dhcp_server_test_SOURCES_DIST) \
+       $(am__tools_dhcp_test_SOURCES_DIST) \
+       $(am__tools_dnsproxy_test_SOURCES_DIST) \
+       $(am__tools_iptables_test_SOURCES_DIST) \
+       $(am__tools_iptables_unit_SOURCES_DIST) \
+       $(am__tools_netlink_test_SOURCES_DIST) tools/polkit-test.c \
+       tools/private-network-test.c \
+       $(am__tools_resolv_test_SOURCES_DIST) \
+       $(am__tools_session_test_SOURCES_DIST) tools/stats-tool.c \
+       $(am__tools_supplicant_test_SOURCES_DIST) tools/tap-test.c \
+       $(am__tools_web_test_SOURCES_DIST) \
+       $(am__tools_wispr_SOURCES_DIST) \
+       $(am__tools_wpad_test_SOURCES_DIST) \
+       $(unit_test_ippool_SOURCES) $(unit_test_pbkdf2_sha1_SOURCES) \
+       $(unit_test_prf_sha1_SOURCES) \
+       $(am__vpn_connman_vpnd_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+man5dir = $(mandir)/man5
+man8dir = $(mandir)/man8
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DATA = $(dbusconf_DATA) $(dbusservice_DATA) $(pkgconfig_DATA) \
+       $(policy_DATA) $(script_DATA) $(systemdunit_DATA)
+HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) \
+       $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+# If stdout is a non-dumb tty, use colors.  If test -t is not supported,
+# then this fails; a conservative approach.  Of course do not redirect
+# stdout here, just stderr.
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=; \
+test "X$(AM_COLOR_TESTS)" != Xno \
+&& test "X$$TERM" != Xdumb \
+&& { test "X$(AM_COLOR_TESTS)" = Xalways || test -t 1 2>/dev/null; } \
+&& { \
+  red='\e[0;31m'; \
+  grn='\e[0;32m'; \
+  lgn='\e[1;32m'; \
+  blu='\e[1;34m'; \
+  std='\e[m'; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DBUS_CFLAGS = @DBUS_CFLAGS@
+DBUS_CONFDIR = @DBUS_CONFDIR@
+DBUS_DATADIR = @DBUS_DATADIR@
+DBUS_LIBS = @DBUS_LIBS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+IPTABLES_SAVE = @IPTABLES_SAVE@
+L2TP = @L2TP@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENCONNECT = @OPENCONNECT@
+OPENVPN = @OPENVPN@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POLKIT_DATADIR = @POLKIT_DATADIR@
+PPPD = @PPPD@
+PPTP = @PPTP@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SYSTEMD_UNITDIR = @SYSTEMD_UNITDIR@
+VERSION = @VERSION@
+VPNC = @VPNC@
+WPASUPPLICANT = @WPASUPPLICANT@
+XTABLES_CFLAGS = @XTABLES_CFLAGS@
+XTABLES_LIBS = @XTABLES_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@/connman
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_MAKEFLAGS = --no-print-directory
+noinst_LTLIBRARIES = gdbus/libgdbus-internal.la
+include_HEADERS = include/log.h include/plugin.h \
+                       include/notifier.h include/service.h \
+                       include/resolver.h include/ipconfig.h \
+                       include/device.h include/network.h include/inet.h \
+                       include/storage.h include/provision.h \
+                       include/session.h include/ipaddress.h include/agent.h \
+                       include/inotify.h include/peer.h
+
+nodist_include_HEADERS = include/version.h
+noinst_HEADERS = include/rtnl.h include/task.h \
+                       include/dbus.h include/option.h \
+                       include/provider.h include/vpn-dbus.h \
+                       include/utsname.h include/timeserver.h include/proxy.h \
+                       include/technology.h include/setting.h
+
+local_headers = $(foreach file,$(include_HEADERS) $(nodist_include_HEADERS) \
+                       $(noinst_HEADERS), include/connman/$(notdir $(file)))
+
+gdbus_libgdbus_internal_la_SOURCES = gdbus/gdbus.h \
+                               gdbus/mainloop.c gdbus/watch.c \
+                               gdbus/object.c gdbus/client.c gdbus/polkit.c
+
+gdhcp_sources = gdhcp/gdhcp.h gdhcp/common.h gdhcp/common.c gdhcp/client.c \
+               gdhcp/server.c gdhcp/ipv4ll.h gdhcp/ipv4ll.c gdhcp/unaligned.h
+
+gweb_sources = gweb/gweb.h gweb/gweb.c gweb/gresolv.h gweb/gresolv.c \
+       $(am__append_1) $(am__append_2)
+shared_sources = src/shared/util.h src/shared/util.c \
+               src/shared/netlink.h src/shared/netlink.c
+
+@DATAFILES_TRUE@@NMCOMPAT_TRUE@nmcompat_conf = plugins/connman-nmcompat.conf
+@DATAFILES_TRUE@dbusconfdir = @DBUS_CONFDIR@
+@DATAFILES_TRUE@dbusconf_DATA = src/connman.conf $(nmcompat_conf) \
+@DATAFILES_TRUE@       $(am__append_3)
+@DATAFILES_TRUE@@VPN_TRUE@dbusservicedir = @DBUS_DATADIR@
+@DATAFILES_TRUE@@VPN_TRUE@dbusservice_DATA = vpn/net.connman.vpn.service
+@DATAFILES_TRUE@@SYSTEMD_TRUE@systemdunitdir = @SYSTEMD_UNITDIR@
+@DATAFILES_TRUE@@SYSTEMD_TRUE@systemdunit_DATA = src/connman.service \
+@DATAFILES_TRUE@@SYSTEMD_TRUE@ $(am__append_4)
+plugin_LTLIBRARIES = $(am__append_19) $(am__append_59) \
+       $(am__append_68) $(am__append_72)
+plugin_objects = $(am__append_20) $(am__append_60) $(am__append_69) \
+       $(am__append_73)
+builtin_modules = $(am__append_7) $(am__append_9) $(am__append_11) \
+       $(am__append_13) $(am__append_15) $(am__append_17) \
+       $(am__append_21) $(am__append_23) $(am__append_25) \
+       $(am__append_54) $(am__append_56) $(am__append_64) \
+       $(am__append_66) $(am__append_70) $(am__append_74)
+builtin_sources = $(am__append_8) $(am__append_10) $(am__append_12) \
+       $(am__append_14) $(am__append_16) $(am__append_18) \
+       $(am__append_22) $(am__append_24) $(am__append_26) \
+       $(am__append_55) $(am__append_57) $(am__append_65) \
+       $(am__append_67) $(am__append_71) $(am__append_75)
+builtin_libadd = 
+builtin_cflags = 
+unit_objects = 
+MANUAL_PAGES = doc/connman.8 doc/connman.conf.5
+src_connmand_SOURCES = $(gdhcp_sources) $(gweb_sources) \
+                       $(builtin_sources) $(shared_sources) src/connman.ver \
+                       src/main.c src/connman.h src/log.c \
+                       src/error.c src/plugin.c src/task.c \
+                       src/device.c src/network.c src/connection.c \
+                       src/manager.c src/service.c \
+                       src/clock.c src/timezone.c src/agent-connman.c \
+                       src/agent.c src/notifier.c src/provider.c \
+                       src/resolver.c src/ipconfig.c src/detect.c src/inet.c \
+                       src/dhcp.c src/dhcpv6.c src/rtnl.c src/proxy.c \
+                       src/utsname.c src/timeserver.c src/rfkill.c \
+                       src/storage.c src/dbus.c src/config.c \
+                       src/technology.c src/counter.c src/ntp.c \
+                       src/session.c src/tethering.c src/wpad.c src/wispr.c \
+                       src/stats.c src/iptables.c src/dnsproxy.c src/6to4.c \
+                       src/ippool.c src/bridge.c src/nat.c src/ipaddress.c \
+                       src/inotify.c src/firewall.c src/ipv6pd.c src/peer.c
+
+src_connmand_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \
+                       @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ @GNUTLS_LIBS@ \
+                       -lresolv -ldl -lrt
+
+src_connmand_LDFLAGS = -Wl,--export-dynamic \
+                               -Wl,--version-script=$(srcdir)/src/connman.ver
+
+@VPN_TRUE@vpn_plugin_LTLIBRARIES = $(am__append_30) $(am__append_35) \
+@VPN_TRUE@     $(am__append_40) $(am__append_45) $(am__append_50)
+@VPN_TRUE@vpn_plugin_objects = $(am__append_31) $(am__append_36) \
+@VPN_TRUE@     $(am__append_41) $(am__append_46) $(am__append_51)
+@VPN_TRUE@builtin_vpn_modules = $(am__append_27) $(am__append_32) \
+@VPN_TRUE@     $(am__append_37) $(am__append_42) $(am__append_47)
+@VPN_TRUE@builtin_vpn_sources = $(am__append_28) $(am__append_33) \
+@VPN_TRUE@     $(am__append_38) $(am__append_43) $(am__append_48) \
+@VPN_TRUE@     $(builtin_vpn_source)
+@VPN_TRUE@builtin_vpn_libadd = 
+@VPN_TRUE@builtin_vpn_cflags = $(am__append_29) $(am__append_34) \
+@VPN_TRUE@     $(am__append_39) $(am__append_44) $(am__append_49)
+@VPN_TRUE@vpn_connman_vpnd_SOURCES = $(builtin_vpn_sources) \
+@VPN_TRUE@                     $(gweb_sources) vpn/vpn.ver vpn/main.c vpn/vpn.h \
+@VPN_TRUE@                     src/log.c src/error.c src/plugin.c src/task.c \
+@VPN_TRUE@                     vpn/vpn-manager.c vpn/vpn-provider.c \
+@VPN_TRUE@                     vpn/vpn-provider.h vpn/vpn-rtnl.h \
+@VPN_TRUE@                     vpn/vpn-ipconfig.c src/inet.c vpn/vpn-rtnl.c \
+@VPN_TRUE@                     src/dbus.c src/storage.c src/ipaddress.c src/agent.c \
+@VPN_TRUE@                     vpn/vpn-agent.c vpn/vpn-agent.h src/inotify.c \
+@VPN_TRUE@                     vpn/vpn-config.c
+
+@VPN_TRUE@vpn_connman_vpnd_LDADD = gdbus/libgdbus-internal.la $(builtin_vpn_libadd) \
+@VPN_TRUE@                             @GLIB_LIBS@ @DBUS_LIBS@ @GNUTLS_LIBS@ \
+@VPN_TRUE@                             -lresolv -ldl
+
+@VPN_TRUE@vpn_connman_vpnd_LDFLAGS = -Wl,--export-dynamic \
+@VPN_TRUE@                             -Wl,--version-script=$(srcdir)/vpn/vpn.ver
+
+BUILT_SOURCES = $(local_headers) src/builtin.h $(am__append_6)
+CLEANFILES = src/connman.conf $(BUILT_SOURCES) $(am__append_80)
+statedir = $(localstatedir)/run/connman
+vpn_statedir = $(localstatedir)/run/connman-vpn
+@VPN_TRUE@vpn_plugindir = $(libdir)/connman/plugins-vpn
+plugindir = $(libdir)/connman/plugins
+scriptdir = $(libdir)/connman/scripts
+storagedir = $(localstatedir)/lib/connman
+vpn_storagedir = $(localstatedir)/lib/connman-vpn
+configdir = ${sysconfdir}/connman
+@MAINTAINER_MODE_FALSE@@VPN_TRUE@build_vpn_plugindir = $(vpn_plugindir)
+@MAINTAINER_MODE_TRUE@@VPN_TRUE@build_vpn_plugindir = $(abs_top_srcdir)/vpn/plugins/.libs
+@MAINTAINER_MODE_FALSE@build_plugindir = $(plugindir)
+@MAINTAINER_MODE_TRUE@build_plugindir = $(abs_top_srcdir)/plugins/.libs
+@MAINTAINER_MODE_FALSE@build_scriptdir = $(scriptdir)
+@MAINTAINER_MODE_TRUE@build_scriptdir = $(abs_top_srcdir)/scripts
+AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ \
+                               @GNUTLS_CFLAGS@ $(builtin_cflags) \
+                               -DCONNMAN_PLUGIN_BUILTIN \
+                               -DSTATEDIR=\""$(statedir)"\" \
+                               -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+                               -DPLUGINDIR=\""$(build_plugindir)"\" \
+                               -DSCRIPTDIR=\""$(build_scriptdir)"\" \
+                               -DSTORAGEDIR=\""$(storagedir)\"" \
+                               -DVPN_STORAGEDIR=\""$(vpn_storagedir)\"" \
+                               -DCONFIGDIR=\""$(configdir)\""
+
+@VPN_FALSE@AM_CPPFLAGS = -I$(builddir)/include -I$(builddir)/src -I$(srcdir)/gdbus
+@VPN_TRUE@AM_CPPFLAGS = -I$(builddir)/include -I$(srcdir)/gdbus
+src_connmand_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ \
+                               @GNUTLS_CFLAGS@ $(builtin_cflags) \
+                               -DCONNMAN_PLUGIN_BUILTIN \
+                               -DSTATEDIR=\""$(statedir)"\" \
+                               -DPLUGINDIR=\""$(build_plugindir)"\" \
+                               -DSCRIPTDIR=\""$(build_scriptdir)"\" \
+                               -DSTORAGEDIR=\""$(storagedir)\"" \
+                               -DVPN_STORAGEDIR=\""$(vpn_storagedir)\"" \
+                               -DCONFIGDIR=\""$(configdir)\"" \
+                               -I$(builddir)/src
+
+EXTRA_DIST = src/genbuiltin src/connman-dbus.conf \
+       src/connman-polkit.conf plugins/connman-nmcompat.conf \
+       vpn/vpn-dbus.conf vpn/vpn-polkit.conf plugins/polkit.policy \
+       vpn/vpn-polkit.policy $(test_scripts) doc/overview-api.txt \
+       doc/behavior-api.txt doc/ipconfig-api.txt doc/plugin-api.txt \
+       doc/manager-api.txt doc/agent-api.txt doc/service-api.txt \
+       doc/technology-api.txt doc/counter-api.txt \
+       doc/config-format.txt doc/clock-api.txt doc/session-api.txt \
+       doc/session-overview.txt doc/backtrace.txt \
+       doc/advanced-configuration.txt doc/vpn-connection-api.txt \
+       doc/vpn-manager-api.txt doc/vpn-overview.txt \
+       doc/session-policy-format.txt src/main.conf src/eduroam.config \
+       $(am__append_79) vpn/connman-task.te
+@VPN_TRUE@vpn_connman_vpnd_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ \
+@VPN_TRUE@                             $(builtin_vpn_cflags) \
+@VPN_TRUE@                             -DCONNMAN_PLUGIN_BUILTIN \
+@VPN_TRUE@                             -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+@VPN_TRUE@                             -DPLUGINDIR=\""$(build_vpn_plugindir)"\" \
+@VPN_TRUE@                             -DSCRIPTDIR=\""$(build_scriptdir)"\" \
+@VPN_TRUE@                             -DSTORAGEDIR=\""$(storagedir)\"" \
+@VPN_TRUE@                             -DVPN_STORAGEDIR=\""$(vpn_storagedir)\"" \
+@VPN_TRUE@                             -DCONFIGDIR=\""$(configdir)\"" \
+@VPN_TRUE@                             -I$(builddir)/vpn
+
+script_DATA = 
+script_LTLIBRARIES = $(am__append_52) $(am__append_53)
+plugin_cflags = -fvisibility=hidden -I$(srcdir)/gdbus \
+                                       @DBUS_CFLAGS@ @GLIB_CFLAGS@
+
+plugin_ldflags = -no-undefined -module -avoid-version
+script_cflags = -fvisibility=hidden -I$(srcdir)/gdbus \
+                                       @DBUS_CFLAGS@
+
+gsupplicant_sources = gsupplicant/gsupplicant.h gsupplicant/dbus.h \
+                       gsupplicant/supplicant.c gsupplicant/dbus.c
+
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@plugins_hh2serial_gps_la_CFLAGS = $(plugin_cflags)
+@HH2SERIAL_GPS_BUILTIN_FALSE@@HH2SERIAL_GPS_TRUE@plugins_hh2serial_gps_la_LDFLAGS = $(plugin_ldflags)
+@L2TP_BUILTIN_TRUE@@L2TP_TRUE@@VPN_TRUE@builtin_vpn_source = vpn/plugins/vpn.c vpn/plugins/vpn.h
+@OPENCONNECT_BUILTIN_TRUE@@OPENCONNECT_TRUE@@VPN_TRUE@builtin_vpn_source = vpn/plugins/vpn.c vpn/plugins/vpn.h
+@OPENVPN_BUILTIN_TRUE@@OPENVPN_TRUE@@VPN_TRUE@builtin_vpn_source = vpn/plugins/vpn.c vpn/plugins/vpn.h
+@PPTP_BUILTIN_TRUE@@PPTP_TRUE@@VPN_TRUE@builtin_vpn_source = vpn/plugins/vpn.c vpn/plugins/vpn.h
+@VPNC_BUILTIN_TRUE@@VPNC_TRUE@@VPN_TRUE@builtin_vpn_source = vpn/plugins/vpn.c vpn/plugins/vpn.h
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@vpn_plugins_openconnect_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@                                                vpn/plugins/openconnect.c
+
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@vpn_plugins_openconnect_la_CFLAGS = $(plugin_cflags) \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@                                        -DOPENCONNECT=\"@OPENCONNECT@\" \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@                                        -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
+
+@OPENCONNECT_BUILTIN_FALSE@@OPENCONNECT_TRUE@@VPN_TRUE@vpn_plugins_openconnect_la_LDFLAGS = $(plugin_ldflags)
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@vpn_plugins_openvpn_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@                                                vpn/plugins/openvpn.c
+
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@vpn_plugins_openvpn_la_CFLAGS = $(plugin_cflags) -DOPENVPN=\"@OPENVPN@\" \
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@                                        -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
+
+@OPENVPN_BUILTIN_FALSE@@OPENVPN_TRUE@@VPN_TRUE@vpn_plugins_openvpn_la_LDFLAGS = $(plugin_ldflags)
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@vpn_plugins_vpnc_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@                                              vpn/plugins/vpnc.c
+
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@vpn_plugins_vpnc_la_CFLAGS = $(plugin_cflags) -DVPNC=\"@VPNC@\" \
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@                                      -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@                                      -DSCRIPTDIR=\""$(build_scriptdir)"\"
+
+@VPNC_BUILTIN_FALSE@@VPNC_TRUE@@VPN_TRUE@vpn_plugins_vpnc_la_LDFLAGS = $(plugin_ldflags)
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@vpn_plugins_l2tp_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@                                              vpn/plugins/l2tp.c
+
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@vpn_plugins_l2tp_la_CFLAGS = $(plugin_cflags) -DL2TP=\"@L2TP@\" \
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@                                      -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@                                      -DSCRIPTDIR=\""$(build_scriptdir)"\"
+
+@L2TP_BUILTIN_FALSE@@L2TP_TRUE@@VPN_TRUE@vpn_plugins_l2tp_la_LDFLAGS = $(plugin_ldflags)
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@vpn_plugins_pptp_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@                                              vpn/plugins/pptp.c
+
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@vpn_plugins_pptp_la_CFLAGS = $(plugin_cflags) -DPPPD=\"@PPPD@\" \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@                                      -DPPTP=\"@PPTP@\" \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@                                      -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@                                      -DSCRIPTDIR=\""$(build_scriptdir)"\"
+
+@PPTP_BUILTIN_FALSE@@PPTP_TRUE@@VPN_TRUE@vpn_plugins_pptp_la_LDFLAGS = $(plugin_ldflags)
+@L2TP_TRUE@@PPTP_FALSE@@VPN_TRUE@scripts_libppp_plugin_la_LDFLAGS = $(script_cflags) @DBUS_CFLAGS@
+@PPTP_TRUE@@VPN_TRUE@scripts_libppp_plugin_la_LDFLAGS = $(script_cflags) @DBUS_CFLAGS@
+@L2TP_TRUE@@PPTP_FALSE@@VPN_TRUE@scripts_libppp_plugin_la_LIBADD = @DBUS_LIBS@
+@PPTP_TRUE@@VPN_TRUE@scripts_libppp_plugin_la_LIBADD = @DBUS_LIBS@
+@DATAFILES_TRUE@@POLKIT_TRUE@policydir = @POLKIT_DATADIR@
+@DATAFILES_TRUE@@POLKIT_TRUE@policy_DATA = plugins/net.connman.policy \
+@DATAFILES_TRUE@@POLKIT_TRUE@  $(am__append_58)
+@IOSPM_TRUE@plugins_iospm_la_CFLAGS = $(plugin_cflags)
+@IOSPM_TRUE@plugins_iospm_la_LDFLAGS = $(plugin_ldflags)
+@OPENCONNECT_FALSE@@VPNC_TRUE@scripts_openconnect_script_LDADD = @DBUS_LIBS@
+@OPENCONNECT_TRUE@scripts_openconnect_script_LDADD = @DBUS_LIBS@
+@OPENVPN_TRUE@scripts_openvpn_script_LDADD = @DBUS_LIBS@
+@TIST_BUILTIN_FALSE@@TIST_TRUE@plugins_tist_la_CFLAGS = $(plugin_cflags)
+@TIST_BUILTIN_FALSE@@TIST_TRUE@plugins_tist_la_LDFLAGS = $(plugin_ldflags)
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@plugins_session_policy_local_la_CFLAGS = $(plugin_cflags) \
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@                                -DSTORAGEDIR=\""$(storagedir)\""
+
+@SESSION_POLICY_LOCAL_BUILTIN_FALSE@@SESSION_POLICY_LOCAL_TRUE@plugins_session_policy_local_la_LDFLAGS = $(plugin_ldflags)
+@CLIENT_TRUE@noinst_MANUAL_PAGES = doc/connmanctl.1
+@CLIENT_TRUE@client_connmanctl_SOURCES = client/dbus_helpers.h client/dbus_helpers.c \
+@CLIENT_TRUE@                  client/services.h client/services.c \
+@CLIENT_TRUE@                  client/commands.h client/commands.c \
+@CLIENT_TRUE@                  client/input.h client/input.c \
+@CLIENT_TRUE@                  client/agent.h client/agent.c \
+@CLIENT_TRUE@                  client/peers.h client/peers.c \
+@CLIENT_TRUE@                  client/vpnconnections.h client/vpnconnections.c \
+@CLIENT_TRUE@                  client/main.c
+
+@CLIENT_TRUE@client_connmanctl_LDADD = gdbus/libgdbus-internal.la @DBUS_LIBS@ @GLIB_LIBS@ \
+@CLIENT_TRUE@                          -lreadline -ldl
+
+unit_test_pbkdf2_sha1_SOURCES = unit/test-pbkdf2-sha1.c \
+                               src/shared/sha1.h src/shared/sha1.c
+
+unit_test_pbkdf2_sha1_LDADD = @GLIB_LIBS@
+unit_test_prf_sha1_SOURCES = unit/test-prf-sha1.c \
+                               src/shared/sha1.h src/shared/sha1.c
+
+unit_test_prf_sha1_LDADD = @GLIB_LIBS@
+unit_test_ippool_SOURCES = src/log.c src/dbus.c src/ippool.c unit/test-ippool.c
+unit_test_ippool_LDADD = gdbus/libgdbus-internal.la \
+                               @GLIB_LIBS@ @DBUS_LIBS@ -ldl
+
+@WISPR_TRUE@tools_wispr_SOURCES = $(gweb_sources) tools/wispr.c
+@WISPR_TRUE@tools_wispr_LDADD = @GLIB_LIBS@ @GNUTLS_LIBS@ -lresolv
+@TOOLS_TRUE@tools_supplicant_test_SOURCES = tools/supplicant-test.c \
+@TOOLS_TRUE@                   tools/supplicant-dbus.h tools/supplicant-dbus.c \
+@TOOLS_TRUE@                   tools/supplicant.h tools/supplicant.c
+
+@TOOLS_TRUE@tools_supplicant_test_LDADD = gdbus/libgdbus-internal.la \
+@TOOLS_TRUE@                           @GLIB_LIBS@ @DBUS_LIBS@
+
+@TOOLS_TRUE@tools_web_test_SOURCES = $(gweb_sources) tools/web-test.c
+@TOOLS_TRUE@tools_web_test_LDADD = @GLIB_LIBS@ @GNUTLS_LIBS@ -lresolv
+@TOOLS_TRUE@tools_resolv_test_SOURCES = gweb/gresolv.h gweb/gresolv.c tools/resolv-test.c
+@TOOLS_TRUE@tools_resolv_test_LDADD = @GLIB_LIBS@ -lresolv
+@TOOLS_TRUE@tools_wpad_test_SOURCES = gweb/gresolv.h gweb/gresolv.c tools/wpad-test.c
+@TOOLS_TRUE@tools_wpad_test_LDADD = @GLIB_LIBS@ -lresolv
+@TOOLS_TRUE@tools_stats_tool_LDADD = @GLIB_LIBS@
+@TOOLS_TRUE@tools_dhcp_test_SOURCES = $(gdhcp_sources) tools/dhcp-test.c
+@TOOLS_TRUE@tools_dhcp_test_LDADD = @GLIB_LIBS@
+@TOOLS_TRUE@tools_dhcp_server_test_SOURCES = $(gdhcp_sources) tools/dhcp-server-test.c
+@TOOLS_TRUE@tools_dhcp_server_test_LDADD = @GLIB_LIBS@
+@TOOLS_TRUE@tools_dbus_test_SOURCES = tools/dbus-test.c
+@TOOLS_TRUE@tools_dbus_test_LDADD = gdbus/libgdbus-internal.la @GLIB_LIBS@ @DBUS_LIBS@
+@TOOLS_TRUE@tools_polkit_test_LDADD = @DBUS_LIBS@
+@TOOLS_TRUE@tools_iptables_test_SOURCES = src/log.c src/iptables.c tools/iptables-test.c
+@TOOLS_TRUE@tools_iptables_test_LDADD = @GLIB_LIBS@ @XTABLES_LIBS@ -ldl
+@TOOLS_TRUE@tools_private_network_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
+@TOOLS_TRUE@tools_session_test_SOURCES = src/log.c src/dbus.c \
+@TOOLS_TRUE@           tools/session-test.c tools/session-utils.c tools/manager-api.c \
+@TOOLS_TRUE@           tools/session-api.c tools/session-test.h
+
+@TOOLS_TRUE@tools_session_test_LDADD = gdbus/libgdbus-internal.la \
+@TOOLS_TRUE@                           @GLIB_LIBS@ @DBUS_LIBS@ -ldl
+
+@TOOLS_TRUE@tools_iptables_unit_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ \
+@TOOLS_TRUE@           -DIPTABLES_SAVE=\""${IPTABLES_SAVE}"\"
+
+@TOOLS_TRUE@tools_iptables_unit_SOURCES = src/log.c \
+@TOOLS_TRUE@            src/iptables.c src/firewall.c src/nat.c tools/iptables-unit.c
+
+@TOOLS_TRUE@tools_iptables_unit_LDADD = gdbus/libgdbus-internal.la \
+@TOOLS_TRUE@                           @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ -ldl
+
+@TOOLS_TRUE@tools_dnsproxy_test_SOURCES = tools/dnsproxy-test.c
+@TOOLS_TRUE@tools_dnsproxy_test_LDADD = @GLIB_LIBS@
+@TOOLS_TRUE@tools_netlink_test_SOURCES = $(shared_sources) tools/netlink-test.c
+@TOOLS_TRUE@tools_netlink_test_LDADD = @GLIB_LIBS@
+test_scripts = test/get-state test/list-services test/monitor-services \
+       test/test-clock test/simple-agent test/show-introspection \
+       test/test-compat test/test-manager test/test-connman \
+       test/monitor-connman test/connect-provider \
+       test/remove-provider test/test-counter test/set-ipv4-method \
+       test/set-ipv6-method test/get-services \
+       test/get-proxy-autoconfig test/set-proxy test/enable-tethering \
+       test/disable-tethering test/backtrace test/test-session \
+       test/p2p-on-supplicant test/test-new-supplicant \
+       test/service-move-before test/set-global-timeservers \
+       test/get-global-timeservers test/set-nameservers \
+       test/set-domains test/set-timeservers test/set-clock \
+       test/vpn-connect test/vpn-disconnect test/vpn-get \
+       test/monitor-vpn test/vpn-property
+@TEST_TRUE@testdir = $(pkglibdir)/test
+@TEST_TRUE@test_SCRIPTS = $(test_scripts)
+dist_man_MANS = $(MANUAL_PAGES)
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = connman.pc
+DISTCHECK_CONFIGURE_FLAGS = --disable-datafiles \
+                               --enable-hh2serial-gps \
+                               --enable-openconnect \
+                               --enable-openvpn \
+                               --enable-vpnc \
+                               --enable-session-policy-local \
+                               --enable-nmcompat \
+                               --enable-polkit
+
+DISTCLEANFILES = $(pkgconfig_DATA)
+MAINTAINERCLEANFILES = Makefile.in \
+       aclocal.m4 configure config.h.in config.sub config.guess \
+       ltmain.sh depcomp compile missing install-sh mkinstalldirs
+
+all: $(BUILT_SOURCES) config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: Makefile
+       @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.plugins $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+             $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+$(srcdir)/Makefile.plugins:
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+       @if test ! -f $@; then rm -f stamp-h1; else :; fi
+       @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+       ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f config.h stamp-h1
+include/version.h: $(top_builddir)/config.status $(top_srcdir)/include/version.h.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+src/connman.service: $(top_builddir)/config.status $(top_srcdir)/src/connman.service.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+vpn/connman-vpn.service: $(top_builddir)/config.status $(top_srcdir)/vpn/connman-vpn.service.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+vpn/net.connman.vpn.service: $(top_builddir)/config.status $(top_srcdir)/vpn/net.connman.vpn.service.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+scripts/connman: $(top_builddir)/config.status $(top_srcdir)/scripts/connman.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+connman.pc: $(top_builddir)/config.status $(srcdir)/connman.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+src/net.connman.service: $(top_builddir)/config.status $(top_srcdir)/src/net.connman.service.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \
+       }
+
+uninstall-pluginLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \
+       done
+
+clean-pluginLTLIBRARIES:
+       -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES)
+       @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+install-scriptLTLIBRARIES: $(script_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(script_LTLIBRARIES)'; test -n "$(scriptdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(scriptdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(scriptdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(scriptdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(scriptdir)"; \
+       }
+
+uninstall-scriptLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(script_LTLIBRARIES)'; test -n "$(scriptdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(scriptdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(scriptdir)/$$f"; \
+       done
+
+clean-scriptLTLIBRARIES:
+       -test -z "$(script_LTLIBRARIES)" || rm -f $(script_LTLIBRARIES)
+       @list='$(script_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+install-vpn_pluginLTLIBRARIES: $(vpn_plugin_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(vpn_plugin_LTLIBRARIES)'; test -n "$(vpn_plugindir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(vpn_plugindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(vpn_plugindir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(vpn_plugindir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(vpn_plugindir)"; \
+       }
+
+uninstall-vpn_pluginLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(vpn_plugin_LTLIBRARIES)'; test -n "$(vpn_plugindir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(vpn_plugindir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(vpn_plugindir)/$$f"; \
+       done
+
+clean-vpn_pluginLTLIBRARIES:
+       -test -z "$(vpn_plugin_LTLIBRARIES)" || rm -f $(vpn_plugin_LTLIBRARIES)
+       @list='$(vpn_plugin_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+gdbus/$(am__dirstamp):
+       @$(MKDIR_P) gdbus
+       @: > gdbus/$(am__dirstamp)
+gdbus/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) gdbus/$(DEPDIR)
+       @: > gdbus/$(DEPDIR)/$(am__dirstamp)
+gdbus/mainloop.lo: gdbus/$(am__dirstamp) \
+       gdbus/$(DEPDIR)/$(am__dirstamp)
+gdbus/watch.lo: gdbus/$(am__dirstamp) gdbus/$(DEPDIR)/$(am__dirstamp)
+gdbus/object.lo: gdbus/$(am__dirstamp) gdbus/$(DEPDIR)/$(am__dirstamp)
+gdbus/client.lo: gdbus/$(am__dirstamp) gdbus/$(DEPDIR)/$(am__dirstamp)
+gdbus/polkit.lo: gdbus/$(am__dirstamp) gdbus/$(DEPDIR)/$(am__dirstamp)
+gdbus/libgdbus-internal.la: $(gdbus_libgdbus_internal_la_OBJECTS) $(gdbus_libgdbus_internal_la_DEPENDENCIES) $(EXTRA_gdbus_libgdbus_internal_la_DEPENDENCIES) gdbus/$(am__dirstamp)
+       $(AM_V_CCLD)$(LINK)  $(gdbus_libgdbus_internal_la_OBJECTS) $(gdbus_libgdbus_internal_la_LIBADD) $(LIBS)
+plugins/$(am__dirstamp):
+       @$(MKDIR_P) plugins
+       @: > plugins/$(am__dirstamp)
+plugins/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) plugins/$(DEPDIR)
+       @: > plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo:  \
+       plugins/$(am__dirstamp) plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/hh2serial-gps.la: $(plugins_hh2serial_gps_la_OBJECTS) $(plugins_hh2serial_gps_la_DEPENDENCIES) $(EXTRA_plugins_hh2serial_gps_la_DEPENDENCIES) plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(plugins_hh2serial_gps_la_LINK) $(am_plugins_hh2serial_gps_la_rpath) $(plugins_hh2serial_gps_la_OBJECTS) $(plugins_hh2serial_gps_la_LIBADD) $(LIBS)
+plugins/plugins_iospm_la-iospm.lo: plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/iospm.la: $(plugins_iospm_la_OBJECTS) $(plugins_iospm_la_DEPENDENCIES) $(EXTRA_plugins_iospm_la_DEPENDENCIES) plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(plugins_iospm_la_LINK) $(am_plugins_iospm_la_rpath) $(plugins_iospm_la_OBJECTS) $(plugins_iospm_la_LIBADD) $(LIBS)
+plugins/plugins_session_policy_local_la-session_policy_local.lo:  \
+       plugins/$(am__dirstamp) plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/session_policy_local.la: $(plugins_session_policy_local_la_OBJECTS) $(plugins_session_policy_local_la_DEPENDENCIES) $(EXTRA_plugins_session_policy_local_la_DEPENDENCIES) plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(plugins_session_policy_local_la_LINK) $(am_plugins_session_policy_local_la_rpath) $(plugins_session_policy_local_la_OBJECTS) $(plugins_session_policy_local_la_LIBADD) $(LIBS)
+plugins/plugins_tist_la-tist.lo: plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/tist.la: $(plugins_tist_la_OBJECTS) $(plugins_tist_la_DEPENDENCIES) $(EXTRA_plugins_tist_la_DEPENDENCIES) plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(plugins_tist_la_LINK) $(am_plugins_tist_la_rpath) $(plugins_tist_la_OBJECTS) $(plugins_tist_la_LIBADD) $(LIBS)
+scripts/$(am__dirstamp):
+       @$(MKDIR_P) scripts
+       @: > scripts/$(am__dirstamp)
+scripts/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) scripts/$(DEPDIR)
+       @: > scripts/$(DEPDIR)/$(am__dirstamp)
+scripts/libppp-plugin.lo: scripts/$(am__dirstamp) \
+       scripts/$(DEPDIR)/$(am__dirstamp)
+scripts/libppp-plugin.la: $(scripts_libppp_plugin_la_OBJECTS) $(scripts_libppp_plugin_la_DEPENDENCIES) $(EXTRA_scripts_libppp_plugin_la_DEPENDENCIES) scripts/$(am__dirstamp)
+       $(AM_V_CCLD)$(scripts_libppp_plugin_la_LINK) $(am_scripts_libppp_plugin_la_rpath) $(scripts_libppp_plugin_la_OBJECTS) $(scripts_libppp_plugin_la_LIBADD) $(LIBS)
+vpn/plugins/$(am__dirstamp):
+       @$(MKDIR_P) vpn/plugins
+       @: > vpn/plugins/$(am__dirstamp)
+vpn/plugins/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) vpn/plugins/$(DEPDIR)
+       @: > vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_plugins_l2tp_la-vpn.lo: vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo: vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/l2tp.la: $(vpn_plugins_l2tp_la_OBJECTS) $(vpn_plugins_l2tp_la_DEPENDENCIES) $(EXTRA_vpn_plugins_l2tp_la_DEPENDENCIES) vpn/plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(vpn_plugins_l2tp_la_LINK) $(am_vpn_plugins_l2tp_la_rpath) $(vpn_plugins_l2tp_la_OBJECTS) $(vpn_plugins_l2tp_la_LIBADD) $(LIBS)
+vpn/plugins/vpn_plugins_openconnect_la-vpn.lo:  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo:  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/openconnect.la: $(vpn_plugins_openconnect_la_OBJECTS) $(vpn_plugins_openconnect_la_DEPENDENCIES) $(EXTRA_vpn_plugins_openconnect_la_DEPENDENCIES) vpn/plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(vpn_plugins_openconnect_la_LINK) $(am_vpn_plugins_openconnect_la_rpath) $(vpn_plugins_openconnect_la_OBJECTS) $(vpn_plugins_openconnect_la_LIBADD) $(LIBS)
+vpn/plugins/vpn_plugins_openvpn_la-vpn.lo:  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo:  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/openvpn.la: $(vpn_plugins_openvpn_la_OBJECTS) $(vpn_plugins_openvpn_la_DEPENDENCIES) $(EXTRA_vpn_plugins_openvpn_la_DEPENDENCIES) vpn/plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(vpn_plugins_openvpn_la_LINK) $(am_vpn_plugins_openvpn_la_rpath) $(vpn_plugins_openvpn_la_OBJECTS) $(vpn_plugins_openvpn_la_LIBADD) $(LIBS)
+vpn/plugins/vpn_plugins_pptp_la-vpn.lo: vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_plugins_pptp_la-pptp.lo: vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/pptp.la: $(vpn_plugins_pptp_la_OBJECTS) $(vpn_plugins_pptp_la_DEPENDENCIES) $(EXTRA_vpn_plugins_pptp_la_DEPENDENCIES) vpn/plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(vpn_plugins_pptp_la_LINK) $(am_vpn_plugins_pptp_la_rpath) $(vpn_plugins_pptp_la_OBJECTS) $(vpn_plugins_pptp_la_LIBADD) $(LIBS)
+vpn/plugins/vpn_plugins_vpnc_la-vpn.lo: vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo: vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpnc.la: $(vpn_plugins_vpnc_la_OBJECTS) $(vpn_plugins_vpnc_la_DEPENDENCIES) $(EXTRA_vpn_plugins_vpnc_la_DEPENDENCIES) vpn/plugins/$(am__dirstamp)
+       $(AM_V_CCLD)$(vpn_plugins_vpnc_la_LINK) $(am_vpn_plugins_vpnc_la_rpath) $(vpn_plugins_vpnc_la_OBJECTS) $(vpn_plugins_vpnc_la_LIBADD) $(LIBS)
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
+       fi; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p || test -f $$p1; \
+         then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+           echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
+           $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-sbinPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(sbindir)" && rm -f $$files
+
+clean-sbinPROGRAMS:
+       @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+install-scriptPROGRAMS: $(script_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       @list='$(script_PROGRAMS)'; test -n "$(scriptdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(scriptdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(scriptdir)" || exit 1; \
+       fi; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p || test -f $$p1; \
+         then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+           echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(scriptdir)$$dir'"; \
+           $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(scriptdir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-scriptPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(script_PROGRAMS)'; test -n "$(scriptdir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(scriptdir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(scriptdir)" && rm -f $$files
+
+clean-scriptPROGRAMS:
+       @list='$(script_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+client/$(am__dirstamp):
+       @$(MKDIR_P) client
+       @: > client/$(am__dirstamp)
+client/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) client/$(DEPDIR)
+       @: > client/$(DEPDIR)/$(am__dirstamp)
+client/dbus_helpers.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/services.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/commands.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/input.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/agent.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/peers.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/vpnconnections.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/main.$(OBJEXT): client/$(am__dirstamp) \
+       client/$(DEPDIR)/$(am__dirstamp)
+client/connmanctl$(EXEEXT): $(client_connmanctl_OBJECTS) $(client_connmanctl_DEPENDENCIES) $(EXTRA_client_connmanctl_DEPENDENCIES) client/$(am__dirstamp)
+       @rm -f client/connmanctl$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(client_connmanctl_OBJECTS) $(client_connmanctl_LDADD) $(LIBS)
+scripts/openconnect-script.$(OBJEXT): scripts/$(am__dirstamp) \
+       scripts/$(DEPDIR)/$(am__dirstamp)
+scripts/openconnect-script$(EXEEXT): $(scripts_openconnect_script_OBJECTS) $(scripts_openconnect_script_DEPENDENCIES) $(EXTRA_scripts_openconnect_script_DEPENDENCIES) scripts/$(am__dirstamp)
+       @rm -f scripts/openconnect-script$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(scripts_openconnect_script_OBJECTS) $(scripts_openconnect_script_LDADD) $(LIBS)
+scripts/openvpn-script.$(OBJEXT): scripts/$(am__dirstamp) \
+       scripts/$(DEPDIR)/$(am__dirstamp)
+scripts/openvpn-script$(EXEEXT): $(scripts_openvpn_script_OBJECTS) $(scripts_openvpn_script_DEPENDENCIES) $(EXTRA_scripts_openvpn_script_DEPENDENCIES) scripts/$(am__dirstamp)
+       @rm -f scripts/openvpn-script$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(scripts_openvpn_script_OBJECTS) $(scripts_openvpn_script_LDADD) $(LIBS)
+gdhcp/$(am__dirstamp):
+       @$(MKDIR_P) gdhcp
+       @: > gdhcp/$(am__dirstamp)
+gdhcp/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) gdhcp/$(DEPDIR)
+       @: > gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/src_connmand-common.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/src_connmand-client.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/src_connmand-server.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/src_connmand-ipv4ll.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gweb/$(am__dirstamp):
+       @$(MKDIR_P) gweb
+       @: > gweb/$(am__dirstamp)
+gweb/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) gweb/$(DEPDIR)
+       @: > gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/src_connmand-gweb.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/src_connmand-gresolv.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/src_connmand-giognutls.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/src_connmand-gionotls.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-loopback.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-ethernet.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-gadget.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-wifi.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+gsupplicant/$(am__dirstamp):
+       @$(MKDIR_P) gsupplicant
+       @: > gsupplicant/$(am__dirstamp)
+gsupplicant/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) gsupplicant/$(DEPDIR)
+       @: > gsupplicant/$(DEPDIR)/$(am__dirstamp)
+gsupplicant/src_connmand-supplicant.$(OBJEXT):  \
+       gsupplicant/$(am__dirstamp) \
+       gsupplicant/$(DEPDIR)/$(am__dirstamp)
+gsupplicant/src_connmand-dbus.$(OBJEXT): gsupplicant/$(am__dirstamp) \
+       gsupplicant/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-bluetooth_legacy.$(OBJEXT):  \
+       plugins/$(am__dirstamp) plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-bluetooth.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-hh2serial-gps.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-ofono.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-dundee.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-vpn.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-pacrunner.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-polkit.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-nmcompat.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-tist.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-session_policy_local.$(OBJEXT):  \
+       plugins/$(am__dirstamp) plugins/$(DEPDIR)/$(am__dirstamp)
+plugins/src_connmand-neard.$(OBJEXT): plugins/$(am__dirstamp) \
+       plugins/$(DEPDIR)/$(am__dirstamp)
+src/shared/$(am__dirstamp):
+       @$(MKDIR_P) src/shared
+       @: > src/shared/$(am__dirstamp)
+src/shared/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/shared/$(DEPDIR)
+       @: > src/shared/$(DEPDIR)/$(am__dirstamp)
+src/shared/src_connmand-util.$(OBJEXT): src/shared/$(am__dirstamp) \
+       src/shared/$(DEPDIR)/$(am__dirstamp)
+src/shared/src_connmand-netlink.$(OBJEXT): src/shared/$(am__dirstamp) \
+       src/shared/$(DEPDIR)/$(am__dirstamp)
+src/$(am__dirstamp):
+       @$(MKDIR_P) src
+       @: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/$(DEPDIR)
+       @: > src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-main.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-log.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-error.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-plugin.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-task.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-device.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-network.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-connection.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-manager.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-service.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-clock.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-timezone.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-agent-connman.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-agent.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-notifier.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-provider.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-resolver.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-ipconfig.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-detect.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-inet.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-dhcp.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-dhcpv6.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-rtnl.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-proxy.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-utsname.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-timeserver.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-rfkill.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-storage.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-dbus.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-config.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-technology.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-counter.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-ntp.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-session.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-tethering.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-wpad.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-wispr.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-stats.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-iptables.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-dnsproxy.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-6to4.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-ippool.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-bridge.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-nat.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-ipaddress.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-inotify.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-firewall.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-ipv6pd.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/src_connmand-peer.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/connmand$(EXEEXT): $(src_connmand_OBJECTS) $(src_connmand_DEPENDENCIES) $(EXTRA_src_connmand_DEPENDENCIES) src/$(am__dirstamp)
+       @rm -f src/connmand$(EXEEXT)
+       $(AM_V_CCLD)$(src_connmand_LINK) $(src_connmand_OBJECTS) $(src_connmand_LDADD) $(LIBS)
+tools/$(am__dirstamp):
+       @$(MKDIR_P) tools
+       @: > tools/$(am__dirstamp)
+tools/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) tools/$(DEPDIR)
+       @: > tools/$(DEPDIR)/$(am__dirstamp)
+tools/addr-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/addr-test$(EXEEXT): $(tools_addr_test_OBJECTS) $(tools_addr_test_DEPENDENCIES) $(EXTRA_tools_addr_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/addr-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_addr_test_OBJECTS) $(tools_addr_test_LDADD) $(LIBS)
+tools/dbus-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/dbus-test$(EXEEXT): $(tools_dbus_test_OBJECTS) $(tools_dbus_test_DEPENDENCIES) $(EXTRA_tools_dbus_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/dbus-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_dbus_test_OBJECTS) $(tools_dbus_test_LDADD) $(LIBS)
+gdhcp/common.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/client.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/server.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+gdhcp/ipv4ll.$(OBJEXT): gdhcp/$(am__dirstamp) \
+       gdhcp/$(DEPDIR)/$(am__dirstamp)
+tools/dhcp-server-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/dhcp-server-test$(EXEEXT): $(tools_dhcp_server_test_OBJECTS) $(tools_dhcp_server_test_DEPENDENCIES) $(EXTRA_tools_dhcp_server_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/dhcp-server-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_dhcp_server_test_OBJECTS) $(tools_dhcp_server_test_LDADD) $(LIBS)
+tools/dhcp-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/dhcp-test$(EXEEXT): $(tools_dhcp_test_OBJECTS) $(tools_dhcp_test_DEPENDENCIES) $(EXTRA_tools_dhcp_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/dhcp-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_dhcp_test_OBJECTS) $(tools_dhcp_test_LDADD) $(LIBS)
+tools/dnsproxy-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/dnsproxy-test$(EXEEXT): $(tools_dnsproxy_test_OBJECTS) $(tools_dnsproxy_test_DEPENDENCIES) $(EXTRA_tools_dnsproxy_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/dnsproxy-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_dnsproxy_test_OBJECTS) $(tools_dnsproxy_test_LDADD) $(LIBS)
+src/log.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/iptables.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+tools/iptables-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/iptables-test$(EXEEXT): $(tools_iptables_test_OBJECTS) $(tools_iptables_test_DEPENDENCIES) $(EXTRA_tools_iptables_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/iptables-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_iptables_test_OBJECTS) $(tools_iptables_test_LDADD) $(LIBS)
+src/tools_iptables_unit-log.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/tools_iptables_unit-iptables.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/tools_iptables_unit-firewall.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/tools_iptables_unit-nat.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+tools/tools_iptables_unit-iptables-unit.$(OBJEXT):  \
+       tools/$(am__dirstamp) tools/$(DEPDIR)/$(am__dirstamp)
+tools/iptables-unit$(EXEEXT): $(tools_iptables_unit_OBJECTS) $(tools_iptables_unit_DEPENDENCIES) $(EXTRA_tools_iptables_unit_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/iptables-unit$(EXEEXT)
+       $(AM_V_CCLD)$(tools_iptables_unit_LINK) $(tools_iptables_unit_OBJECTS) $(tools_iptables_unit_LDADD) $(LIBS)
+src/shared/util.$(OBJEXT): src/shared/$(am__dirstamp) \
+       src/shared/$(DEPDIR)/$(am__dirstamp)
+src/shared/netlink.$(OBJEXT): src/shared/$(am__dirstamp) \
+       src/shared/$(DEPDIR)/$(am__dirstamp)
+tools/netlink-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/netlink-test$(EXEEXT): $(tools_netlink_test_OBJECTS) $(tools_netlink_test_DEPENDENCIES) $(EXTRA_tools_netlink_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/netlink-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_netlink_test_OBJECTS) $(tools_netlink_test_LDADD) $(LIBS)
+tools/polkit-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/polkit-test$(EXEEXT): $(tools_polkit_test_OBJECTS) $(tools_polkit_test_DEPENDENCIES) $(EXTRA_tools_polkit_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/polkit-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_polkit_test_OBJECTS) $(tools_polkit_test_LDADD) $(LIBS)
+tools/private-network-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/private-network-test$(EXEEXT): $(tools_private_network_test_OBJECTS) $(tools_private_network_test_DEPENDENCIES) $(EXTRA_tools_private_network_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/private-network-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_private_network_test_OBJECTS) $(tools_private_network_test_LDADD) $(LIBS)
+gweb/gresolv.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+tools/resolv-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/resolv-test$(EXEEXT): $(tools_resolv_test_OBJECTS) $(tools_resolv_test_DEPENDENCIES) $(EXTRA_tools_resolv_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/resolv-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_resolv_test_OBJECTS) $(tools_resolv_test_LDADD) $(LIBS)
+src/dbus.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+tools/session-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/session-utils.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/manager-api.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/session-api.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/session-test$(EXEEXT): $(tools_session_test_OBJECTS) $(tools_session_test_DEPENDENCIES) $(EXTRA_tools_session_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/session-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_session_test_OBJECTS) $(tools_session_test_LDADD) $(LIBS)
+tools/stats-tool.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/stats-tool$(EXEEXT): $(tools_stats_tool_OBJECTS) $(tools_stats_tool_DEPENDENCIES) $(EXTRA_tools_stats_tool_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/stats-tool$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_stats_tool_OBJECTS) $(tools_stats_tool_LDADD) $(LIBS)
+tools/supplicant-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/supplicant-dbus.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/supplicant.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/supplicant-test$(EXEEXT): $(tools_supplicant_test_OBJECTS) $(tools_supplicant_test_DEPENDENCIES) $(EXTRA_tools_supplicant_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/supplicant-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_supplicant_test_OBJECTS) $(tools_supplicant_test_LDADD) $(LIBS)
+tools/tap-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/tap-test$(EXEEXT): $(tools_tap_test_OBJECTS) $(tools_tap_test_DEPENDENCIES) $(EXTRA_tools_tap_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/tap-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_tap_test_OBJECTS) $(tools_tap_test_LDADD) $(LIBS)
+gweb/gweb.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/giognutls.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/gionotls.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+tools/web-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/web-test$(EXEEXT): $(tools_web_test_OBJECTS) $(tools_web_test_DEPENDENCIES) $(EXTRA_tools_web_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/web-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_web_test_OBJECTS) $(tools_web_test_LDADD) $(LIBS)
+tools/wispr.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/wispr$(EXEEXT): $(tools_wispr_OBJECTS) $(tools_wispr_DEPENDENCIES) $(EXTRA_tools_wispr_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/wispr$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_wispr_OBJECTS) $(tools_wispr_LDADD) $(LIBS)
+tools/wpad-test.$(OBJEXT): tools/$(am__dirstamp) \
+       tools/$(DEPDIR)/$(am__dirstamp)
+tools/wpad-test$(EXEEXT): $(tools_wpad_test_OBJECTS) $(tools_wpad_test_DEPENDENCIES) $(EXTRA_tools_wpad_test_DEPENDENCIES) tools/$(am__dirstamp)
+       @rm -f tools/wpad-test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tools_wpad_test_OBJECTS) $(tools_wpad_test_LDADD) $(LIBS)
+src/ippool.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+unit/$(am__dirstamp):
+       @$(MKDIR_P) unit
+       @: > unit/$(am__dirstamp)
+unit/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) unit/$(DEPDIR)
+       @: > unit/$(DEPDIR)/$(am__dirstamp)
+unit/test-ippool.$(OBJEXT): unit/$(am__dirstamp) \
+       unit/$(DEPDIR)/$(am__dirstamp)
+unit/test-ippool$(EXEEXT): $(unit_test_ippool_OBJECTS) $(unit_test_ippool_DEPENDENCIES) $(EXTRA_unit_test_ippool_DEPENDENCIES) unit/$(am__dirstamp)
+       @rm -f unit/test-ippool$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit_test_ippool_OBJECTS) $(unit_test_ippool_LDADD) $(LIBS)
+unit/test-pbkdf2-sha1.$(OBJEXT): unit/$(am__dirstamp) \
+       unit/$(DEPDIR)/$(am__dirstamp)
+src/shared/sha1.$(OBJEXT): src/shared/$(am__dirstamp) \
+       src/shared/$(DEPDIR)/$(am__dirstamp)
+unit/test-pbkdf2-sha1$(EXEEXT): $(unit_test_pbkdf2_sha1_OBJECTS) $(unit_test_pbkdf2_sha1_DEPENDENCIES) $(EXTRA_unit_test_pbkdf2_sha1_DEPENDENCIES) unit/$(am__dirstamp)
+       @rm -f unit/test-pbkdf2-sha1$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit_test_pbkdf2_sha1_OBJECTS) $(unit_test_pbkdf2_sha1_LDADD) $(LIBS)
+unit/test-prf-sha1.$(OBJEXT): unit/$(am__dirstamp) \
+       unit/$(DEPDIR)/$(am__dirstamp)
+unit/test-prf-sha1$(EXEEXT): $(unit_test_prf_sha1_OBJECTS) $(unit_test_prf_sha1_DEPENDENCIES) $(EXTRA_unit_test_prf_sha1_DEPENDENCIES) unit/$(am__dirstamp)
+       @rm -f unit/test-prf-sha1$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit_test_prf_sha1_OBJECTS) $(unit_test_prf_sha1_LDADD) $(LIBS)
+vpn/plugins/vpn_connman_vpnd-openconnect.$(OBJEXT):  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_connman_vpnd-openvpn.$(OBJEXT):  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_connman_vpnd-vpnc.$(OBJEXT):  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_connman_vpnd-l2tp.$(OBJEXT):  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_connman_vpnd-pptp.$(OBJEXT):  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT):  \
+       vpn/plugins/$(am__dirstamp) \
+       vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+gweb/vpn_connman_vpnd-gweb.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/vpn_connman_vpnd-gresolv.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/vpn_connman_vpnd-giognutls.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+gweb/vpn_connman_vpnd-gionotls.$(OBJEXT): gweb/$(am__dirstamp) \
+       gweb/$(DEPDIR)/$(am__dirstamp)
+vpn/$(am__dirstamp):
+       @$(MKDIR_P) vpn
+       @: > vpn/$(am__dirstamp)
+vpn/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) vpn/$(DEPDIR)
+       @: > vpn/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-main.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-log.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-error.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-plugin.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-task.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-vpn-manager.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-vpn-provider.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-vpn-ipconfig.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-inet.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-vpn-rtnl.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-dbus.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-storage.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-ipaddress.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-agent.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-vpn-agent.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+src/vpn_connman_vpnd-inotify.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+vpn/vpn_connman_vpnd-vpn-config.$(OBJEXT): vpn/$(am__dirstamp) \
+       vpn/$(DEPDIR)/$(am__dirstamp)
+vpn/connman-vpnd$(EXEEXT): $(vpn_connman_vpnd_OBJECTS) $(vpn_connman_vpnd_DEPENDENCIES) $(EXTRA_vpn_connman_vpnd_DEPENDENCIES) vpn/$(am__dirstamp)
+       @rm -f vpn/connman-vpnd$(EXEEXT)
+       $(AM_V_CCLD)$(vpn_connman_vpnd_LINK) $(vpn_connman_vpnd_OBJECTS) $(vpn_connman_vpnd_LDADD) $(LIBS)
+install-testSCRIPTS: $(test_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       @list='$(test_SCRIPTS)'; test -n "$(testdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(testdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(testdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n' \
+           -e 'h;s|.*|.|' \
+           -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+             if (++n[d] == $(am__install_max)) { \
+               print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+           else { print "f", d "/" $$4, $$1 } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+            if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+            test -z "$$files" || { \
+              echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(testdir)$$dir'"; \
+              $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(testdir)$$dir" || exit $$?; \
+            } \
+       ; done
+
+uninstall-testSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(test_SCRIPTS)'; test -n "$(testdir)" || exit 0; \
+       files=`for p in $$list; do echo "$$p"; done | \
+              sed -e 's,.*/,,;$(transform)'`; \
+       dir='$(DESTDIR)$(testdir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+       -rm -f client/agent.$(OBJEXT)
+       -rm -f client/commands.$(OBJEXT)
+       -rm -f client/dbus_helpers.$(OBJEXT)
+       -rm -f client/input.$(OBJEXT)
+       -rm -f client/main.$(OBJEXT)
+       -rm -f client/peers.$(OBJEXT)
+       -rm -f client/services.$(OBJEXT)
+       -rm -f client/vpnconnections.$(OBJEXT)
+       -rm -f gdbus/client.$(OBJEXT)
+       -rm -f gdbus/client.lo
+       -rm -f gdbus/mainloop.$(OBJEXT)
+       -rm -f gdbus/mainloop.lo
+       -rm -f gdbus/object.$(OBJEXT)
+       -rm -f gdbus/object.lo
+       -rm -f gdbus/polkit.$(OBJEXT)
+       -rm -f gdbus/polkit.lo
+       -rm -f gdbus/watch.$(OBJEXT)
+       -rm -f gdbus/watch.lo
+       -rm -f gdhcp/client.$(OBJEXT)
+       -rm -f gdhcp/common.$(OBJEXT)
+       -rm -f gdhcp/ipv4ll.$(OBJEXT)
+       -rm -f gdhcp/server.$(OBJEXT)
+       -rm -f gdhcp/src_connmand-client.$(OBJEXT)
+       -rm -f gdhcp/src_connmand-common.$(OBJEXT)
+       -rm -f gdhcp/src_connmand-ipv4ll.$(OBJEXT)
+       -rm -f gdhcp/src_connmand-server.$(OBJEXT)
+       -rm -f gsupplicant/src_connmand-dbus.$(OBJEXT)
+       -rm -f gsupplicant/src_connmand-supplicant.$(OBJEXT)
+       -rm -f gweb/giognutls.$(OBJEXT)
+       -rm -f gweb/gionotls.$(OBJEXT)
+       -rm -f gweb/gresolv.$(OBJEXT)
+       -rm -f gweb/gweb.$(OBJEXT)
+       -rm -f gweb/src_connmand-giognutls.$(OBJEXT)
+       -rm -f gweb/src_connmand-gionotls.$(OBJEXT)
+       -rm -f gweb/src_connmand-gresolv.$(OBJEXT)
+       -rm -f gweb/src_connmand-gweb.$(OBJEXT)
+       -rm -f gweb/vpn_connman_vpnd-giognutls.$(OBJEXT)
+       -rm -f gweb/vpn_connman_vpnd-gionotls.$(OBJEXT)
+       -rm -f gweb/vpn_connman_vpnd-gresolv.$(OBJEXT)
+       -rm -f gweb/vpn_connman_vpnd-gweb.$(OBJEXT)
+       -rm -f plugins/plugins_hh2serial_gps_la-hh2serial-gps.$(OBJEXT)
+       -rm -f plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo
+       -rm -f plugins/plugins_iospm_la-iospm.$(OBJEXT)
+       -rm -f plugins/plugins_iospm_la-iospm.lo
+       -rm -f plugins/plugins_session_policy_local_la-session_policy_local.$(OBJEXT)
+       -rm -f plugins/plugins_session_policy_local_la-session_policy_local.lo
+       -rm -f plugins/plugins_tist_la-tist.$(OBJEXT)
+       -rm -f plugins/plugins_tist_la-tist.lo
+       -rm -f plugins/src_connmand-bluetooth.$(OBJEXT)
+       -rm -f plugins/src_connmand-bluetooth_legacy.$(OBJEXT)
+       -rm -f plugins/src_connmand-dundee.$(OBJEXT)
+       -rm -f plugins/src_connmand-ethernet.$(OBJEXT)
+       -rm -f plugins/src_connmand-gadget.$(OBJEXT)
+       -rm -f plugins/src_connmand-hh2serial-gps.$(OBJEXT)
+       -rm -f plugins/src_connmand-loopback.$(OBJEXT)
+       -rm -f plugins/src_connmand-neard.$(OBJEXT)
+       -rm -f plugins/src_connmand-nmcompat.$(OBJEXT)
+       -rm -f plugins/src_connmand-ofono.$(OBJEXT)
+       -rm -f plugins/src_connmand-pacrunner.$(OBJEXT)
+       -rm -f plugins/src_connmand-polkit.$(OBJEXT)
+       -rm -f plugins/src_connmand-session_policy_local.$(OBJEXT)
+       -rm -f plugins/src_connmand-tist.$(OBJEXT)
+       -rm -f plugins/src_connmand-vpn.$(OBJEXT)
+       -rm -f plugins/src_connmand-wifi.$(OBJEXT)
+       -rm -f scripts/libppp-plugin.$(OBJEXT)
+       -rm -f scripts/libppp-plugin.lo
+       -rm -f scripts/openconnect-script.$(OBJEXT)
+       -rm -f scripts/openvpn-script.$(OBJEXT)
+       -rm -f src/dbus.$(OBJEXT)
+       -rm -f src/ippool.$(OBJEXT)
+       -rm -f src/iptables.$(OBJEXT)
+       -rm -f src/log.$(OBJEXT)
+       -rm -f src/shared/netlink.$(OBJEXT)
+       -rm -f src/shared/sha1.$(OBJEXT)
+       -rm -f src/shared/src_connmand-netlink.$(OBJEXT)
+       -rm -f src/shared/src_connmand-util.$(OBJEXT)
+       -rm -f src/shared/util.$(OBJEXT)
+       -rm -f src/src_connmand-6to4.$(OBJEXT)
+       -rm -f src/src_connmand-agent-connman.$(OBJEXT)
+       -rm -f src/src_connmand-agent.$(OBJEXT)
+       -rm -f src/src_connmand-bridge.$(OBJEXT)
+       -rm -f src/src_connmand-clock.$(OBJEXT)
+       -rm -f src/src_connmand-config.$(OBJEXT)
+       -rm -f src/src_connmand-connection.$(OBJEXT)
+       -rm -f src/src_connmand-counter.$(OBJEXT)
+       -rm -f src/src_connmand-dbus.$(OBJEXT)
+       -rm -f src/src_connmand-detect.$(OBJEXT)
+       -rm -f src/src_connmand-device.$(OBJEXT)
+       -rm -f src/src_connmand-dhcp.$(OBJEXT)
+       -rm -f src/src_connmand-dhcpv6.$(OBJEXT)
+       -rm -f src/src_connmand-dnsproxy.$(OBJEXT)
+       -rm -f src/src_connmand-error.$(OBJEXT)
+       -rm -f src/src_connmand-firewall.$(OBJEXT)
+       -rm -f src/src_connmand-inet.$(OBJEXT)
+       -rm -f src/src_connmand-inotify.$(OBJEXT)
+       -rm -f src/src_connmand-ipaddress.$(OBJEXT)
+       -rm -f src/src_connmand-ipconfig.$(OBJEXT)
+       -rm -f src/src_connmand-ippool.$(OBJEXT)
+       -rm -f src/src_connmand-iptables.$(OBJEXT)
+       -rm -f src/src_connmand-ipv6pd.$(OBJEXT)
+       -rm -f src/src_connmand-log.$(OBJEXT)
+       -rm -f src/src_connmand-main.$(OBJEXT)
+       -rm -f src/src_connmand-manager.$(OBJEXT)
+       -rm -f src/src_connmand-nat.$(OBJEXT)
+       -rm -f src/src_connmand-network.$(OBJEXT)
+       -rm -f src/src_connmand-notifier.$(OBJEXT)
+       -rm -f src/src_connmand-ntp.$(OBJEXT)
+       -rm -f src/src_connmand-peer.$(OBJEXT)
+       -rm -f src/src_connmand-plugin.$(OBJEXT)
+       -rm -f src/src_connmand-provider.$(OBJEXT)
+       -rm -f src/src_connmand-proxy.$(OBJEXT)
+       -rm -f src/src_connmand-resolver.$(OBJEXT)
+       -rm -f src/src_connmand-rfkill.$(OBJEXT)
+       -rm -f src/src_connmand-rtnl.$(OBJEXT)
+       -rm -f src/src_connmand-service.$(OBJEXT)
+       -rm -f src/src_connmand-session.$(OBJEXT)
+       -rm -f src/src_connmand-stats.$(OBJEXT)
+       -rm -f src/src_connmand-storage.$(OBJEXT)
+       -rm -f src/src_connmand-task.$(OBJEXT)
+       -rm -f src/src_connmand-technology.$(OBJEXT)
+       -rm -f src/src_connmand-tethering.$(OBJEXT)
+       -rm -f src/src_connmand-timeserver.$(OBJEXT)
+       -rm -f src/src_connmand-timezone.$(OBJEXT)
+       -rm -f src/src_connmand-utsname.$(OBJEXT)
+       -rm -f src/src_connmand-wispr.$(OBJEXT)
+       -rm -f src/src_connmand-wpad.$(OBJEXT)
+       -rm -f src/tools_iptables_unit-firewall.$(OBJEXT)
+       -rm -f src/tools_iptables_unit-iptables.$(OBJEXT)
+       -rm -f src/tools_iptables_unit-log.$(OBJEXT)
+       -rm -f src/tools_iptables_unit-nat.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-agent.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-dbus.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-error.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-inet.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-inotify.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-ipaddress.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-log.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-plugin.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-storage.$(OBJEXT)
+       -rm -f src/vpn_connman_vpnd-task.$(OBJEXT)
+       -rm -f tools/addr-test.$(OBJEXT)
+       -rm -f tools/dbus-test.$(OBJEXT)
+       -rm -f tools/dhcp-server-test.$(OBJEXT)
+       -rm -f tools/dhcp-test.$(OBJEXT)
+       -rm -f tools/dnsproxy-test.$(OBJEXT)
+       -rm -f tools/iptables-test.$(OBJEXT)
+       -rm -f tools/manager-api.$(OBJEXT)
+       -rm -f tools/netlink-test.$(OBJEXT)
+       -rm -f tools/polkit-test.$(OBJEXT)
+       -rm -f tools/private-network-test.$(OBJEXT)
+       -rm -f tools/resolv-test.$(OBJEXT)
+       -rm -f tools/session-api.$(OBJEXT)
+       -rm -f tools/session-test.$(OBJEXT)
+       -rm -f tools/session-utils.$(OBJEXT)
+       -rm -f tools/stats-tool.$(OBJEXT)
+       -rm -f tools/supplicant-dbus.$(OBJEXT)
+       -rm -f tools/supplicant-test.$(OBJEXT)
+       -rm -f tools/supplicant.$(OBJEXT)
+       -rm -f tools/tap-test.$(OBJEXT)
+       -rm -f tools/tools_iptables_unit-iptables-unit.$(OBJEXT)
+       -rm -f tools/web-test.$(OBJEXT)
+       -rm -f tools/wispr.$(OBJEXT)
+       -rm -f tools/wpad-test.$(OBJEXT)
+       -rm -f unit/test-ippool.$(OBJEXT)
+       -rm -f unit/test-pbkdf2-sha1.$(OBJEXT)
+       -rm -f unit/test-prf-sha1.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_connman_vpnd-l2tp.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_connman_vpnd-openconnect.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_connman_vpnd-openvpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_connman_vpnd-pptp.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_connman_vpnd-vpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_connman_vpnd-vpnc.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_l2tp_la-l2tp.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo
+       -rm -f vpn/plugins/vpn_plugins_l2tp_la-vpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_l2tp_la-vpn.lo
+       -rm -f vpn/plugins/vpn_plugins_openconnect_la-openconnect.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo
+       -rm -f vpn/plugins/vpn_plugins_openconnect_la-vpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_openconnect_la-vpn.lo
+       -rm -f vpn/plugins/vpn_plugins_openvpn_la-openvpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo
+       -rm -f vpn/plugins/vpn_plugins_openvpn_la-vpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_openvpn_la-vpn.lo
+       -rm -f vpn/plugins/vpn_plugins_pptp_la-pptp.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_pptp_la-pptp.lo
+       -rm -f vpn/plugins/vpn_plugins_pptp_la-vpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_pptp_la-vpn.lo
+       -rm -f vpn/plugins/vpn_plugins_vpnc_la-vpn.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_vpnc_la-vpn.lo
+       -rm -f vpn/plugins/vpn_plugins_vpnc_la-vpnc.$(OBJEXT)
+       -rm -f vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo
+       -rm -f vpn/vpn_connman_vpnd-main.$(OBJEXT)
+       -rm -f vpn/vpn_connman_vpnd-vpn-agent.$(OBJEXT)
+       -rm -f vpn/vpn_connman_vpnd-vpn-config.$(OBJEXT)
+       -rm -f vpn/vpn_connman_vpnd-vpn-ipconfig.$(OBJEXT)
+       -rm -f vpn/vpn_connman_vpnd-vpn-manager.$(OBJEXT)
+       -rm -f vpn/vpn_connman_vpnd-vpn-provider.$(OBJEXT)
+       -rm -f vpn/vpn_connman_vpnd-vpn-rtnl.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/agent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/commands.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/dbus_helpers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/input.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/peers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/services.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/vpnconnections.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdbus/$(DEPDIR)/client.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdbus/$(DEPDIR)/mainloop.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdbus/$(DEPDIR)/object.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdbus/$(DEPDIR)/polkit.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdbus/$(DEPDIR)/watch.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/client.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/ipv4ll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/server.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/src_connmand-client.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/src_connmand-common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gdhcp/$(DEPDIR)/src_connmand-server.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gsupplicant/$(DEPDIR)/src_connmand-dbus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gsupplicant/$(DEPDIR)/src_connmand-supplicant.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/giognutls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/gionotls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/gresolv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/gweb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/src_connmand-giognutls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/src_connmand-gionotls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/src_connmand-gresolv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/src_connmand-gweb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/plugins_hh2serial_gps_la-hh2serial-gps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/plugins_iospm_la-iospm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/plugins_session_policy_local_la-session_policy_local.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/plugins_tist_la-tist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-bluetooth.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-dundee.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-ethernet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-gadget.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-loopback.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-neard.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-nmcompat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-ofono.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-pacrunner.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-polkit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-session_policy_local.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-tist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-vpn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/src_connmand-wifi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@scripts/$(DEPDIR)/libppp-plugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@scripts/$(DEPDIR)/openconnect-script.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@scripts/$(DEPDIR)/openvpn-script.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ippool.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/iptables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/log.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-6to4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-agent-connman.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-agent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-bridge.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-clock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-config.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-connection.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-counter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-dbus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-detect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-device.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-dhcp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-dhcpv6.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-dnsproxy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-firewall.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-inet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-inotify.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-ipaddress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-ipconfig.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-ippool.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-iptables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-ipv6pd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-log.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-manager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-nat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-network.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-notifier.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-ntp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-peer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-plugin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-provider.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-proxy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-resolver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-rfkill.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-rtnl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-service.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-session.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-stats.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-storage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-task.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-technology.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-tethering.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-timeserver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-timezone.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-utsname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-wispr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/src_connmand-wpad.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/tools_iptables_unit-firewall.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/tools_iptables_unit-iptables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/tools_iptables_unit-log.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/tools_iptables_unit-nat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-agent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-dbus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-inet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-inotify.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-log.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-plugin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-storage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpn_connman_vpnd-task.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/netlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/sha1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/src_connmand-netlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/src_connmand-util.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/shared/$(DEPDIR)/util.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/addr-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/dbus-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/dhcp-server-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/dhcp-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/dnsproxy-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/iptables-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/manager-api.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/netlink-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/polkit-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/private-network-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/resolv-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/session-api.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/session-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/session-utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/stats-tool.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/supplicant-dbus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/supplicant-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/supplicant.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/tap-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/web-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/wispr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/wpad-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/test-ippool.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/test-pbkdf2-sha1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/test-prf-sha1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-l2tp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-vpn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-openconnect.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-vpn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-openvpn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-vpn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-pptp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-vpn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpn.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpnc.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo: plugins/hh2serial-gps.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_hh2serial_gps_la_CFLAGS) $(CFLAGS) -MT plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo -MD -MP -MF plugins/$(DEPDIR)/plugins_hh2serial_gps_la-hh2serial-gps.Tpo -c -o plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo `test -f 'plugins/hh2serial-gps.c' || echo '$(srcdir)/'`plugins/hh2serial-gps.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/plugins_hh2serial_gps_la-hh2serial-gps.Tpo plugins/$(DEPDIR)/plugins_hh2serial_gps_la-hh2serial-gps.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/hh2serial-gps.c' object='plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_hh2serial_gps_la_CFLAGS) $(CFLAGS) -c -o plugins/plugins_hh2serial_gps_la-hh2serial-gps.lo `test -f 'plugins/hh2serial-gps.c' || echo '$(srcdir)/'`plugins/hh2serial-gps.c
+
+plugins/plugins_iospm_la-iospm.lo: plugins/iospm.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_iospm_la_CFLAGS) $(CFLAGS) -MT plugins/plugins_iospm_la-iospm.lo -MD -MP -MF plugins/$(DEPDIR)/plugins_iospm_la-iospm.Tpo -c -o plugins/plugins_iospm_la-iospm.lo `test -f 'plugins/iospm.c' || echo '$(srcdir)/'`plugins/iospm.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/plugins_iospm_la-iospm.Tpo plugins/$(DEPDIR)/plugins_iospm_la-iospm.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/iospm.c' object='plugins/plugins_iospm_la-iospm.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_iospm_la_CFLAGS) $(CFLAGS) -c -o plugins/plugins_iospm_la-iospm.lo `test -f 'plugins/iospm.c' || echo '$(srcdir)/'`plugins/iospm.c
+
+plugins/plugins_session_policy_local_la-session_policy_local.lo: plugins/session_policy_local.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_session_policy_local_la_CFLAGS) $(CFLAGS) -MT plugins/plugins_session_policy_local_la-session_policy_local.lo -MD -MP -MF plugins/$(DEPDIR)/plugins_session_policy_local_la-session_policy_local.Tpo -c -o plugins/plugins_session_policy_local_la-session_policy_local.lo `test -f 'plugins/session_policy_local.c' || echo '$(srcdir)/'`plugins/session_policy_local.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/plugins_session_policy_local_la-session_policy_local.Tpo plugins/$(DEPDIR)/plugins_session_policy_local_la-session_policy_local.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/session_policy_local.c' object='plugins/plugins_session_policy_local_la-session_policy_local.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_session_policy_local_la_CFLAGS) $(CFLAGS) -c -o plugins/plugins_session_policy_local_la-session_policy_local.lo `test -f 'plugins/session_policy_local.c' || echo '$(srcdir)/'`plugins/session_policy_local.c
+
+plugins/plugins_tist_la-tist.lo: plugins/tist.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_tist_la_CFLAGS) $(CFLAGS) -MT plugins/plugins_tist_la-tist.lo -MD -MP -MF plugins/$(DEPDIR)/plugins_tist_la-tist.Tpo -c -o plugins/plugins_tist_la-tist.lo `test -f 'plugins/tist.c' || echo '$(srcdir)/'`plugins/tist.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/plugins_tist_la-tist.Tpo plugins/$(DEPDIR)/plugins_tist_la-tist.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/tist.c' object='plugins/plugins_tist_la-tist.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plugins_tist_la_CFLAGS) $(CFLAGS) -c -o plugins/plugins_tist_la-tist.lo `test -f 'plugins/tist.c' || echo '$(srcdir)/'`plugins/tist.c
+
+vpn/plugins/vpn_plugins_l2tp_la-vpn.lo: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_l2tp_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_l2tp_la-vpn.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-vpn.Tpo -c -o vpn/plugins/vpn_plugins_l2tp_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-vpn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_plugins_l2tp_la-vpn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_l2tp_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_l2tp_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+
+vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo: vpn/plugins/l2tp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_l2tp_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-l2tp.Tpo -c -o vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo `test -f 'vpn/plugins/l2tp.c' || echo '$(srcdir)/'`vpn/plugins/l2tp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-l2tp.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_l2tp_la-l2tp.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/l2tp.c' object='vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_l2tp_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_l2tp_la-l2tp.lo `test -f 'vpn/plugins/l2tp.c' || echo '$(srcdir)/'`vpn/plugins/l2tp.c
+
+vpn/plugins/vpn_plugins_openconnect_la-vpn.lo: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openconnect_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_openconnect_la-vpn.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-vpn.Tpo -c -o vpn/plugins/vpn_plugins_openconnect_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-vpn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_plugins_openconnect_la-vpn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openconnect_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_openconnect_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+
+vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo: vpn/plugins/openconnect.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openconnect_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-openconnect.Tpo -c -o vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo `test -f 'vpn/plugins/openconnect.c' || echo '$(srcdir)/'`vpn/plugins/openconnect.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-openconnect.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_openconnect_la-openconnect.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/openconnect.c' object='vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openconnect_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_openconnect_la-openconnect.lo `test -f 'vpn/plugins/openconnect.c' || echo '$(srcdir)/'`vpn/plugins/openconnect.c
+
+vpn/plugins/vpn_plugins_openvpn_la-vpn.lo: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openvpn_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_openvpn_la-vpn.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-vpn.Tpo -c -o vpn/plugins/vpn_plugins_openvpn_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-vpn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_plugins_openvpn_la-vpn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openvpn_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_openvpn_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+
+vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo: vpn/plugins/openvpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openvpn_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-openvpn.Tpo -c -o vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo `test -f 'vpn/plugins/openvpn.c' || echo '$(srcdir)/'`vpn/plugins/openvpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-openvpn.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_openvpn_la-openvpn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/openvpn.c' object='vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_openvpn_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_openvpn_la-openvpn.lo `test -f 'vpn/plugins/openvpn.c' || echo '$(srcdir)/'`vpn/plugins/openvpn.c
+
+vpn/plugins/vpn_plugins_pptp_la-vpn.lo: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_pptp_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_pptp_la-vpn.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-vpn.Tpo -c -o vpn/plugins/vpn_plugins_pptp_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-vpn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_plugins_pptp_la-vpn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_pptp_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_pptp_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+
+vpn/plugins/vpn_plugins_pptp_la-pptp.lo: vpn/plugins/pptp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_pptp_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_pptp_la-pptp.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-pptp.Tpo -c -o vpn/plugins/vpn_plugins_pptp_la-pptp.lo `test -f 'vpn/plugins/pptp.c' || echo '$(srcdir)/'`vpn/plugins/pptp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-pptp.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_pptp_la-pptp.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/pptp.c' object='vpn/plugins/vpn_plugins_pptp_la-pptp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_pptp_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_pptp_la-pptp.lo `test -f 'vpn/plugins/pptp.c' || echo '$(srcdir)/'`vpn/plugins/pptp.c
+
+vpn/plugins/vpn_plugins_vpnc_la-vpn.lo: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_vpnc_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_vpnc_la-vpn.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpn.Tpo -c -o vpn/plugins/vpn_plugins_vpnc_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpn.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_plugins_vpnc_la-vpn.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_vpnc_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_vpnc_la-vpn.lo `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+
+vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo: vpn/plugins/vpnc.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_vpnc_la_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpnc.Tpo -c -o vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo `test -f 'vpn/plugins/vpnc.c' || echo '$(srcdir)/'`vpn/plugins/vpnc.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpnc.Tpo vpn/plugins/$(DEPDIR)/vpn_plugins_vpnc_la-vpnc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpnc.c' object='vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_plugins_vpnc_la_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_plugins_vpnc_la-vpnc.lo `test -f 'vpn/plugins/vpnc.c' || echo '$(srcdir)/'`vpn/plugins/vpnc.c
+
+gdhcp/src_connmand-common.o: gdhcp/common.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-common.o -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-common.Tpo -c -o gdhcp/src_connmand-common.o `test -f 'gdhcp/common.c' || echo '$(srcdir)/'`gdhcp/common.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-common.Tpo gdhcp/$(DEPDIR)/src_connmand-common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/common.c' object='gdhcp/src_connmand-common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-common.o `test -f 'gdhcp/common.c' || echo '$(srcdir)/'`gdhcp/common.c
+
+gdhcp/src_connmand-common.obj: gdhcp/common.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-common.obj -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-common.Tpo -c -o gdhcp/src_connmand-common.obj `if test -f 'gdhcp/common.c'; then $(CYGPATH_W) 'gdhcp/common.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/common.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-common.Tpo gdhcp/$(DEPDIR)/src_connmand-common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/common.c' object='gdhcp/src_connmand-common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-common.obj `if test -f 'gdhcp/common.c'; then $(CYGPATH_W) 'gdhcp/common.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/common.c'; fi`
+
+gdhcp/src_connmand-client.o: gdhcp/client.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-client.o -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-client.Tpo -c -o gdhcp/src_connmand-client.o `test -f 'gdhcp/client.c' || echo '$(srcdir)/'`gdhcp/client.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-client.Tpo gdhcp/$(DEPDIR)/src_connmand-client.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/client.c' object='gdhcp/src_connmand-client.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-client.o `test -f 'gdhcp/client.c' || echo '$(srcdir)/'`gdhcp/client.c
+
+gdhcp/src_connmand-client.obj: gdhcp/client.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-client.obj -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-client.Tpo -c -o gdhcp/src_connmand-client.obj `if test -f 'gdhcp/client.c'; then $(CYGPATH_W) 'gdhcp/client.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/client.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-client.Tpo gdhcp/$(DEPDIR)/src_connmand-client.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/client.c' object='gdhcp/src_connmand-client.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-client.obj `if test -f 'gdhcp/client.c'; then $(CYGPATH_W) 'gdhcp/client.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/client.c'; fi`
+
+gdhcp/src_connmand-server.o: gdhcp/server.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-server.o -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-server.Tpo -c -o gdhcp/src_connmand-server.o `test -f 'gdhcp/server.c' || echo '$(srcdir)/'`gdhcp/server.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-server.Tpo gdhcp/$(DEPDIR)/src_connmand-server.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/server.c' object='gdhcp/src_connmand-server.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-server.o `test -f 'gdhcp/server.c' || echo '$(srcdir)/'`gdhcp/server.c
+
+gdhcp/src_connmand-server.obj: gdhcp/server.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-server.obj -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-server.Tpo -c -o gdhcp/src_connmand-server.obj `if test -f 'gdhcp/server.c'; then $(CYGPATH_W) 'gdhcp/server.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/server.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-server.Tpo gdhcp/$(DEPDIR)/src_connmand-server.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/server.c' object='gdhcp/src_connmand-server.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-server.obj `if test -f 'gdhcp/server.c'; then $(CYGPATH_W) 'gdhcp/server.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/server.c'; fi`
+
+gdhcp/src_connmand-ipv4ll.o: gdhcp/ipv4ll.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-ipv4ll.o -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Tpo -c -o gdhcp/src_connmand-ipv4ll.o `test -f 'gdhcp/ipv4ll.c' || echo '$(srcdir)/'`gdhcp/ipv4ll.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Tpo gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/ipv4ll.c' object='gdhcp/src_connmand-ipv4ll.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-ipv4ll.o `test -f 'gdhcp/ipv4ll.c' || echo '$(srcdir)/'`gdhcp/ipv4ll.c
+
+gdhcp/src_connmand-ipv4ll.obj: gdhcp/ipv4ll.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gdhcp/src_connmand-ipv4ll.obj -MD -MP -MF gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Tpo -c -o gdhcp/src_connmand-ipv4ll.obj `if test -f 'gdhcp/ipv4ll.c'; then $(CYGPATH_W) 'gdhcp/ipv4ll.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/ipv4ll.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Tpo gdhcp/$(DEPDIR)/src_connmand-ipv4ll.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gdhcp/ipv4ll.c' object='gdhcp/src_connmand-ipv4ll.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gdhcp/src_connmand-ipv4ll.obj `if test -f 'gdhcp/ipv4ll.c'; then $(CYGPATH_W) 'gdhcp/ipv4ll.c'; else $(CYGPATH_W) '$(srcdir)/gdhcp/ipv4ll.c'; fi`
+
+gweb/src_connmand-gweb.o: gweb/gweb.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-gweb.o -MD -MP -MF gweb/$(DEPDIR)/src_connmand-gweb.Tpo -c -o gweb/src_connmand-gweb.o `test -f 'gweb/gweb.c' || echo '$(srcdir)/'`gweb/gweb.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-gweb.Tpo gweb/$(DEPDIR)/src_connmand-gweb.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gweb.c' object='gweb/src_connmand-gweb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-gweb.o `test -f 'gweb/gweb.c' || echo '$(srcdir)/'`gweb/gweb.c
+
+gweb/src_connmand-gweb.obj: gweb/gweb.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-gweb.obj -MD -MP -MF gweb/$(DEPDIR)/src_connmand-gweb.Tpo -c -o gweb/src_connmand-gweb.obj `if test -f 'gweb/gweb.c'; then $(CYGPATH_W) 'gweb/gweb.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gweb.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-gweb.Tpo gweb/$(DEPDIR)/src_connmand-gweb.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gweb.c' object='gweb/src_connmand-gweb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-gweb.obj `if test -f 'gweb/gweb.c'; then $(CYGPATH_W) 'gweb/gweb.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gweb.c'; fi`
+
+gweb/src_connmand-gresolv.o: gweb/gresolv.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-gresolv.o -MD -MP -MF gweb/$(DEPDIR)/src_connmand-gresolv.Tpo -c -o gweb/src_connmand-gresolv.o `test -f 'gweb/gresolv.c' || echo '$(srcdir)/'`gweb/gresolv.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-gresolv.Tpo gweb/$(DEPDIR)/src_connmand-gresolv.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gresolv.c' object='gweb/src_connmand-gresolv.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-gresolv.o `test -f 'gweb/gresolv.c' || echo '$(srcdir)/'`gweb/gresolv.c
+
+gweb/src_connmand-gresolv.obj: gweb/gresolv.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-gresolv.obj -MD -MP -MF gweb/$(DEPDIR)/src_connmand-gresolv.Tpo -c -o gweb/src_connmand-gresolv.obj `if test -f 'gweb/gresolv.c'; then $(CYGPATH_W) 'gweb/gresolv.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gresolv.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-gresolv.Tpo gweb/$(DEPDIR)/src_connmand-gresolv.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gresolv.c' object='gweb/src_connmand-gresolv.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-gresolv.obj `if test -f 'gweb/gresolv.c'; then $(CYGPATH_W) 'gweb/gresolv.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gresolv.c'; fi`
+
+gweb/src_connmand-giognutls.o: gweb/giognutls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-giognutls.o -MD -MP -MF gweb/$(DEPDIR)/src_connmand-giognutls.Tpo -c -o gweb/src_connmand-giognutls.o `test -f 'gweb/giognutls.c' || echo '$(srcdir)/'`gweb/giognutls.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-giognutls.Tpo gweb/$(DEPDIR)/src_connmand-giognutls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/giognutls.c' object='gweb/src_connmand-giognutls.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-giognutls.o `test -f 'gweb/giognutls.c' || echo '$(srcdir)/'`gweb/giognutls.c
+
+gweb/src_connmand-giognutls.obj: gweb/giognutls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-giognutls.obj -MD -MP -MF gweb/$(DEPDIR)/src_connmand-giognutls.Tpo -c -o gweb/src_connmand-giognutls.obj `if test -f 'gweb/giognutls.c'; then $(CYGPATH_W) 'gweb/giognutls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/giognutls.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-giognutls.Tpo gweb/$(DEPDIR)/src_connmand-giognutls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/giognutls.c' object='gweb/src_connmand-giognutls.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-giognutls.obj `if test -f 'gweb/giognutls.c'; then $(CYGPATH_W) 'gweb/giognutls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/giognutls.c'; fi`
+
+gweb/src_connmand-gionotls.o: gweb/gionotls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-gionotls.o -MD -MP -MF gweb/$(DEPDIR)/src_connmand-gionotls.Tpo -c -o gweb/src_connmand-gionotls.o `test -f 'gweb/gionotls.c' || echo '$(srcdir)/'`gweb/gionotls.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-gionotls.Tpo gweb/$(DEPDIR)/src_connmand-gionotls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gionotls.c' object='gweb/src_connmand-gionotls.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-gionotls.o `test -f 'gweb/gionotls.c' || echo '$(srcdir)/'`gweb/gionotls.c
+
+gweb/src_connmand-gionotls.obj: gweb/gionotls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gweb/src_connmand-gionotls.obj -MD -MP -MF gweb/$(DEPDIR)/src_connmand-gionotls.Tpo -c -o gweb/src_connmand-gionotls.obj `if test -f 'gweb/gionotls.c'; then $(CYGPATH_W) 'gweb/gionotls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gionotls.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/src_connmand-gionotls.Tpo gweb/$(DEPDIR)/src_connmand-gionotls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gionotls.c' object='gweb/src_connmand-gionotls.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gweb/src_connmand-gionotls.obj `if test -f 'gweb/gionotls.c'; then $(CYGPATH_W) 'gweb/gionotls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gionotls.c'; fi`
+
+plugins/src_connmand-loopback.o: plugins/loopback.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-loopback.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-loopback.Tpo -c -o plugins/src_connmand-loopback.o `test -f 'plugins/loopback.c' || echo '$(srcdir)/'`plugins/loopback.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-loopback.Tpo plugins/$(DEPDIR)/src_connmand-loopback.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/loopback.c' object='plugins/src_connmand-loopback.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-loopback.o `test -f 'plugins/loopback.c' || echo '$(srcdir)/'`plugins/loopback.c
+
+plugins/src_connmand-loopback.obj: plugins/loopback.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-loopback.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-loopback.Tpo -c -o plugins/src_connmand-loopback.obj `if test -f 'plugins/loopback.c'; then $(CYGPATH_W) 'plugins/loopback.c'; else $(CYGPATH_W) '$(srcdir)/plugins/loopback.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-loopback.Tpo plugins/$(DEPDIR)/src_connmand-loopback.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/loopback.c' object='plugins/src_connmand-loopback.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-loopback.obj `if test -f 'plugins/loopback.c'; then $(CYGPATH_W) 'plugins/loopback.c'; else $(CYGPATH_W) '$(srcdir)/plugins/loopback.c'; fi`
+
+plugins/src_connmand-ethernet.o: plugins/ethernet.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-ethernet.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-ethernet.Tpo -c -o plugins/src_connmand-ethernet.o `test -f 'plugins/ethernet.c' || echo '$(srcdir)/'`plugins/ethernet.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-ethernet.Tpo plugins/$(DEPDIR)/src_connmand-ethernet.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/ethernet.c' object='plugins/src_connmand-ethernet.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-ethernet.o `test -f 'plugins/ethernet.c' || echo '$(srcdir)/'`plugins/ethernet.c
+
+plugins/src_connmand-ethernet.obj: plugins/ethernet.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-ethernet.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-ethernet.Tpo -c -o plugins/src_connmand-ethernet.obj `if test -f 'plugins/ethernet.c'; then $(CYGPATH_W) 'plugins/ethernet.c'; else $(CYGPATH_W) '$(srcdir)/plugins/ethernet.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-ethernet.Tpo plugins/$(DEPDIR)/src_connmand-ethernet.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/ethernet.c' object='plugins/src_connmand-ethernet.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-ethernet.obj `if test -f 'plugins/ethernet.c'; then $(CYGPATH_W) 'plugins/ethernet.c'; else $(CYGPATH_W) '$(srcdir)/plugins/ethernet.c'; fi`
+
+plugins/src_connmand-gadget.o: plugins/gadget.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-gadget.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-gadget.Tpo -c -o plugins/src_connmand-gadget.o `test -f 'plugins/gadget.c' || echo '$(srcdir)/'`plugins/gadget.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-gadget.Tpo plugins/$(DEPDIR)/src_connmand-gadget.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/gadget.c' object='plugins/src_connmand-gadget.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-gadget.o `test -f 'plugins/gadget.c' || echo '$(srcdir)/'`plugins/gadget.c
+
+plugins/src_connmand-gadget.obj: plugins/gadget.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-gadget.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-gadget.Tpo -c -o plugins/src_connmand-gadget.obj `if test -f 'plugins/gadget.c'; then $(CYGPATH_W) 'plugins/gadget.c'; else $(CYGPATH_W) '$(srcdir)/plugins/gadget.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-gadget.Tpo plugins/$(DEPDIR)/src_connmand-gadget.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/gadget.c' object='plugins/src_connmand-gadget.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-gadget.obj `if test -f 'plugins/gadget.c'; then $(CYGPATH_W) 'plugins/gadget.c'; else $(CYGPATH_W) '$(srcdir)/plugins/gadget.c'; fi`
+
+plugins/src_connmand-wifi.o: plugins/wifi.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-wifi.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-wifi.Tpo -c -o plugins/src_connmand-wifi.o `test -f 'plugins/wifi.c' || echo '$(srcdir)/'`plugins/wifi.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-wifi.Tpo plugins/$(DEPDIR)/src_connmand-wifi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/wifi.c' object='plugins/src_connmand-wifi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-wifi.o `test -f 'plugins/wifi.c' || echo '$(srcdir)/'`plugins/wifi.c
+
+plugins/src_connmand-wifi.obj: plugins/wifi.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-wifi.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-wifi.Tpo -c -o plugins/src_connmand-wifi.obj `if test -f 'plugins/wifi.c'; then $(CYGPATH_W) 'plugins/wifi.c'; else $(CYGPATH_W) '$(srcdir)/plugins/wifi.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-wifi.Tpo plugins/$(DEPDIR)/src_connmand-wifi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/wifi.c' object='plugins/src_connmand-wifi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-wifi.obj `if test -f 'plugins/wifi.c'; then $(CYGPATH_W) 'plugins/wifi.c'; else $(CYGPATH_W) '$(srcdir)/plugins/wifi.c'; fi`
+
+gsupplicant/src_connmand-supplicant.o: gsupplicant/supplicant.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gsupplicant/src_connmand-supplicant.o -MD -MP -MF gsupplicant/$(DEPDIR)/src_connmand-supplicant.Tpo -c -o gsupplicant/src_connmand-supplicant.o `test -f 'gsupplicant/supplicant.c' || echo '$(srcdir)/'`gsupplicant/supplicant.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gsupplicant/$(DEPDIR)/src_connmand-supplicant.Tpo gsupplicant/$(DEPDIR)/src_connmand-supplicant.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gsupplicant/supplicant.c' object='gsupplicant/src_connmand-supplicant.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gsupplicant/src_connmand-supplicant.o `test -f 'gsupplicant/supplicant.c' || echo '$(srcdir)/'`gsupplicant/supplicant.c
+
+gsupplicant/src_connmand-supplicant.obj: gsupplicant/supplicant.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gsupplicant/src_connmand-supplicant.obj -MD -MP -MF gsupplicant/$(DEPDIR)/src_connmand-supplicant.Tpo -c -o gsupplicant/src_connmand-supplicant.obj `if test -f 'gsupplicant/supplicant.c'; then $(CYGPATH_W) 'gsupplicant/supplicant.c'; else $(CYGPATH_W) '$(srcdir)/gsupplicant/supplicant.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gsupplicant/$(DEPDIR)/src_connmand-supplicant.Tpo gsupplicant/$(DEPDIR)/src_connmand-supplicant.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gsupplicant/supplicant.c' object='gsupplicant/src_connmand-supplicant.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gsupplicant/src_connmand-supplicant.obj `if test -f 'gsupplicant/supplicant.c'; then $(CYGPATH_W) 'gsupplicant/supplicant.c'; else $(CYGPATH_W) '$(srcdir)/gsupplicant/supplicant.c'; fi`
+
+gsupplicant/src_connmand-dbus.o: gsupplicant/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gsupplicant/src_connmand-dbus.o -MD -MP -MF gsupplicant/$(DEPDIR)/src_connmand-dbus.Tpo -c -o gsupplicant/src_connmand-dbus.o `test -f 'gsupplicant/dbus.c' || echo '$(srcdir)/'`gsupplicant/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gsupplicant/$(DEPDIR)/src_connmand-dbus.Tpo gsupplicant/$(DEPDIR)/src_connmand-dbus.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gsupplicant/dbus.c' object='gsupplicant/src_connmand-dbus.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gsupplicant/src_connmand-dbus.o `test -f 'gsupplicant/dbus.c' || echo '$(srcdir)/'`gsupplicant/dbus.c
+
+gsupplicant/src_connmand-dbus.obj: gsupplicant/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT gsupplicant/src_connmand-dbus.obj -MD -MP -MF gsupplicant/$(DEPDIR)/src_connmand-dbus.Tpo -c -o gsupplicant/src_connmand-dbus.obj `if test -f 'gsupplicant/dbus.c'; then $(CYGPATH_W) 'gsupplicant/dbus.c'; else $(CYGPATH_W) '$(srcdir)/gsupplicant/dbus.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gsupplicant/$(DEPDIR)/src_connmand-dbus.Tpo gsupplicant/$(DEPDIR)/src_connmand-dbus.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gsupplicant/dbus.c' object='gsupplicant/src_connmand-dbus.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o gsupplicant/src_connmand-dbus.obj `if test -f 'gsupplicant/dbus.c'; then $(CYGPATH_W) 'gsupplicant/dbus.c'; else $(CYGPATH_W) '$(srcdir)/gsupplicant/dbus.c'; fi`
+
+plugins/src_connmand-bluetooth_legacy.o: plugins/bluetooth_legacy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-bluetooth_legacy.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Tpo -c -o plugins/src_connmand-bluetooth_legacy.o `test -f 'plugins/bluetooth_legacy.c' || echo '$(srcdir)/'`plugins/bluetooth_legacy.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Tpo plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/bluetooth_legacy.c' object='plugins/src_connmand-bluetooth_legacy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-bluetooth_legacy.o `test -f 'plugins/bluetooth_legacy.c' || echo '$(srcdir)/'`plugins/bluetooth_legacy.c
+
+plugins/src_connmand-bluetooth_legacy.obj: plugins/bluetooth_legacy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-bluetooth_legacy.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Tpo -c -o plugins/src_connmand-bluetooth_legacy.obj `if test -f 'plugins/bluetooth_legacy.c'; then $(CYGPATH_W) 'plugins/bluetooth_legacy.c'; else $(CYGPATH_W) '$(srcdir)/plugins/bluetooth_legacy.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Tpo plugins/$(DEPDIR)/src_connmand-bluetooth_legacy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/bluetooth_legacy.c' object='plugins/src_connmand-bluetooth_legacy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-bluetooth_legacy.obj `if test -f 'plugins/bluetooth_legacy.c'; then $(CYGPATH_W) 'plugins/bluetooth_legacy.c'; else $(CYGPATH_W) '$(srcdir)/plugins/bluetooth_legacy.c'; fi`
+
+plugins/src_connmand-bluetooth.o: plugins/bluetooth.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-bluetooth.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-bluetooth.Tpo -c -o plugins/src_connmand-bluetooth.o `test -f 'plugins/bluetooth.c' || echo '$(srcdir)/'`plugins/bluetooth.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-bluetooth.Tpo plugins/$(DEPDIR)/src_connmand-bluetooth.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/bluetooth.c' object='plugins/src_connmand-bluetooth.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-bluetooth.o `test -f 'plugins/bluetooth.c' || echo '$(srcdir)/'`plugins/bluetooth.c
+
+plugins/src_connmand-bluetooth.obj: plugins/bluetooth.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-bluetooth.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-bluetooth.Tpo -c -o plugins/src_connmand-bluetooth.obj `if test -f 'plugins/bluetooth.c'; then $(CYGPATH_W) 'plugins/bluetooth.c'; else $(CYGPATH_W) '$(srcdir)/plugins/bluetooth.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-bluetooth.Tpo plugins/$(DEPDIR)/src_connmand-bluetooth.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/bluetooth.c' object='plugins/src_connmand-bluetooth.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-bluetooth.obj `if test -f 'plugins/bluetooth.c'; then $(CYGPATH_W) 'plugins/bluetooth.c'; else $(CYGPATH_W) '$(srcdir)/plugins/bluetooth.c'; fi`
+
+plugins/src_connmand-hh2serial-gps.o: plugins/hh2serial-gps.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-hh2serial-gps.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Tpo -c -o plugins/src_connmand-hh2serial-gps.o `test -f 'plugins/hh2serial-gps.c' || echo '$(srcdir)/'`plugins/hh2serial-gps.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Tpo plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/hh2serial-gps.c' object='plugins/src_connmand-hh2serial-gps.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-hh2serial-gps.o `test -f 'plugins/hh2serial-gps.c' || echo '$(srcdir)/'`plugins/hh2serial-gps.c
+
+plugins/src_connmand-hh2serial-gps.obj: plugins/hh2serial-gps.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-hh2serial-gps.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Tpo -c -o plugins/src_connmand-hh2serial-gps.obj `if test -f 'plugins/hh2serial-gps.c'; then $(CYGPATH_W) 'plugins/hh2serial-gps.c'; else $(CYGPATH_W) '$(srcdir)/plugins/hh2serial-gps.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Tpo plugins/$(DEPDIR)/src_connmand-hh2serial-gps.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/hh2serial-gps.c' object='plugins/src_connmand-hh2serial-gps.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-hh2serial-gps.obj `if test -f 'plugins/hh2serial-gps.c'; then $(CYGPATH_W) 'plugins/hh2serial-gps.c'; else $(CYGPATH_W) '$(srcdir)/plugins/hh2serial-gps.c'; fi`
+
+plugins/src_connmand-ofono.o: plugins/ofono.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-ofono.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-ofono.Tpo -c -o plugins/src_connmand-ofono.o `test -f 'plugins/ofono.c' || echo '$(srcdir)/'`plugins/ofono.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-ofono.Tpo plugins/$(DEPDIR)/src_connmand-ofono.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/ofono.c' object='plugins/src_connmand-ofono.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-ofono.o `test -f 'plugins/ofono.c' || echo '$(srcdir)/'`plugins/ofono.c
+
+plugins/src_connmand-ofono.obj: plugins/ofono.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-ofono.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-ofono.Tpo -c -o plugins/src_connmand-ofono.obj `if test -f 'plugins/ofono.c'; then $(CYGPATH_W) 'plugins/ofono.c'; else $(CYGPATH_W) '$(srcdir)/plugins/ofono.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-ofono.Tpo plugins/$(DEPDIR)/src_connmand-ofono.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/ofono.c' object='plugins/src_connmand-ofono.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-ofono.obj `if test -f 'plugins/ofono.c'; then $(CYGPATH_W) 'plugins/ofono.c'; else $(CYGPATH_W) '$(srcdir)/plugins/ofono.c'; fi`
+
+plugins/src_connmand-dundee.o: plugins/dundee.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-dundee.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-dundee.Tpo -c -o plugins/src_connmand-dundee.o `test -f 'plugins/dundee.c' || echo '$(srcdir)/'`plugins/dundee.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-dundee.Tpo plugins/$(DEPDIR)/src_connmand-dundee.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/dundee.c' object='plugins/src_connmand-dundee.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-dundee.o `test -f 'plugins/dundee.c' || echo '$(srcdir)/'`plugins/dundee.c
+
+plugins/src_connmand-dundee.obj: plugins/dundee.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-dundee.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-dundee.Tpo -c -o plugins/src_connmand-dundee.obj `if test -f 'plugins/dundee.c'; then $(CYGPATH_W) 'plugins/dundee.c'; else $(CYGPATH_W) '$(srcdir)/plugins/dundee.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-dundee.Tpo plugins/$(DEPDIR)/src_connmand-dundee.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/dundee.c' object='plugins/src_connmand-dundee.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-dundee.obj `if test -f 'plugins/dundee.c'; then $(CYGPATH_W) 'plugins/dundee.c'; else $(CYGPATH_W) '$(srcdir)/plugins/dundee.c'; fi`
+
+plugins/src_connmand-vpn.o: plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-vpn.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-vpn.Tpo -c -o plugins/src_connmand-vpn.o `test -f 'plugins/vpn.c' || echo '$(srcdir)/'`plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-vpn.Tpo plugins/$(DEPDIR)/src_connmand-vpn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/vpn.c' object='plugins/src_connmand-vpn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-vpn.o `test -f 'plugins/vpn.c' || echo '$(srcdir)/'`plugins/vpn.c
+
+plugins/src_connmand-vpn.obj: plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-vpn.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-vpn.Tpo -c -o plugins/src_connmand-vpn.obj `if test -f 'plugins/vpn.c'; then $(CYGPATH_W) 'plugins/vpn.c'; else $(CYGPATH_W) '$(srcdir)/plugins/vpn.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-vpn.Tpo plugins/$(DEPDIR)/src_connmand-vpn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/vpn.c' object='plugins/src_connmand-vpn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-vpn.obj `if test -f 'plugins/vpn.c'; then $(CYGPATH_W) 'plugins/vpn.c'; else $(CYGPATH_W) '$(srcdir)/plugins/vpn.c'; fi`
+
+plugins/src_connmand-pacrunner.o: plugins/pacrunner.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-pacrunner.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-pacrunner.Tpo -c -o plugins/src_connmand-pacrunner.o `test -f 'plugins/pacrunner.c' || echo '$(srcdir)/'`plugins/pacrunner.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-pacrunner.Tpo plugins/$(DEPDIR)/src_connmand-pacrunner.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/pacrunner.c' object='plugins/src_connmand-pacrunner.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-pacrunner.o `test -f 'plugins/pacrunner.c' || echo '$(srcdir)/'`plugins/pacrunner.c
+
+plugins/src_connmand-pacrunner.obj: plugins/pacrunner.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-pacrunner.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-pacrunner.Tpo -c -o plugins/src_connmand-pacrunner.obj `if test -f 'plugins/pacrunner.c'; then $(CYGPATH_W) 'plugins/pacrunner.c'; else $(CYGPATH_W) '$(srcdir)/plugins/pacrunner.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-pacrunner.Tpo plugins/$(DEPDIR)/src_connmand-pacrunner.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/pacrunner.c' object='plugins/src_connmand-pacrunner.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-pacrunner.obj `if test -f 'plugins/pacrunner.c'; then $(CYGPATH_W) 'plugins/pacrunner.c'; else $(CYGPATH_W) '$(srcdir)/plugins/pacrunner.c'; fi`
+
+plugins/src_connmand-polkit.o: plugins/polkit.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-polkit.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-polkit.Tpo -c -o plugins/src_connmand-polkit.o `test -f 'plugins/polkit.c' || echo '$(srcdir)/'`plugins/polkit.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-polkit.Tpo plugins/$(DEPDIR)/src_connmand-polkit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/polkit.c' object='plugins/src_connmand-polkit.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-polkit.o `test -f 'plugins/polkit.c' || echo '$(srcdir)/'`plugins/polkit.c
+
+plugins/src_connmand-polkit.obj: plugins/polkit.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-polkit.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-polkit.Tpo -c -o plugins/src_connmand-polkit.obj `if test -f 'plugins/polkit.c'; then $(CYGPATH_W) 'plugins/polkit.c'; else $(CYGPATH_W) '$(srcdir)/plugins/polkit.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-polkit.Tpo plugins/$(DEPDIR)/src_connmand-polkit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/polkit.c' object='plugins/src_connmand-polkit.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-polkit.obj `if test -f 'plugins/polkit.c'; then $(CYGPATH_W) 'plugins/polkit.c'; else $(CYGPATH_W) '$(srcdir)/plugins/polkit.c'; fi`
+
+plugins/src_connmand-nmcompat.o: plugins/nmcompat.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-nmcompat.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-nmcompat.Tpo -c -o plugins/src_connmand-nmcompat.o `test -f 'plugins/nmcompat.c' || echo '$(srcdir)/'`plugins/nmcompat.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-nmcompat.Tpo plugins/$(DEPDIR)/src_connmand-nmcompat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/nmcompat.c' object='plugins/src_connmand-nmcompat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-nmcompat.o `test -f 'plugins/nmcompat.c' || echo '$(srcdir)/'`plugins/nmcompat.c
+
+plugins/src_connmand-nmcompat.obj: plugins/nmcompat.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-nmcompat.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-nmcompat.Tpo -c -o plugins/src_connmand-nmcompat.obj `if test -f 'plugins/nmcompat.c'; then $(CYGPATH_W) 'plugins/nmcompat.c'; else $(CYGPATH_W) '$(srcdir)/plugins/nmcompat.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-nmcompat.Tpo plugins/$(DEPDIR)/src_connmand-nmcompat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/nmcompat.c' object='plugins/src_connmand-nmcompat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-nmcompat.obj `if test -f 'plugins/nmcompat.c'; then $(CYGPATH_W) 'plugins/nmcompat.c'; else $(CYGPATH_W) '$(srcdir)/plugins/nmcompat.c'; fi`
+
+plugins/src_connmand-tist.o: plugins/tist.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-tist.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-tist.Tpo -c -o plugins/src_connmand-tist.o `test -f 'plugins/tist.c' || echo '$(srcdir)/'`plugins/tist.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-tist.Tpo plugins/$(DEPDIR)/src_connmand-tist.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/tist.c' object='plugins/src_connmand-tist.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-tist.o `test -f 'plugins/tist.c' || echo '$(srcdir)/'`plugins/tist.c
+
+plugins/src_connmand-tist.obj: plugins/tist.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-tist.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-tist.Tpo -c -o plugins/src_connmand-tist.obj `if test -f 'plugins/tist.c'; then $(CYGPATH_W) 'plugins/tist.c'; else $(CYGPATH_W) '$(srcdir)/plugins/tist.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-tist.Tpo plugins/$(DEPDIR)/src_connmand-tist.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/tist.c' object='plugins/src_connmand-tist.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-tist.obj `if test -f 'plugins/tist.c'; then $(CYGPATH_W) 'plugins/tist.c'; else $(CYGPATH_W) '$(srcdir)/plugins/tist.c'; fi`
+
+plugins/src_connmand-session_policy_local.o: plugins/session_policy_local.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-session_policy_local.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-session_policy_local.Tpo -c -o plugins/src_connmand-session_policy_local.o `test -f 'plugins/session_policy_local.c' || echo '$(srcdir)/'`plugins/session_policy_local.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-session_policy_local.Tpo plugins/$(DEPDIR)/src_connmand-session_policy_local.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/session_policy_local.c' object='plugins/src_connmand-session_policy_local.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-session_policy_local.o `test -f 'plugins/session_policy_local.c' || echo '$(srcdir)/'`plugins/session_policy_local.c
+
+plugins/src_connmand-session_policy_local.obj: plugins/session_policy_local.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-session_policy_local.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-session_policy_local.Tpo -c -o plugins/src_connmand-session_policy_local.obj `if test -f 'plugins/session_policy_local.c'; then $(CYGPATH_W) 'plugins/session_policy_local.c'; else $(CYGPATH_W) '$(srcdir)/plugins/session_policy_local.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-session_policy_local.Tpo plugins/$(DEPDIR)/src_connmand-session_policy_local.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/session_policy_local.c' object='plugins/src_connmand-session_policy_local.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-session_policy_local.obj `if test -f 'plugins/session_policy_local.c'; then $(CYGPATH_W) 'plugins/session_policy_local.c'; else $(CYGPATH_W) '$(srcdir)/plugins/session_policy_local.c'; fi`
+
+plugins/src_connmand-neard.o: plugins/neard.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-neard.o -MD -MP -MF plugins/$(DEPDIR)/src_connmand-neard.Tpo -c -o plugins/src_connmand-neard.o `test -f 'plugins/neard.c' || echo '$(srcdir)/'`plugins/neard.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-neard.Tpo plugins/$(DEPDIR)/src_connmand-neard.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/neard.c' object='plugins/src_connmand-neard.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-neard.o `test -f 'plugins/neard.c' || echo '$(srcdir)/'`plugins/neard.c
+
+plugins/src_connmand-neard.obj: plugins/neard.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT plugins/src_connmand-neard.obj -MD -MP -MF plugins/$(DEPDIR)/src_connmand-neard.Tpo -c -o plugins/src_connmand-neard.obj `if test -f 'plugins/neard.c'; then $(CYGPATH_W) 'plugins/neard.c'; else $(CYGPATH_W) '$(srcdir)/plugins/neard.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) plugins/$(DEPDIR)/src_connmand-neard.Tpo plugins/$(DEPDIR)/src_connmand-neard.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='plugins/neard.c' object='plugins/src_connmand-neard.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o plugins/src_connmand-neard.obj `if test -f 'plugins/neard.c'; then $(CYGPATH_W) 'plugins/neard.c'; else $(CYGPATH_W) '$(srcdir)/plugins/neard.c'; fi`
+
+src/shared/src_connmand-util.o: src/shared/util.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/shared/src_connmand-util.o -MD -MP -MF src/shared/$(DEPDIR)/src_connmand-util.Tpo -c -o src/shared/src_connmand-util.o `test -f 'src/shared/util.c' || echo '$(srcdir)/'`src/shared/util.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/shared/$(DEPDIR)/src_connmand-util.Tpo src/shared/$(DEPDIR)/src_connmand-util.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/shared/util.c' object='src/shared/src_connmand-util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/shared/src_connmand-util.o `test -f 'src/shared/util.c' || echo '$(srcdir)/'`src/shared/util.c
+
+src/shared/src_connmand-util.obj: src/shared/util.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/shared/src_connmand-util.obj -MD -MP -MF src/shared/$(DEPDIR)/src_connmand-util.Tpo -c -o src/shared/src_connmand-util.obj `if test -f 'src/shared/util.c'; then $(CYGPATH_W) 'src/shared/util.c'; else $(CYGPATH_W) '$(srcdir)/src/shared/util.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/shared/$(DEPDIR)/src_connmand-util.Tpo src/shared/$(DEPDIR)/src_connmand-util.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/shared/util.c' object='src/shared/src_connmand-util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/shared/src_connmand-util.obj `if test -f 'src/shared/util.c'; then $(CYGPATH_W) 'src/shared/util.c'; else $(CYGPATH_W) '$(srcdir)/src/shared/util.c'; fi`
+
+src/shared/src_connmand-netlink.o: src/shared/netlink.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/shared/src_connmand-netlink.o -MD -MP -MF src/shared/$(DEPDIR)/src_connmand-netlink.Tpo -c -o src/shared/src_connmand-netlink.o `test -f 'src/shared/netlink.c' || echo '$(srcdir)/'`src/shared/netlink.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/shared/$(DEPDIR)/src_connmand-netlink.Tpo src/shared/$(DEPDIR)/src_connmand-netlink.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/shared/netlink.c' object='src/shared/src_connmand-netlink.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/shared/src_connmand-netlink.o `test -f 'src/shared/netlink.c' || echo '$(srcdir)/'`src/shared/netlink.c
+
+src/shared/src_connmand-netlink.obj: src/shared/netlink.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/shared/src_connmand-netlink.obj -MD -MP -MF src/shared/$(DEPDIR)/src_connmand-netlink.Tpo -c -o src/shared/src_connmand-netlink.obj `if test -f 'src/shared/netlink.c'; then $(CYGPATH_W) 'src/shared/netlink.c'; else $(CYGPATH_W) '$(srcdir)/src/shared/netlink.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/shared/$(DEPDIR)/src_connmand-netlink.Tpo src/shared/$(DEPDIR)/src_connmand-netlink.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/shared/netlink.c' object='src/shared/src_connmand-netlink.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/shared/src_connmand-netlink.obj `if test -f 'src/shared/netlink.c'; then $(CYGPATH_W) 'src/shared/netlink.c'; else $(CYGPATH_W) '$(srcdir)/src/shared/netlink.c'; fi`
+
+src/src_connmand-main.o: src/main.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-main.o -MD -MP -MF src/$(DEPDIR)/src_connmand-main.Tpo -c -o src/src_connmand-main.o `test -f 'src/main.c' || echo '$(srcdir)/'`src/main.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-main.Tpo src/$(DEPDIR)/src_connmand-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/main.c' object='src/src_connmand-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-main.o `test -f 'src/main.c' || echo '$(srcdir)/'`src/main.c
+
+src/src_connmand-main.obj: src/main.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-main.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-main.Tpo -c -o src/src_connmand-main.obj `if test -f 'src/main.c'; then $(CYGPATH_W) 'src/main.c'; else $(CYGPATH_W) '$(srcdir)/src/main.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-main.Tpo src/$(DEPDIR)/src_connmand-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/main.c' object='src/src_connmand-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-main.obj `if test -f 'src/main.c'; then $(CYGPATH_W) 'src/main.c'; else $(CYGPATH_W) '$(srcdir)/src/main.c'; fi`
+
+src/src_connmand-log.o: src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-log.o -MD -MP -MF src/$(DEPDIR)/src_connmand-log.Tpo -c -o src/src_connmand-log.o `test -f 'src/log.c' || echo '$(srcdir)/'`src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-log.Tpo src/$(DEPDIR)/src_connmand-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/log.c' object='src/src_connmand-log.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-log.o `test -f 'src/log.c' || echo '$(srcdir)/'`src/log.c
+
+src/src_connmand-log.obj: src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-log.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-log.Tpo -c -o src/src_connmand-log.obj `if test -f 'src/log.c'; then $(CYGPATH_W) 'src/log.c'; else $(CYGPATH_W) '$(srcdir)/src/log.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-log.Tpo src/$(DEPDIR)/src_connmand-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/log.c' object='src/src_connmand-log.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-log.obj `if test -f 'src/log.c'; then $(CYGPATH_W) 'src/log.c'; else $(CYGPATH_W) '$(srcdir)/src/log.c'; fi`
+
+src/src_connmand-error.o: src/error.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-error.o -MD -MP -MF src/$(DEPDIR)/src_connmand-error.Tpo -c -o src/src_connmand-error.o `test -f 'src/error.c' || echo '$(srcdir)/'`src/error.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-error.Tpo src/$(DEPDIR)/src_connmand-error.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/error.c' object='src/src_connmand-error.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-error.o `test -f 'src/error.c' || echo '$(srcdir)/'`src/error.c
+
+src/src_connmand-error.obj: src/error.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-error.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-error.Tpo -c -o src/src_connmand-error.obj `if test -f 'src/error.c'; then $(CYGPATH_W) 'src/error.c'; else $(CYGPATH_W) '$(srcdir)/src/error.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-error.Tpo src/$(DEPDIR)/src_connmand-error.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/error.c' object='src/src_connmand-error.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-error.obj `if test -f 'src/error.c'; then $(CYGPATH_W) 'src/error.c'; else $(CYGPATH_W) '$(srcdir)/src/error.c'; fi`
+
+src/src_connmand-plugin.o: src/plugin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-plugin.o -MD -MP -MF src/$(DEPDIR)/src_connmand-plugin.Tpo -c -o src/src_connmand-plugin.o `test -f 'src/plugin.c' || echo '$(srcdir)/'`src/plugin.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-plugin.Tpo src/$(DEPDIR)/src_connmand-plugin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/plugin.c' object='src/src_connmand-plugin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-plugin.o `test -f 'src/plugin.c' || echo '$(srcdir)/'`src/plugin.c
+
+src/src_connmand-plugin.obj: src/plugin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-plugin.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-plugin.Tpo -c -o src/src_connmand-plugin.obj `if test -f 'src/plugin.c'; then $(CYGPATH_W) 'src/plugin.c'; else $(CYGPATH_W) '$(srcdir)/src/plugin.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-plugin.Tpo src/$(DEPDIR)/src_connmand-plugin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/plugin.c' object='src/src_connmand-plugin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-plugin.obj `if test -f 'src/plugin.c'; then $(CYGPATH_W) 'src/plugin.c'; else $(CYGPATH_W) '$(srcdir)/src/plugin.c'; fi`
+
+src/src_connmand-task.o: src/task.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-task.o -MD -MP -MF src/$(DEPDIR)/src_connmand-task.Tpo -c -o src/src_connmand-task.o `test -f 'src/task.c' || echo '$(srcdir)/'`src/task.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-task.Tpo src/$(DEPDIR)/src_connmand-task.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/task.c' object='src/src_connmand-task.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-task.o `test -f 'src/task.c' || echo '$(srcdir)/'`src/task.c
+
+src/src_connmand-task.obj: src/task.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-task.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-task.Tpo -c -o src/src_connmand-task.obj `if test -f 'src/task.c'; then $(CYGPATH_W) 'src/task.c'; else $(CYGPATH_W) '$(srcdir)/src/task.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-task.Tpo src/$(DEPDIR)/src_connmand-task.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/task.c' object='src/src_connmand-task.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-task.obj `if test -f 'src/task.c'; then $(CYGPATH_W) 'src/task.c'; else $(CYGPATH_W) '$(srcdir)/src/task.c'; fi`
+
+src/src_connmand-device.o: src/device.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-device.o -MD -MP -MF src/$(DEPDIR)/src_connmand-device.Tpo -c -o src/src_connmand-device.o `test -f 'src/device.c' || echo '$(srcdir)/'`src/device.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-device.Tpo src/$(DEPDIR)/src_connmand-device.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/device.c' object='src/src_connmand-device.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-device.o `test -f 'src/device.c' || echo '$(srcdir)/'`src/device.c
+
+src/src_connmand-device.obj: src/device.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-device.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-device.Tpo -c -o src/src_connmand-device.obj `if test -f 'src/device.c'; then $(CYGPATH_W) 'src/device.c'; else $(CYGPATH_W) '$(srcdir)/src/device.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-device.Tpo src/$(DEPDIR)/src_connmand-device.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/device.c' object='src/src_connmand-device.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-device.obj `if test -f 'src/device.c'; then $(CYGPATH_W) 'src/device.c'; else $(CYGPATH_W) '$(srcdir)/src/device.c'; fi`
+
+src/src_connmand-network.o: src/network.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-network.o -MD -MP -MF src/$(DEPDIR)/src_connmand-network.Tpo -c -o src/src_connmand-network.o `test -f 'src/network.c' || echo '$(srcdir)/'`src/network.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-network.Tpo src/$(DEPDIR)/src_connmand-network.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/network.c' object='src/src_connmand-network.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-network.o `test -f 'src/network.c' || echo '$(srcdir)/'`src/network.c
+
+src/src_connmand-network.obj: src/network.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-network.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-network.Tpo -c -o src/src_connmand-network.obj `if test -f 'src/network.c'; then $(CYGPATH_W) 'src/network.c'; else $(CYGPATH_W) '$(srcdir)/src/network.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-network.Tpo src/$(DEPDIR)/src_connmand-network.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/network.c' object='src/src_connmand-network.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-network.obj `if test -f 'src/network.c'; then $(CYGPATH_W) 'src/network.c'; else $(CYGPATH_W) '$(srcdir)/src/network.c'; fi`
+
+src/src_connmand-connection.o: src/connection.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-connection.o -MD -MP -MF src/$(DEPDIR)/src_connmand-connection.Tpo -c -o src/src_connmand-connection.o `test -f 'src/connection.c' || echo '$(srcdir)/'`src/connection.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-connection.Tpo src/$(DEPDIR)/src_connmand-connection.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/connection.c' object='src/src_connmand-connection.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-connection.o `test -f 'src/connection.c' || echo '$(srcdir)/'`src/connection.c
+
+src/src_connmand-connection.obj: src/connection.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-connection.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-connection.Tpo -c -o src/src_connmand-connection.obj `if test -f 'src/connection.c'; then $(CYGPATH_W) 'src/connection.c'; else $(CYGPATH_W) '$(srcdir)/src/connection.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-connection.Tpo src/$(DEPDIR)/src_connmand-connection.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/connection.c' object='src/src_connmand-connection.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-connection.obj `if test -f 'src/connection.c'; then $(CYGPATH_W) 'src/connection.c'; else $(CYGPATH_W) '$(srcdir)/src/connection.c'; fi`
+
+src/src_connmand-manager.o: src/manager.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-manager.o -MD -MP -MF src/$(DEPDIR)/src_connmand-manager.Tpo -c -o src/src_connmand-manager.o `test -f 'src/manager.c' || echo '$(srcdir)/'`src/manager.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-manager.Tpo src/$(DEPDIR)/src_connmand-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/manager.c' object='src/src_connmand-manager.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-manager.o `test -f 'src/manager.c' || echo '$(srcdir)/'`src/manager.c
+
+src/src_connmand-manager.obj: src/manager.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-manager.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-manager.Tpo -c -o src/src_connmand-manager.obj `if test -f 'src/manager.c'; then $(CYGPATH_W) 'src/manager.c'; else $(CYGPATH_W) '$(srcdir)/src/manager.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-manager.Tpo src/$(DEPDIR)/src_connmand-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/manager.c' object='src/src_connmand-manager.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-manager.obj `if test -f 'src/manager.c'; then $(CYGPATH_W) 'src/manager.c'; else $(CYGPATH_W) '$(srcdir)/src/manager.c'; fi`
+
+src/src_connmand-service.o: src/service.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-service.o -MD -MP -MF src/$(DEPDIR)/src_connmand-service.Tpo -c -o src/src_connmand-service.o `test -f 'src/service.c' || echo '$(srcdir)/'`src/service.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-service.Tpo src/$(DEPDIR)/src_connmand-service.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/service.c' object='src/src_connmand-service.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-service.o `test -f 'src/service.c' || echo '$(srcdir)/'`src/service.c
+
+src/src_connmand-service.obj: src/service.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-service.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-service.Tpo -c -o src/src_connmand-service.obj `if test -f 'src/service.c'; then $(CYGPATH_W) 'src/service.c'; else $(CYGPATH_W) '$(srcdir)/src/service.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-service.Tpo src/$(DEPDIR)/src_connmand-service.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/service.c' object='src/src_connmand-service.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-service.obj `if test -f 'src/service.c'; then $(CYGPATH_W) 'src/service.c'; else $(CYGPATH_W) '$(srcdir)/src/service.c'; fi`
+
+src/src_connmand-clock.o: src/clock.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-clock.o -MD -MP -MF src/$(DEPDIR)/src_connmand-clock.Tpo -c -o src/src_connmand-clock.o `test -f 'src/clock.c' || echo '$(srcdir)/'`src/clock.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-clock.Tpo src/$(DEPDIR)/src_connmand-clock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/clock.c' object='src/src_connmand-clock.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-clock.o `test -f 'src/clock.c' || echo '$(srcdir)/'`src/clock.c
+
+src/src_connmand-clock.obj: src/clock.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-clock.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-clock.Tpo -c -o src/src_connmand-clock.obj `if test -f 'src/clock.c'; then $(CYGPATH_W) 'src/clock.c'; else $(CYGPATH_W) '$(srcdir)/src/clock.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-clock.Tpo src/$(DEPDIR)/src_connmand-clock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/clock.c' object='src/src_connmand-clock.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-clock.obj `if test -f 'src/clock.c'; then $(CYGPATH_W) 'src/clock.c'; else $(CYGPATH_W) '$(srcdir)/src/clock.c'; fi`
+
+src/src_connmand-timezone.o: src/timezone.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-timezone.o -MD -MP -MF src/$(DEPDIR)/src_connmand-timezone.Tpo -c -o src/src_connmand-timezone.o `test -f 'src/timezone.c' || echo '$(srcdir)/'`src/timezone.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-timezone.Tpo src/$(DEPDIR)/src_connmand-timezone.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/timezone.c' object='src/src_connmand-timezone.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-timezone.o `test -f 'src/timezone.c' || echo '$(srcdir)/'`src/timezone.c
+
+src/src_connmand-timezone.obj: src/timezone.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-timezone.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-timezone.Tpo -c -o src/src_connmand-timezone.obj `if test -f 'src/timezone.c'; then $(CYGPATH_W) 'src/timezone.c'; else $(CYGPATH_W) '$(srcdir)/src/timezone.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-timezone.Tpo src/$(DEPDIR)/src_connmand-timezone.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/timezone.c' object='src/src_connmand-timezone.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-timezone.obj `if test -f 'src/timezone.c'; then $(CYGPATH_W) 'src/timezone.c'; else $(CYGPATH_W) '$(srcdir)/src/timezone.c'; fi`
+
+src/src_connmand-agent-connman.o: src/agent-connman.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-agent-connman.o -MD -MP -MF src/$(DEPDIR)/src_connmand-agent-connman.Tpo -c -o src/src_connmand-agent-connman.o `test -f 'src/agent-connman.c' || echo '$(srcdir)/'`src/agent-connman.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-agent-connman.Tpo src/$(DEPDIR)/src_connmand-agent-connman.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/agent-connman.c' object='src/src_connmand-agent-connman.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-agent-connman.o `test -f 'src/agent-connman.c' || echo '$(srcdir)/'`src/agent-connman.c
+
+src/src_connmand-agent-connman.obj: src/agent-connman.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-agent-connman.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-agent-connman.Tpo -c -o src/src_connmand-agent-connman.obj `if test -f 'src/agent-connman.c'; then $(CYGPATH_W) 'src/agent-connman.c'; else $(CYGPATH_W) '$(srcdir)/src/agent-connman.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-agent-connman.Tpo src/$(DEPDIR)/src_connmand-agent-connman.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/agent-connman.c' object='src/src_connmand-agent-connman.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-agent-connman.obj `if test -f 'src/agent-connman.c'; then $(CYGPATH_W) 'src/agent-connman.c'; else $(CYGPATH_W) '$(srcdir)/src/agent-connman.c'; fi`
+
+src/src_connmand-agent.o: src/agent.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-agent.o -MD -MP -MF src/$(DEPDIR)/src_connmand-agent.Tpo -c -o src/src_connmand-agent.o `test -f 'src/agent.c' || echo '$(srcdir)/'`src/agent.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-agent.Tpo src/$(DEPDIR)/src_connmand-agent.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/agent.c' object='src/src_connmand-agent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-agent.o `test -f 'src/agent.c' || echo '$(srcdir)/'`src/agent.c
+
+src/src_connmand-agent.obj: src/agent.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-agent.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-agent.Tpo -c -o src/src_connmand-agent.obj `if test -f 'src/agent.c'; then $(CYGPATH_W) 'src/agent.c'; else $(CYGPATH_W) '$(srcdir)/src/agent.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-agent.Tpo src/$(DEPDIR)/src_connmand-agent.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/agent.c' object='src/src_connmand-agent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-agent.obj `if test -f 'src/agent.c'; then $(CYGPATH_W) 'src/agent.c'; else $(CYGPATH_W) '$(srcdir)/src/agent.c'; fi`
+
+src/src_connmand-notifier.o: src/notifier.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-notifier.o -MD -MP -MF src/$(DEPDIR)/src_connmand-notifier.Tpo -c -o src/src_connmand-notifier.o `test -f 'src/notifier.c' || echo '$(srcdir)/'`src/notifier.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-notifier.Tpo src/$(DEPDIR)/src_connmand-notifier.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/notifier.c' object='src/src_connmand-notifier.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-notifier.o `test -f 'src/notifier.c' || echo '$(srcdir)/'`src/notifier.c
+
+src/src_connmand-notifier.obj: src/notifier.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-notifier.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-notifier.Tpo -c -o src/src_connmand-notifier.obj `if test -f 'src/notifier.c'; then $(CYGPATH_W) 'src/notifier.c'; else $(CYGPATH_W) '$(srcdir)/src/notifier.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-notifier.Tpo src/$(DEPDIR)/src_connmand-notifier.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/notifier.c' object='src/src_connmand-notifier.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-notifier.obj `if test -f 'src/notifier.c'; then $(CYGPATH_W) 'src/notifier.c'; else $(CYGPATH_W) '$(srcdir)/src/notifier.c'; fi`
+
+src/src_connmand-provider.o: src/provider.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-provider.o -MD -MP -MF src/$(DEPDIR)/src_connmand-provider.Tpo -c -o src/src_connmand-provider.o `test -f 'src/provider.c' || echo '$(srcdir)/'`src/provider.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-provider.Tpo src/$(DEPDIR)/src_connmand-provider.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/provider.c' object='src/src_connmand-provider.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-provider.o `test -f 'src/provider.c' || echo '$(srcdir)/'`src/provider.c
+
+src/src_connmand-provider.obj: src/provider.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-provider.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-provider.Tpo -c -o src/src_connmand-provider.obj `if test -f 'src/provider.c'; then $(CYGPATH_W) 'src/provider.c'; else $(CYGPATH_W) '$(srcdir)/src/provider.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-provider.Tpo src/$(DEPDIR)/src_connmand-provider.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/provider.c' object='src/src_connmand-provider.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-provider.obj `if test -f 'src/provider.c'; then $(CYGPATH_W) 'src/provider.c'; else $(CYGPATH_W) '$(srcdir)/src/provider.c'; fi`
+
+src/src_connmand-resolver.o: src/resolver.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-resolver.o -MD -MP -MF src/$(DEPDIR)/src_connmand-resolver.Tpo -c -o src/src_connmand-resolver.o `test -f 'src/resolver.c' || echo '$(srcdir)/'`src/resolver.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-resolver.Tpo src/$(DEPDIR)/src_connmand-resolver.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/resolver.c' object='src/src_connmand-resolver.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-resolver.o `test -f 'src/resolver.c' || echo '$(srcdir)/'`src/resolver.c
+
+src/src_connmand-resolver.obj: src/resolver.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-resolver.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-resolver.Tpo -c -o src/src_connmand-resolver.obj `if test -f 'src/resolver.c'; then $(CYGPATH_W) 'src/resolver.c'; else $(CYGPATH_W) '$(srcdir)/src/resolver.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-resolver.Tpo src/$(DEPDIR)/src_connmand-resolver.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/resolver.c' object='src/src_connmand-resolver.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-resolver.obj `if test -f 'src/resolver.c'; then $(CYGPATH_W) 'src/resolver.c'; else $(CYGPATH_W) '$(srcdir)/src/resolver.c'; fi`
+
+src/src_connmand-ipconfig.o: src/ipconfig.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ipconfig.o -MD -MP -MF src/$(DEPDIR)/src_connmand-ipconfig.Tpo -c -o src/src_connmand-ipconfig.o `test -f 'src/ipconfig.c' || echo '$(srcdir)/'`src/ipconfig.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ipconfig.Tpo src/$(DEPDIR)/src_connmand-ipconfig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipconfig.c' object='src/src_connmand-ipconfig.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ipconfig.o `test -f 'src/ipconfig.c' || echo '$(srcdir)/'`src/ipconfig.c
+
+src/src_connmand-ipconfig.obj: src/ipconfig.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ipconfig.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-ipconfig.Tpo -c -o src/src_connmand-ipconfig.obj `if test -f 'src/ipconfig.c'; then $(CYGPATH_W) 'src/ipconfig.c'; else $(CYGPATH_W) '$(srcdir)/src/ipconfig.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ipconfig.Tpo src/$(DEPDIR)/src_connmand-ipconfig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipconfig.c' object='src/src_connmand-ipconfig.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ipconfig.obj `if test -f 'src/ipconfig.c'; then $(CYGPATH_W) 'src/ipconfig.c'; else $(CYGPATH_W) '$(srcdir)/src/ipconfig.c'; fi`
+
+src/src_connmand-detect.o: src/detect.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-detect.o -MD -MP -MF src/$(DEPDIR)/src_connmand-detect.Tpo -c -o src/src_connmand-detect.o `test -f 'src/detect.c' || echo '$(srcdir)/'`src/detect.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-detect.Tpo src/$(DEPDIR)/src_connmand-detect.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/detect.c' object='src/src_connmand-detect.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-detect.o `test -f 'src/detect.c' || echo '$(srcdir)/'`src/detect.c
+
+src/src_connmand-detect.obj: src/detect.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-detect.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-detect.Tpo -c -o src/src_connmand-detect.obj `if test -f 'src/detect.c'; then $(CYGPATH_W) 'src/detect.c'; else $(CYGPATH_W) '$(srcdir)/src/detect.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-detect.Tpo src/$(DEPDIR)/src_connmand-detect.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/detect.c' object='src/src_connmand-detect.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-detect.obj `if test -f 'src/detect.c'; then $(CYGPATH_W) 'src/detect.c'; else $(CYGPATH_W) '$(srcdir)/src/detect.c'; fi`
+
+src/src_connmand-inet.o: src/inet.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-inet.o -MD -MP -MF src/$(DEPDIR)/src_connmand-inet.Tpo -c -o src/src_connmand-inet.o `test -f 'src/inet.c' || echo '$(srcdir)/'`src/inet.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-inet.Tpo src/$(DEPDIR)/src_connmand-inet.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inet.c' object='src/src_connmand-inet.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-inet.o `test -f 'src/inet.c' || echo '$(srcdir)/'`src/inet.c
+
+src/src_connmand-inet.obj: src/inet.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-inet.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-inet.Tpo -c -o src/src_connmand-inet.obj `if test -f 'src/inet.c'; then $(CYGPATH_W) 'src/inet.c'; else $(CYGPATH_W) '$(srcdir)/src/inet.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-inet.Tpo src/$(DEPDIR)/src_connmand-inet.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inet.c' object='src/src_connmand-inet.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-inet.obj `if test -f 'src/inet.c'; then $(CYGPATH_W) 'src/inet.c'; else $(CYGPATH_W) '$(srcdir)/src/inet.c'; fi`
+
+src/src_connmand-dhcp.o: src/dhcp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dhcp.o -MD -MP -MF src/$(DEPDIR)/src_connmand-dhcp.Tpo -c -o src/src_connmand-dhcp.o `test -f 'src/dhcp.c' || echo '$(srcdir)/'`src/dhcp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dhcp.Tpo src/$(DEPDIR)/src_connmand-dhcp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dhcp.c' object='src/src_connmand-dhcp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dhcp.o `test -f 'src/dhcp.c' || echo '$(srcdir)/'`src/dhcp.c
+
+src/src_connmand-dhcp.obj: src/dhcp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dhcp.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-dhcp.Tpo -c -o src/src_connmand-dhcp.obj `if test -f 'src/dhcp.c'; then $(CYGPATH_W) 'src/dhcp.c'; else $(CYGPATH_W) '$(srcdir)/src/dhcp.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dhcp.Tpo src/$(DEPDIR)/src_connmand-dhcp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dhcp.c' object='src/src_connmand-dhcp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dhcp.obj `if test -f 'src/dhcp.c'; then $(CYGPATH_W) 'src/dhcp.c'; else $(CYGPATH_W) '$(srcdir)/src/dhcp.c'; fi`
+
+src/src_connmand-dhcpv6.o: src/dhcpv6.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dhcpv6.o -MD -MP -MF src/$(DEPDIR)/src_connmand-dhcpv6.Tpo -c -o src/src_connmand-dhcpv6.o `test -f 'src/dhcpv6.c' || echo '$(srcdir)/'`src/dhcpv6.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dhcpv6.Tpo src/$(DEPDIR)/src_connmand-dhcpv6.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dhcpv6.c' object='src/src_connmand-dhcpv6.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dhcpv6.o `test -f 'src/dhcpv6.c' || echo '$(srcdir)/'`src/dhcpv6.c
+
+src/src_connmand-dhcpv6.obj: src/dhcpv6.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dhcpv6.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-dhcpv6.Tpo -c -o src/src_connmand-dhcpv6.obj `if test -f 'src/dhcpv6.c'; then $(CYGPATH_W) 'src/dhcpv6.c'; else $(CYGPATH_W) '$(srcdir)/src/dhcpv6.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dhcpv6.Tpo src/$(DEPDIR)/src_connmand-dhcpv6.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dhcpv6.c' object='src/src_connmand-dhcpv6.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dhcpv6.obj `if test -f 'src/dhcpv6.c'; then $(CYGPATH_W) 'src/dhcpv6.c'; else $(CYGPATH_W) '$(srcdir)/src/dhcpv6.c'; fi`
+
+src/src_connmand-rtnl.o: src/rtnl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-rtnl.o -MD -MP -MF src/$(DEPDIR)/src_connmand-rtnl.Tpo -c -o src/src_connmand-rtnl.o `test -f 'src/rtnl.c' || echo '$(srcdir)/'`src/rtnl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-rtnl.Tpo src/$(DEPDIR)/src_connmand-rtnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/rtnl.c' object='src/src_connmand-rtnl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-rtnl.o `test -f 'src/rtnl.c' || echo '$(srcdir)/'`src/rtnl.c
+
+src/src_connmand-rtnl.obj: src/rtnl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-rtnl.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-rtnl.Tpo -c -o src/src_connmand-rtnl.obj `if test -f 'src/rtnl.c'; then $(CYGPATH_W) 'src/rtnl.c'; else $(CYGPATH_W) '$(srcdir)/src/rtnl.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-rtnl.Tpo src/$(DEPDIR)/src_connmand-rtnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/rtnl.c' object='src/src_connmand-rtnl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-rtnl.obj `if test -f 'src/rtnl.c'; then $(CYGPATH_W) 'src/rtnl.c'; else $(CYGPATH_W) '$(srcdir)/src/rtnl.c'; fi`
+
+src/src_connmand-proxy.o: src/proxy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-proxy.o -MD -MP -MF src/$(DEPDIR)/src_connmand-proxy.Tpo -c -o src/src_connmand-proxy.o `test -f 'src/proxy.c' || echo '$(srcdir)/'`src/proxy.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-proxy.Tpo src/$(DEPDIR)/src_connmand-proxy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/proxy.c' object='src/src_connmand-proxy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-proxy.o `test -f 'src/proxy.c' || echo '$(srcdir)/'`src/proxy.c
+
+src/src_connmand-proxy.obj: src/proxy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-proxy.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-proxy.Tpo -c -o src/src_connmand-proxy.obj `if test -f 'src/proxy.c'; then $(CYGPATH_W) 'src/proxy.c'; else $(CYGPATH_W) '$(srcdir)/src/proxy.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-proxy.Tpo src/$(DEPDIR)/src_connmand-proxy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/proxy.c' object='src/src_connmand-proxy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-proxy.obj `if test -f 'src/proxy.c'; then $(CYGPATH_W) 'src/proxy.c'; else $(CYGPATH_W) '$(srcdir)/src/proxy.c'; fi`
+
+src/src_connmand-utsname.o: src/utsname.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-utsname.o -MD -MP -MF src/$(DEPDIR)/src_connmand-utsname.Tpo -c -o src/src_connmand-utsname.o `test -f 'src/utsname.c' || echo '$(srcdir)/'`src/utsname.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-utsname.Tpo src/$(DEPDIR)/src_connmand-utsname.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/utsname.c' object='src/src_connmand-utsname.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-utsname.o `test -f 'src/utsname.c' || echo '$(srcdir)/'`src/utsname.c
+
+src/src_connmand-utsname.obj: src/utsname.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-utsname.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-utsname.Tpo -c -o src/src_connmand-utsname.obj `if test -f 'src/utsname.c'; then $(CYGPATH_W) 'src/utsname.c'; else $(CYGPATH_W) '$(srcdir)/src/utsname.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-utsname.Tpo src/$(DEPDIR)/src_connmand-utsname.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/utsname.c' object='src/src_connmand-utsname.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-utsname.obj `if test -f 'src/utsname.c'; then $(CYGPATH_W) 'src/utsname.c'; else $(CYGPATH_W) '$(srcdir)/src/utsname.c'; fi`
+
+src/src_connmand-timeserver.o: src/timeserver.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-timeserver.o -MD -MP -MF src/$(DEPDIR)/src_connmand-timeserver.Tpo -c -o src/src_connmand-timeserver.o `test -f 'src/timeserver.c' || echo '$(srcdir)/'`src/timeserver.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-timeserver.Tpo src/$(DEPDIR)/src_connmand-timeserver.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/timeserver.c' object='src/src_connmand-timeserver.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-timeserver.o `test -f 'src/timeserver.c' || echo '$(srcdir)/'`src/timeserver.c
+
+src/src_connmand-timeserver.obj: src/timeserver.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-timeserver.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-timeserver.Tpo -c -o src/src_connmand-timeserver.obj `if test -f 'src/timeserver.c'; then $(CYGPATH_W) 'src/timeserver.c'; else $(CYGPATH_W) '$(srcdir)/src/timeserver.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-timeserver.Tpo src/$(DEPDIR)/src_connmand-timeserver.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/timeserver.c' object='src/src_connmand-timeserver.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-timeserver.obj `if test -f 'src/timeserver.c'; then $(CYGPATH_W) 'src/timeserver.c'; else $(CYGPATH_W) '$(srcdir)/src/timeserver.c'; fi`
+
+src/src_connmand-rfkill.o: src/rfkill.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-rfkill.o -MD -MP -MF src/$(DEPDIR)/src_connmand-rfkill.Tpo -c -o src/src_connmand-rfkill.o `test -f 'src/rfkill.c' || echo '$(srcdir)/'`src/rfkill.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-rfkill.Tpo src/$(DEPDIR)/src_connmand-rfkill.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/rfkill.c' object='src/src_connmand-rfkill.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-rfkill.o `test -f 'src/rfkill.c' || echo '$(srcdir)/'`src/rfkill.c
+
+src/src_connmand-rfkill.obj: src/rfkill.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-rfkill.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-rfkill.Tpo -c -o src/src_connmand-rfkill.obj `if test -f 'src/rfkill.c'; then $(CYGPATH_W) 'src/rfkill.c'; else $(CYGPATH_W) '$(srcdir)/src/rfkill.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-rfkill.Tpo src/$(DEPDIR)/src_connmand-rfkill.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/rfkill.c' object='src/src_connmand-rfkill.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-rfkill.obj `if test -f 'src/rfkill.c'; then $(CYGPATH_W) 'src/rfkill.c'; else $(CYGPATH_W) '$(srcdir)/src/rfkill.c'; fi`
+
+src/src_connmand-storage.o: src/storage.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-storage.o -MD -MP -MF src/$(DEPDIR)/src_connmand-storage.Tpo -c -o src/src_connmand-storage.o `test -f 'src/storage.c' || echo '$(srcdir)/'`src/storage.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-storage.Tpo src/$(DEPDIR)/src_connmand-storage.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/storage.c' object='src/src_connmand-storage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-storage.o `test -f 'src/storage.c' || echo '$(srcdir)/'`src/storage.c
+
+src/src_connmand-storage.obj: src/storage.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-storage.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-storage.Tpo -c -o src/src_connmand-storage.obj `if test -f 'src/storage.c'; then $(CYGPATH_W) 'src/storage.c'; else $(CYGPATH_W) '$(srcdir)/src/storage.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-storage.Tpo src/$(DEPDIR)/src_connmand-storage.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/storage.c' object='src/src_connmand-storage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-storage.obj `if test -f 'src/storage.c'; then $(CYGPATH_W) 'src/storage.c'; else $(CYGPATH_W) '$(srcdir)/src/storage.c'; fi`
+
+src/src_connmand-dbus.o: src/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dbus.o -MD -MP -MF src/$(DEPDIR)/src_connmand-dbus.Tpo -c -o src/src_connmand-dbus.o `test -f 'src/dbus.c' || echo '$(srcdir)/'`src/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dbus.Tpo src/$(DEPDIR)/src_connmand-dbus.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dbus.c' object='src/src_connmand-dbus.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dbus.o `test -f 'src/dbus.c' || echo '$(srcdir)/'`src/dbus.c
+
+src/src_connmand-dbus.obj: src/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dbus.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-dbus.Tpo -c -o src/src_connmand-dbus.obj `if test -f 'src/dbus.c'; then $(CYGPATH_W) 'src/dbus.c'; else $(CYGPATH_W) '$(srcdir)/src/dbus.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dbus.Tpo src/$(DEPDIR)/src_connmand-dbus.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dbus.c' object='src/src_connmand-dbus.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dbus.obj `if test -f 'src/dbus.c'; then $(CYGPATH_W) 'src/dbus.c'; else $(CYGPATH_W) '$(srcdir)/src/dbus.c'; fi`
+
+src/src_connmand-config.o: src/config.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-config.o -MD -MP -MF src/$(DEPDIR)/src_connmand-config.Tpo -c -o src/src_connmand-config.o `test -f 'src/config.c' || echo '$(srcdir)/'`src/config.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-config.Tpo src/$(DEPDIR)/src_connmand-config.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/config.c' object='src/src_connmand-config.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-config.o `test -f 'src/config.c' || echo '$(srcdir)/'`src/config.c
+
+src/src_connmand-config.obj: src/config.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-config.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-config.Tpo -c -o src/src_connmand-config.obj `if test -f 'src/config.c'; then $(CYGPATH_W) 'src/config.c'; else $(CYGPATH_W) '$(srcdir)/src/config.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-config.Tpo src/$(DEPDIR)/src_connmand-config.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/config.c' object='src/src_connmand-config.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-config.obj `if test -f 'src/config.c'; then $(CYGPATH_W) 'src/config.c'; else $(CYGPATH_W) '$(srcdir)/src/config.c'; fi`
+
+src/src_connmand-technology.o: src/technology.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-technology.o -MD -MP -MF src/$(DEPDIR)/src_connmand-technology.Tpo -c -o src/src_connmand-technology.o `test -f 'src/technology.c' || echo '$(srcdir)/'`src/technology.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-technology.Tpo src/$(DEPDIR)/src_connmand-technology.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/technology.c' object='src/src_connmand-technology.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-technology.o `test -f 'src/technology.c' || echo '$(srcdir)/'`src/technology.c
+
+src/src_connmand-technology.obj: src/technology.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-technology.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-technology.Tpo -c -o src/src_connmand-technology.obj `if test -f 'src/technology.c'; then $(CYGPATH_W) 'src/technology.c'; else $(CYGPATH_W) '$(srcdir)/src/technology.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-technology.Tpo src/$(DEPDIR)/src_connmand-technology.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/technology.c' object='src/src_connmand-technology.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-technology.obj `if test -f 'src/technology.c'; then $(CYGPATH_W) 'src/technology.c'; else $(CYGPATH_W) '$(srcdir)/src/technology.c'; fi`
+
+src/src_connmand-counter.o: src/counter.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-counter.o -MD -MP -MF src/$(DEPDIR)/src_connmand-counter.Tpo -c -o src/src_connmand-counter.o `test -f 'src/counter.c' || echo '$(srcdir)/'`src/counter.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-counter.Tpo src/$(DEPDIR)/src_connmand-counter.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/counter.c' object='src/src_connmand-counter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-counter.o `test -f 'src/counter.c' || echo '$(srcdir)/'`src/counter.c
+
+src/src_connmand-counter.obj: src/counter.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-counter.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-counter.Tpo -c -o src/src_connmand-counter.obj `if test -f 'src/counter.c'; then $(CYGPATH_W) 'src/counter.c'; else $(CYGPATH_W) '$(srcdir)/src/counter.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-counter.Tpo src/$(DEPDIR)/src_connmand-counter.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/counter.c' object='src/src_connmand-counter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-counter.obj `if test -f 'src/counter.c'; then $(CYGPATH_W) 'src/counter.c'; else $(CYGPATH_W) '$(srcdir)/src/counter.c'; fi`
+
+src/src_connmand-ntp.o: src/ntp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ntp.o -MD -MP -MF src/$(DEPDIR)/src_connmand-ntp.Tpo -c -o src/src_connmand-ntp.o `test -f 'src/ntp.c' || echo '$(srcdir)/'`src/ntp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ntp.Tpo src/$(DEPDIR)/src_connmand-ntp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ntp.c' object='src/src_connmand-ntp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ntp.o `test -f 'src/ntp.c' || echo '$(srcdir)/'`src/ntp.c
+
+src/src_connmand-ntp.obj: src/ntp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ntp.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-ntp.Tpo -c -o src/src_connmand-ntp.obj `if test -f 'src/ntp.c'; then $(CYGPATH_W) 'src/ntp.c'; else $(CYGPATH_W) '$(srcdir)/src/ntp.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ntp.Tpo src/$(DEPDIR)/src_connmand-ntp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ntp.c' object='src/src_connmand-ntp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ntp.obj `if test -f 'src/ntp.c'; then $(CYGPATH_W) 'src/ntp.c'; else $(CYGPATH_W) '$(srcdir)/src/ntp.c'; fi`
+
+src/src_connmand-session.o: src/session.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-session.o -MD -MP -MF src/$(DEPDIR)/src_connmand-session.Tpo -c -o src/src_connmand-session.o `test -f 'src/session.c' || echo '$(srcdir)/'`src/session.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-session.Tpo src/$(DEPDIR)/src_connmand-session.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/session.c' object='src/src_connmand-session.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-session.o `test -f 'src/session.c' || echo '$(srcdir)/'`src/session.c
+
+src/src_connmand-session.obj: src/session.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-session.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-session.Tpo -c -o src/src_connmand-session.obj `if test -f 'src/session.c'; then $(CYGPATH_W) 'src/session.c'; else $(CYGPATH_W) '$(srcdir)/src/session.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-session.Tpo src/$(DEPDIR)/src_connmand-session.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/session.c' object='src/src_connmand-session.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-session.obj `if test -f 'src/session.c'; then $(CYGPATH_W) 'src/session.c'; else $(CYGPATH_W) '$(srcdir)/src/session.c'; fi`
+
+src/src_connmand-tethering.o: src/tethering.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-tethering.o -MD -MP -MF src/$(DEPDIR)/src_connmand-tethering.Tpo -c -o src/src_connmand-tethering.o `test -f 'src/tethering.c' || echo '$(srcdir)/'`src/tethering.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-tethering.Tpo src/$(DEPDIR)/src_connmand-tethering.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/tethering.c' object='src/src_connmand-tethering.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-tethering.o `test -f 'src/tethering.c' || echo '$(srcdir)/'`src/tethering.c
+
+src/src_connmand-tethering.obj: src/tethering.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-tethering.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-tethering.Tpo -c -o src/src_connmand-tethering.obj `if test -f 'src/tethering.c'; then $(CYGPATH_W) 'src/tethering.c'; else $(CYGPATH_W) '$(srcdir)/src/tethering.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-tethering.Tpo src/$(DEPDIR)/src_connmand-tethering.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/tethering.c' object='src/src_connmand-tethering.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-tethering.obj `if test -f 'src/tethering.c'; then $(CYGPATH_W) 'src/tethering.c'; else $(CYGPATH_W) '$(srcdir)/src/tethering.c'; fi`
+
+src/src_connmand-wpad.o: src/wpad.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-wpad.o -MD -MP -MF src/$(DEPDIR)/src_connmand-wpad.Tpo -c -o src/src_connmand-wpad.o `test -f 'src/wpad.c' || echo '$(srcdir)/'`src/wpad.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-wpad.Tpo src/$(DEPDIR)/src_connmand-wpad.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/wpad.c' object='src/src_connmand-wpad.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-wpad.o `test -f 'src/wpad.c' || echo '$(srcdir)/'`src/wpad.c
+
+src/src_connmand-wpad.obj: src/wpad.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-wpad.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-wpad.Tpo -c -o src/src_connmand-wpad.obj `if test -f 'src/wpad.c'; then $(CYGPATH_W) 'src/wpad.c'; else $(CYGPATH_W) '$(srcdir)/src/wpad.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-wpad.Tpo src/$(DEPDIR)/src_connmand-wpad.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/wpad.c' object='src/src_connmand-wpad.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-wpad.obj `if test -f 'src/wpad.c'; then $(CYGPATH_W) 'src/wpad.c'; else $(CYGPATH_W) '$(srcdir)/src/wpad.c'; fi`
+
+src/src_connmand-wispr.o: src/wispr.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-wispr.o -MD -MP -MF src/$(DEPDIR)/src_connmand-wispr.Tpo -c -o src/src_connmand-wispr.o `test -f 'src/wispr.c' || echo '$(srcdir)/'`src/wispr.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-wispr.Tpo src/$(DEPDIR)/src_connmand-wispr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/wispr.c' object='src/src_connmand-wispr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-wispr.o `test -f 'src/wispr.c' || echo '$(srcdir)/'`src/wispr.c
+
+src/src_connmand-wispr.obj: src/wispr.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-wispr.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-wispr.Tpo -c -o src/src_connmand-wispr.obj `if test -f 'src/wispr.c'; then $(CYGPATH_W) 'src/wispr.c'; else $(CYGPATH_W) '$(srcdir)/src/wispr.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-wispr.Tpo src/$(DEPDIR)/src_connmand-wispr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/wispr.c' object='src/src_connmand-wispr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-wispr.obj `if test -f 'src/wispr.c'; then $(CYGPATH_W) 'src/wispr.c'; else $(CYGPATH_W) '$(srcdir)/src/wispr.c'; fi`
+
+src/src_connmand-stats.o: src/stats.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-stats.o -MD -MP -MF src/$(DEPDIR)/src_connmand-stats.Tpo -c -o src/src_connmand-stats.o `test -f 'src/stats.c' || echo '$(srcdir)/'`src/stats.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-stats.Tpo src/$(DEPDIR)/src_connmand-stats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/stats.c' object='src/src_connmand-stats.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-stats.o `test -f 'src/stats.c' || echo '$(srcdir)/'`src/stats.c
+
+src/src_connmand-stats.obj: src/stats.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-stats.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-stats.Tpo -c -o src/src_connmand-stats.obj `if test -f 'src/stats.c'; then $(CYGPATH_W) 'src/stats.c'; else $(CYGPATH_W) '$(srcdir)/src/stats.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-stats.Tpo src/$(DEPDIR)/src_connmand-stats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/stats.c' object='src/src_connmand-stats.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-stats.obj `if test -f 'src/stats.c'; then $(CYGPATH_W) 'src/stats.c'; else $(CYGPATH_W) '$(srcdir)/src/stats.c'; fi`
+
+src/src_connmand-iptables.o: src/iptables.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-iptables.o -MD -MP -MF src/$(DEPDIR)/src_connmand-iptables.Tpo -c -o src/src_connmand-iptables.o `test -f 'src/iptables.c' || echo '$(srcdir)/'`src/iptables.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-iptables.Tpo src/$(DEPDIR)/src_connmand-iptables.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/iptables.c' object='src/src_connmand-iptables.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-iptables.o `test -f 'src/iptables.c' || echo '$(srcdir)/'`src/iptables.c
+
+src/src_connmand-iptables.obj: src/iptables.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-iptables.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-iptables.Tpo -c -o src/src_connmand-iptables.obj `if test -f 'src/iptables.c'; then $(CYGPATH_W) 'src/iptables.c'; else $(CYGPATH_W) '$(srcdir)/src/iptables.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-iptables.Tpo src/$(DEPDIR)/src_connmand-iptables.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/iptables.c' object='src/src_connmand-iptables.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-iptables.obj `if test -f 'src/iptables.c'; then $(CYGPATH_W) 'src/iptables.c'; else $(CYGPATH_W) '$(srcdir)/src/iptables.c'; fi`
+
+src/src_connmand-dnsproxy.o: src/dnsproxy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dnsproxy.o -MD -MP -MF src/$(DEPDIR)/src_connmand-dnsproxy.Tpo -c -o src/src_connmand-dnsproxy.o `test -f 'src/dnsproxy.c' || echo '$(srcdir)/'`src/dnsproxy.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dnsproxy.Tpo src/$(DEPDIR)/src_connmand-dnsproxy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dnsproxy.c' object='src/src_connmand-dnsproxy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dnsproxy.o `test -f 'src/dnsproxy.c' || echo '$(srcdir)/'`src/dnsproxy.c
+
+src/src_connmand-dnsproxy.obj: src/dnsproxy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-dnsproxy.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-dnsproxy.Tpo -c -o src/src_connmand-dnsproxy.obj `if test -f 'src/dnsproxy.c'; then $(CYGPATH_W) 'src/dnsproxy.c'; else $(CYGPATH_W) '$(srcdir)/src/dnsproxy.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-dnsproxy.Tpo src/$(DEPDIR)/src_connmand-dnsproxy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dnsproxy.c' object='src/src_connmand-dnsproxy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-dnsproxy.obj `if test -f 'src/dnsproxy.c'; then $(CYGPATH_W) 'src/dnsproxy.c'; else $(CYGPATH_W) '$(srcdir)/src/dnsproxy.c'; fi`
+
+src/src_connmand-6to4.o: src/6to4.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-6to4.o -MD -MP -MF src/$(DEPDIR)/src_connmand-6to4.Tpo -c -o src/src_connmand-6to4.o `test -f 'src/6to4.c' || echo '$(srcdir)/'`src/6to4.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-6to4.Tpo src/$(DEPDIR)/src_connmand-6to4.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/6to4.c' object='src/src_connmand-6to4.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-6to4.o `test -f 'src/6to4.c' || echo '$(srcdir)/'`src/6to4.c
+
+src/src_connmand-6to4.obj: src/6to4.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-6to4.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-6to4.Tpo -c -o src/src_connmand-6to4.obj `if test -f 'src/6to4.c'; then $(CYGPATH_W) 'src/6to4.c'; else $(CYGPATH_W) '$(srcdir)/src/6to4.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-6to4.Tpo src/$(DEPDIR)/src_connmand-6to4.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/6to4.c' object='src/src_connmand-6to4.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-6to4.obj `if test -f 'src/6to4.c'; then $(CYGPATH_W) 'src/6to4.c'; else $(CYGPATH_W) '$(srcdir)/src/6to4.c'; fi`
+
+src/src_connmand-ippool.o: src/ippool.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ippool.o -MD -MP -MF src/$(DEPDIR)/src_connmand-ippool.Tpo -c -o src/src_connmand-ippool.o `test -f 'src/ippool.c' || echo '$(srcdir)/'`src/ippool.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ippool.Tpo src/$(DEPDIR)/src_connmand-ippool.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ippool.c' object='src/src_connmand-ippool.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ippool.o `test -f 'src/ippool.c' || echo '$(srcdir)/'`src/ippool.c
+
+src/src_connmand-ippool.obj: src/ippool.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ippool.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-ippool.Tpo -c -o src/src_connmand-ippool.obj `if test -f 'src/ippool.c'; then $(CYGPATH_W) 'src/ippool.c'; else $(CYGPATH_W) '$(srcdir)/src/ippool.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ippool.Tpo src/$(DEPDIR)/src_connmand-ippool.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ippool.c' object='src/src_connmand-ippool.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ippool.obj `if test -f 'src/ippool.c'; then $(CYGPATH_W) 'src/ippool.c'; else $(CYGPATH_W) '$(srcdir)/src/ippool.c'; fi`
+
+src/src_connmand-bridge.o: src/bridge.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-bridge.o -MD -MP -MF src/$(DEPDIR)/src_connmand-bridge.Tpo -c -o src/src_connmand-bridge.o `test -f 'src/bridge.c' || echo '$(srcdir)/'`src/bridge.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-bridge.Tpo src/$(DEPDIR)/src_connmand-bridge.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/bridge.c' object='src/src_connmand-bridge.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-bridge.o `test -f 'src/bridge.c' || echo '$(srcdir)/'`src/bridge.c
+
+src/src_connmand-bridge.obj: src/bridge.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-bridge.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-bridge.Tpo -c -o src/src_connmand-bridge.obj `if test -f 'src/bridge.c'; then $(CYGPATH_W) 'src/bridge.c'; else $(CYGPATH_W) '$(srcdir)/src/bridge.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-bridge.Tpo src/$(DEPDIR)/src_connmand-bridge.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/bridge.c' object='src/src_connmand-bridge.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-bridge.obj `if test -f 'src/bridge.c'; then $(CYGPATH_W) 'src/bridge.c'; else $(CYGPATH_W) '$(srcdir)/src/bridge.c'; fi`
+
+src/src_connmand-nat.o: src/nat.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-nat.o -MD -MP -MF src/$(DEPDIR)/src_connmand-nat.Tpo -c -o src/src_connmand-nat.o `test -f 'src/nat.c' || echo '$(srcdir)/'`src/nat.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-nat.Tpo src/$(DEPDIR)/src_connmand-nat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/nat.c' object='src/src_connmand-nat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-nat.o `test -f 'src/nat.c' || echo '$(srcdir)/'`src/nat.c
+
+src/src_connmand-nat.obj: src/nat.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-nat.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-nat.Tpo -c -o src/src_connmand-nat.obj `if test -f 'src/nat.c'; then $(CYGPATH_W) 'src/nat.c'; else $(CYGPATH_W) '$(srcdir)/src/nat.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-nat.Tpo src/$(DEPDIR)/src_connmand-nat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/nat.c' object='src/src_connmand-nat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-nat.obj `if test -f 'src/nat.c'; then $(CYGPATH_W) 'src/nat.c'; else $(CYGPATH_W) '$(srcdir)/src/nat.c'; fi`
+
+src/src_connmand-ipaddress.o: src/ipaddress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ipaddress.o -MD -MP -MF src/$(DEPDIR)/src_connmand-ipaddress.Tpo -c -o src/src_connmand-ipaddress.o `test -f 'src/ipaddress.c' || echo '$(srcdir)/'`src/ipaddress.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ipaddress.Tpo src/$(DEPDIR)/src_connmand-ipaddress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipaddress.c' object='src/src_connmand-ipaddress.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ipaddress.o `test -f 'src/ipaddress.c' || echo '$(srcdir)/'`src/ipaddress.c
+
+src/src_connmand-ipaddress.obj: src/ipaddress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ipaddress.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-ipaddress.Tpo -c -o src/src_connmand-ipaddress.obj `if test -f 'src/ipaddress.c'; then $(CYGPATH_W) 'src/ipaddress.c'; else $(CYGPATH_W) '$(srcdir)/src/ipaddress.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ipaddress.Tpo src/$(DEPDIR)/src_connmand-ipaddress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipaddress.c' object='src/src_connmand-ipaddress.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ipaddress.obj `if test -f 'src/ipaddress.c'; then $(CYGPATH_W) 'src/ipaddress.c'; else $(CYGPATH_W) '$(srcdir)/src/ipaddress.c'; fi`
+
+src/src_connmand-inotify.o: src/inotify.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-inotify.o -MD -MP -MF src/$(DEPDIR)/src_connmand-inotify.Tpo -c -o src/src_connmand-inotify.o `test -f 'src/inotify.c' || echo '$(srcdir)/'`src/inotify.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-inotify.Tpo src/$(DEPDIR)/src_connmand-inotify.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inotify.c' object='src/src_connmand-inotify.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-inotify.o `test -f 'src/inotify.c' || echo '$(srcdir)/'`src/inotify.c
+
+src/src_connmand-inotify.obj: src/inotify.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-inotify.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-inotify.Tpo -c -o src/src_connmand-inotify.obj `if test -f 'src/inotify.c'; then $(CYGPATH_W) 'src/inotify.c'; else $(CYGPATH_W) '$(srcdir)/src/inotify.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-inotify.Tpo src/$(DEPDIR)/src_connmand-inotify.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inotify.c' object='src/src_connmand-inotify.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-inotify.obj `if test -f 'src/inotify.c'; then $(CYGPATH_W) 'src/inotify.c'; else $(CYGPATH_W) '$(srcdir)/src/inotify.c'; fi`
+
+src/src_connmand-firewall.o: src/firewall.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-firewall.o -MD -MP -MF src/$(DEPDIR)/src_connmand-firewall.Tpo -c -o src/src_connmand-firewall.o `test -f 'src/firewall.c' || echo '$(srcdir)/'`src/firewall.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-firewall.Tpo src/$(DEPDIR)/src_connmand-firewall.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/firewall.c' object='src/src_connmand-firewall.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-firewall.o `test -f 'src/firewall.c' || echo '$(srcdir)/'`src/firewall.c
+
+src/src_connmand-firewall.obj: src/firewall.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-firewall.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-firewall.Tpo -c -o src/src_connmand-firewall.obj `if test -f 'src/firewall.c'; then $(CYGPATH_W) 'src/firewall.c'; else $(CYGPATH_W) '$(srcdir)/src/firewall.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-firewall.Tpo src/$(DEPDIR)/src_connmand-firewall.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/firewall.c' object='src/src_connmand-firewall.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-firewall.obj `if test -f 'src/firewall.c'; then $(CYGPATH_W) 'src/firewall.c'; else $(CYGPATH_W) '$(srcdir)/src/firewall.c'; fi`
+
+src/src_connmand-ipv6pd.o: src/ipv6pd.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ipv6pd.o -MD -MP -MF src/$(DEPDIR)/src_connmand-ipv6pd.Tpo -c -o src/src_connmand-ipv6pd.o `test -f 'src/ipv6pd.c' || echo '$(srcdir)/'`src/ipv6pd.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ipv6pd.Tpo src/$(DEPDIR)/src_connmand-ipv6pd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipv6pd.c' object='src/src_connmand-ipv6pd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ipv6pd.o `test -f 'src/ipv6pd.c' || echo '$(srcdir)/'`src/ipv6pd.c
+
+src/src_connmand-ipv6pd.obj: src/ipv6pd.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-ipv6pd.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-ipv6pd.Tpo -c -o src/src_connmand-ipv6pd.obj `if test -f 'src/ipv6pd.c'; then $(CYGPATH_W) 'src/ipv6pd.c'; else $(CYGPATH_W) '$(srcdir)/src/ipv6pd.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-ipv6pd.Tpo src/$(DEPDIR)/src_connmand-ipv6pd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipv6pd.c' object='src/src_connmand-ipv6pd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-ipv6pd.obj `if test -f 'src/ipv6pd.c'; then $(CYGPATH_W) 'src/ipv6pd.c'; else $(CYGPATH_W) '$(srcdir)/src/ipv6pd.c'; fi`
+
+src/src_connmand-peer.o: src/peer.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-peer.o -MD -MP -MF src/$(DEPDIR)/src_connmand-peer.Tpo -c -o src/src_connmand-peer.o `test -f 'src/peer.c' || echo '$(srcdir)/'`src/peer.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-peer.Tpo src/$(DEPDIR)/src_connmand-peer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/peer.c' object='src/src_connmand-peer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-peer.o `test -f 'src/peer.c' || echo '$(srcdir)/'`src/peer.c
+
+src/src_connmand-peer.obj: src/peer.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -MT src/src_connmand-peer.obj -MD -MP -MF src/$(DEPDIR)/src_connmand-peer.Tpo -c -o src/src_connmand-peer.obj `if test -f 'src/peer.c'; then $(CYGPATH_W) 'src/peer.c'; else $(CYGPATH_W) '$(srcdir)/src/peer.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/src_connmand-peer.Tpo src/$(DEPDIR)/src_connmand-peer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/peer.c' object='src/src_connmand-peer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_connmand_CFLAGS) $(CFLAGS) -c -o src/src_connmand-peer.obj `if test -f 'src/peer.c'; then $(CYGPATH_W) 'src/peer.c'; else $(CYGPATH_W) '$(srcdir)/src/peer.c'; fi`
+
+src/tools_iptables_unit-log.o: src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-log.o -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-log.Tpo -c -o src/tools_iptables_unit-log.o `test -f 'src/log.c' || echo '$(srcdir)/'`src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-log.Tpo src/$(DEPDIR)/tools_iptables_unit-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/log.c' object='src/tools_iptables_unit-log.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-log.o `test -f 'src/log.c' || echo '$(srcdir)/'`src/log.c
+
+src/tools_iptables_unit-log.obj: src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-log.obj -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-log.Tpo -c -o src/tools_iptables_unit-log.obj `if test -f 'src/log.c'; then $(CYGPATH_W) 'src/log.c'; else $(CYGPATH_W) '$(srcdir)/src/log.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-log.Tpo src/$(DEPDIR)/tools_iptables_unit-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/log.c' object='src/tools_iptables_unit-log.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-log.obj `if test -f 'src/log.c'; then $(CYGPATH_W) 'src/log.c'; else $(CYGPATH_W) '$(srcdir)/src/log.c'; fi`
+
+src/tools_iptables_unit-iptables.o: src/iptables.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-iptables.o -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-iptables.Tpo -c -o src/tools_iptables_unit-iptables.o `test -f 'src/iptables.c' || echo '$(srcdir)/'`src/iptables.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-iptables.Tpo src/$(DEPDIR)/tools_iptables_unit-iptables.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/iptables.c' object='src/tools_iptables_unit-iptables.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-iptables.o `test -f 'src/iptables.c' || echo '$(srcdir)/'`src/iptables.c
+
+src/tools_iptables_unit-iptables.obj: src/iptables.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-iptables.obj -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-iptables.Tpo -c -o src/tools_iptables_unit-iptables.obj `if test -f 'src/iptables.c'; then $(CYGPATH_W) 'src/iptables.c'; else $(CYGPATH_W) '$(srcdir)/src/iptables.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-iptables.Tpo src/$(DEPDIR)/tools_iptables_unit-iptables.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/iptables.c' object='src/tools_iptables_unit-iptables.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-iptables.obj `if test -f 'src/iptables.c'; then $(CYGPATH_W) 'src/iptables.c'; else $(CYGPATH_W) '$(srcdir)/src/iptables.c'; fi`
+
+src/tools_iptables_unit-firewall.o: src/firewall.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-firewall.o -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-firewall.Tpo -c -o src/tools_iptables_unit-firewall.o `test -f 'src/firewall.c' || echo '$(srcdir)/'`src/firewall.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-firewall.Tpo src/$(DEPDIR)/tools_iptables_unit-firewall.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/firewall.c' object='src/tools_iptables_unit-firewall.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-firewall.o `test -f 'src/firewall.c' || echo '$(srcdir)/'`src/firewall.c
+
+src/tools_iptables_unit-firewall.obj: src/firewall.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-firewall.obj -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-firewall.Tpo -c -o src/tools_iptables_unit-firewall.obj `if test -f 'src/firewall.c'; then $(CYGPATH_W) 'src/firewall.c'; else $(CYGPATH_W) '$(srcdir)/src/firewall.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-firewall.Tpo src/$(DEPDIR)/tools_iptables_unit-firewall.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/firewall.c' object='src/tools_iptables_unit-firewall.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-firewall.obj `if test -f 'src/firewall.c'; then $(CYGPATH_W) 'src/firewall.c'; else $(CYGPATH_W) '$(srcdir)/src/firewall.c'; fi`
+
+src/tools_iptables_unit-nat.o: src/nat.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-nat.o -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-nat.Tpo -c -o src/tools_iptables_unit-nat.o `test -f 'src/nat.c' || echo '$(srcdir)/'`src/nat.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-nat.Tpo src/$(DEPDIR)/tools_iptables_unit-nat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/nat.c' object='src/tools_iptables_unit-nat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-nat.o `test -f 'src/nat.c' || echo '$(srcdir)/'`src/nat.c
+
+src/tools_iptables_unit-nat.obj: src/nat.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT src/tools_iptables_unit-nat.obj -MD -MP -MF src/$(DEPDIR)/tools_iptables_unit-nat.Tpo -c -o src/tools_iptables_unit-nat.obj `if test -f 'src/nat.c'; then $(CYGPATH_W) 'src/nat.c'; else $(CYGPATH_W) '$(srcdir)/src/nat.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/tools_iptables_unit-nat.Tpo src/$(DEPDIR)/tools_iptables_unit-nat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/nat.c' object='src/tools_iptables_unit-nat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o src/tools_iptables_unit-nat.obj `if test -f 'src/nat.c'; then $(CYGPATH_W) 'src/nat.c'; else $(CYGPATH_W) '$(srcdir)/src/nat.c'; fi`
+
+tools/tools_iptables_unit-iptables-unit.o: tools/iptables-unit.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT tools/tools_iptables_unit-iptables-unit.o -MD -MP -MF tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Tpo -c -o tools/tools_iptables_unit-iptables-unit.o `test -f 'tools/iptables-unit.c' || echo '$(srcdir)/'`tools/iptables-unit.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Tpo tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tools/iptables-unit.c' object='tools/tools_iptables_unit-iptables-unit.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o tools/tools_iptables_unit-iptables-unit.o `test -f 'tools/iptables-unit.c' || echo '$(srcdir)/'`tools/iptables-unit.c
+
+tools/tools_iptables_unit-iptables-unit.obj: tools/iptables-unit.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -MT tools/tools_iptables_unit-iptables-unit.obj -MD -MP -MF tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Tpo -c -o tools/tools_iptables_unit-iptables-unit.obj `if test -f 'tools/iptables-unit.c'; then $(CYGPATH_W) 'tools/iptables-unit.c'; else $(CYGPATH_W) '$(srcdir)/tools/iptables-unit.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Tpo tools/$(DEPDIR)/tools_iptables_unit-iptables-unit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tools/iptables-unit.c' object='tools/tools_iptables_unit-iptables-unit.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tools_iptables_unit_CFLAGS) $(CFLAGS) -c -o tools/tools_iptables_unit-iptables-unit.obj `if test -f 'tools/iptables-unit.c'; then $(CYGPATH_W) 'tools/iptables-unit.c'; else $(CYGPATH_W) '$(srcdir)/tools/iptables-unit.c'; fi`
+
+vpn/plugins/vpn_connman_vpnd-openconnect.o: vpn/plugins/openconnect.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-openconnect.o -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Tpo -c -o vpn/plugins/vpn_connman_vpnd-openconnect.o `test -f 'vpn/plugins/openconnect.c' || echo '$(srcdir)/'`vpn/plugins/openconnect.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/openconnect.c' object='vpn/plugins/vpn_connman_vpnd-openconnect.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-openconnect.o `test -f 'vpn/plugins/openconnect.c' || echo '$(srcdir)/'`vpn/plugins/openconnect.c
+
+vpn/plugins/vpn_connman_vpnd-openconnect.obj: vpn/plugins/openconnect.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-openconnect.obj -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Tpo -c -o vpn/plugins/vpn_connman_vpnd-openconnect.obj `if test -f 'vpn/plugins/openconnect.c'; then $(CYGPATH_W) 'vpn/plugins/openconnect.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/openconnect.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openconnect.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/openconnect.c' object='vpn/plugins/vpn_connman_vpnd-openconnect.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-openconnect.obj `if test -f 'vpn/plugins/openconnect.c'; then $(CYGPATH_W) 'vpn/plugins/openconnect.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/openconnect.c'; fi`
+
+vpn/plugins/vpn_connman_vpnd-openvpn.o: vpn/plugins/openvpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-openvpn.o -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Tpo -c -o vpn/plugins/vpn_connman_vpnd-openvpn.o `test -f 'vpn/plugins/openvpn.c' || echo '$(srcdir)/'`vpn/plugins/openvpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/openvpn.c' object='vpn/plugins/vpn_connman_vpnd-openvpn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-openvpn.o `test -f 'vpn/plugins/openvpn.c' || echo '$(srcdir)/'`vpn/plugins/openvpn.c
+
+vpn/plugins/vpn_connman_vpnd-openvpn.obj: vpn/plugins/openvpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-openvpn.obj -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Tpo -c -o vpn/plugins/vpn_connman_vpnd-openvpn.obj `if test -f 'vpn/plugins/openvpn.c'; then $(CYGPATH_W) 'vpn/plugins/openvpn.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/openvpn.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-openvpn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/openvpn.c' object='vpn/plugins/vpn_connman_vpnd-openvpn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-openvpn.obj `if test -f 'vpn/plugins/openvpn.c'; then $(CYGPATH_W) 'vpn/plugins/openvpn.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/openvpn.c'; fi`
+
+vpn/plugins/vpn_connman_vpnd-vpnc.o: vpn/plugins/vpnc.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-vpnc.o -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Tpo -c -o vpn/plugins/vpn_connman_vpnd-vpnc.o `test -f 'vpn/plugins/vpnc.c' || echo '$(srcdir)/'`vpn/plugins/vpnc.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpnc.c' object='vpn/plugins/vpn_connman_vpnd-vpnc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-vpnc.o `test -f 'vpn/plugins/vpnc.c' || echo '$(srcdir)/'`vpn/plugins/vpnc.c
+
+vpn/plugins/vpn_connman_vpnd-vpnc.obj: vpn/plugins/vpnc.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-vpnc.obj -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Tpo -c -o vpn/plugins/vpn_connman_vpnd-vpnc.obj `if test -f 'vpn/plugins/vpnc.c'; then $(CYGPATH_W) 'vpn/plugins/vpnc.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/vpnc.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpnc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpnc.c' object='vpn/plugins/vpn_connman_vpnd-vpnc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-vpnc.obj `if test -f 'vpn/plugins/vpnc.c'; then $(CYGPATH_W) 'vpn/plugins/vpnc.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/vpnc.c'; fi`
+
+vpn/plugins/vpn_connman_vpnd-l2tp.o: vpn/plugins/l2tp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-l2tp.o -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Tpo -c -o vpn/plugins/vpn_connman_vpnd-l2tp.o `test -f 'vpn/plugins/l2tp.c' || echo '$(srcdir)/'`vpn/plugins/l2tp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/l2tp.c' object='vpn/plugins/vpn_connman_vpnd-l2tp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-l2tp.o `test -f 'vpn/plugins/l2tp.c' || echo '$(srcdir)/'`vpn/plugins/l2tp.c
+
+vpn/plugins/vpn_connman_vpnd-l2tp.obj: vpn/plugins/l2tp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-l2tp.obj -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Tpo -c -o vpn/plugins/vpn_connman_vpnd-l2tp.obj `if test -f 'vpn/plugins/l2tp.c'; then $(CYGPATH_W) 'vpn/plugins/l2tp.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/l2tp.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-l2tp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/l2tp.c' object='vpn/plugins/vpn_connman_vpnd-l2tp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-l2tp.obj `if test -f 'vpn/plugins/l2tp.c'; then $(CYGPATH_W) 'vpn/plugins/l2tp.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/l2tp.c'; fi`
+
+vpn/plugins/vpn_connman_vpnd-pptp.o: vpn/plugins/pptp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-pptp.o -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Tpo -c -o vpn/plugins/vpn_connman_vpnd-pptp.o `test -f 'vpn/plugins/pptp.c' || echo '$(srcdir)/'`vpn/plugins/pptp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/pptp.c' object='vpn/plugins/vpn_connman_vpnd-pptp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-pptp.o `test -f 'vpn/plugins/pptp.c' || echo '$(srcdir)/'`vpn/plugins/pptp.c
+
+vpn/plugins/vpn_connman_vpnd-pptp.obj: vpn/plugins/pptp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-pptp.obj -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Tpo -c -o vpn/plugins/vpn_connman_vpnd-pptp.obj `if test -f 'vpn/plugins/pptp.c'; then $(CYGPATH_W) 'vpn/plugins/pptp.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/pptp.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-pptp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/pptp.c' object='vpn/plugins/vpn_connman_vpnd-pptp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-pptp.obj `if test -f 'vpn/plugins/pptp.c'; then $(CYGPATH_W) 'vpn/plugins/pptp.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/pptp.c'; fi`
+
+vpn/plugins/vpn_connman_vpnd-vpn.o: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-vpn.o -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Tpo -c -o vpn/plugins/vpn_connman_vpnd-vpn.o `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_connman_vpnd-vpn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-vpn.o `test -f 'vpn/plugins/vpn.c' || echo '$(srcdir)/'`vpn/plugins/vpn.c
+
+vpn/plugins/vpn_connman_vpnd-vpn.obj: vpn/plugins/vpn.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/plugins/vpn_connman_vpnd-vpn.obj -MD -MP -MF vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Tpo -c -o vpn/plugins/vpn_connman_vpnd-vpn.obj `if test -f 'vpn/plugins/vpn.c'; then $(CYGPATH_W) 'vpn/plugins/vpn.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/vpn.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Tpo vpn/plugins/$(DEPDIR)/vpn_connman_vpnd-vpn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/plugins/vpn.c' object='vpn/plugins/vpn_connman_vpnd-vpn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/plugins/vpn_connman_vpnd-vpn.obj `if test -f 'vpn/plugins/vpn.c'; then $(CYGPATH_W) 'vpn/plugins/vpn.c'; else $(CYGPATH_W) '$(srcdir)/vpn/plugins/vpn.c'; fi`
+
+gweb/vpn_connman_vpnd-gweb.o: gweb/gweb.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-gweb.o -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Tpo -c -o gweb/vpn_connman_vpnd-gweb.o `test -f 'gweb/gweb.c' || echo '$(srcdir)/'`gweb/gweb.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gweb.c' object='gweb/vpn_connman_vpnd-gweb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-gweb.o `test -f 'gweb/gweb.c' || echo '$(srcdir)/'`gweb/gweb.c
+
+gweb/vpn_connman_vpnd-gweb.obj: gweb/gweb.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-gweb.obj -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Tpo -c -o gweb/vpn_connman_vpnd-gweb.obj `if test -f 'gweb/gweb.c'; then $(CYGPATH_W) 'gweb/gweb.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gweb.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-gweb.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gweb.c' object='gweb/vpn_connman_vpnd-gweb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-gweb.obj `if test -f 'gweb/gweb.c'; then $(CYGPATH_W) 'gweb/gweb.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gweb.c'; fi`
+
+gweb/vpn_connman_vpnd-gresolv.o: gweb/gresolv.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-gresolv.o -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Tpo -c -o gweb/vpn_connman_vpnd-gresolv.o `test -f 'gweb/gresolv.c' || echo '$(srcdir)/'`gweb/gresolv.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gresolv.c' object='gweb/vpn_connman_vpnd-gresolv.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-gresolv.o `test -f 'gweb/gresolv.c' || echo '$(srcdir)/'`gweb/gresolv.c
+
+gweb/vpn_connman_vpnd-gresolv.obj: gweb/gresolv.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-gresolv.obj -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Tpo -c -o gweb/vpn_connman_vpnd-gresolv.obj `if test -f 'gweb/gresolv.c'; then $(CYGPATH_W) 'gweb/gresolv.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gresolv.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-gresolv.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gresolv.c' object='gweb/vpn_connman_vpnd-gresolv.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-gresolv.obj `if test -f 'gweb/gresolv.c'; then $(CYGPATH_W) 'gweb/gresolv.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gresolv.c'; fi`
+
+gweb/vpn_connman_vpnd-giognutls.o: gweb/giognutls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-giognutls.o -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Tpo -c -o gweb/vpn_connman_vpnd-giognutls.o `test -f 'gweb/giognutls.c' || echo '$(srcdir)/'`gweb/giognutls.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/giognutls.c' object='gweb/vpn_connman_vpnd-giognutls.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-giognutls.o `test -f 'gweb/giognutls.c' || echo '$(srcdir)/'`gweb/giognutls.c
+
+gweb/vpn_connman_vpnd-giognutls.obj: gweb/giognutls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-giognutls.obj -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Tpo -c -o gweb/vpn_connman_vpnd-giognutls.obj `if test -f 'gweb/giognutls.c'; then $(CYGPATH_W) 'gweb/giognutls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/giognutls.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-giognutls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/giognutls.c' object='gweb/vpn_connman_vpnd-giognutls.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-giognutls.obj `if test -f 'gweb/giognutls.c'; then $(CYGPATH_W) 'gweb/giognutls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/giognutls.c'; fi`
+
+gweb/vpn_connman_vpnd-gionotls.o: gweb/gionotls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-gionotls.o -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Tpo -c -o gweb/vpn_connman_vpnd-gionotls.o `test -f 'gweb/gionotls.c' || echo '$(srcdir)/'`gweb/gionotls.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gionotls.c' object='gweb/vpn_connman_vpnd-gionotls.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-gionotls.o `test -f 'gweb/gionotls.c' || echo '$(srcdir)/'`gweb/gionotls.c
+
+gweb/vpn_connman_vpnd-gionotls.obj: gweb/gionotls.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT gweb/vpn_connman_vpnd-gionotls.obj -MD -MP -MF gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Tpo -c -o gweb/vpn_connman_vpnd-gionotls.obj `if test -f 'gweb/gionotls.c'; then $(CYGPATH_W) 'gweb/gionotls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gionotls.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Tpo gweb/$(DEPDIR)/vpn_connman_vpnd-gionotls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gweb/gionotls.c' object='gweb/vpn_connman_vpnd-gionotls.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o gweb/vpn_connman_vpnd-gionotls.obj `if test -f 'gweb/gionotls.c'; then $(CYGPATH_W) 'gweb/gionotls.c'; else $(CYGPATH_W) '$(srcdir)/gweb/gionotls.c'; fi`
+
+vpn/vpn_connman_vpnd-main.o: vpn/main.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-main.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-main.Tpo -c -o vpn/vpn_connman_vpnd-main.o `test -f 'vpn/main.c' || echo '$(srcdir)/'`vpn/main.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-main.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/main.c' object='vpn/vpn_connman_vpnd-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-main.o `test -f 'vpn/main.c' || echo '$(srcdir)/'`vpn/main.c
+
+vpn/vpn_connman_vpnd-main.obj: vpn/main.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-main.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-main.Tpo -c -o vpn/vpn_connman_vpnd-main.obj `if test -f 'vpn/main.c'; then $(CYGPATH_W) 'vpn/main.c'; else $(CYGPATH_W) '$(srcdir)/vpn/main.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-main.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/main.c' object='vpn/vpn_connman_vpnd-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-main.obj `if test -f 'vpn/main.c'; then $(CYGPATH_W) 'vpn/main.c'; else $(CYGPATH_W) '$(srcdir)/vpn/main.c'; fi`
+
+src/vpn_connman_vpnd-log.o: src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-log.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-log.Tpo -c -o src/vpn_connman_vpnd-log.o `test -f 'src/log.c' || echo '$(srcdir)/'`src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-log.Tpo src/$(DEPDIR)/vpn_connman_vpnd-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/log.c' object='src/vpn_connman_vpnd-log.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-log.o `test -f 'src/log.c' || echo '$(srcdir)/'`src/log.c
+
+src/vpn_connman_vpnd-log.obj: src/log.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-log.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-log.Tpo -c -o src/vpn_connman_vpnd-log.obj `if test -f 'src/log.c'; then $(CYGPATH_W) 'src/log.c'; else $(CYGPATH_W) '$(srcdir)/src/log.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-log.Tpo src/$(DEPDIR)/vpn_connman_vpnd-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/log.c' object='src/vpn_connman_vpnd-log.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-log.obj `if test -f 'src/log.c'; then $(CYGPATH_W) 'src/log.c'; else $(CYGPATH_W) '$(srcdir)/src/log.c'; fi`
+
+src/vpn_connman_vpnd-error.o: src/error.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-error.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-error.Tpo -c -o src/vpn_connman_vpnd-error.o `test -f 'src/error.c' || echo '$(srcdir)/'`src/error.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-error.Tpo src/$(DEPDIR)/vpn_connman_vpnd-error.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/error.c' object='src/vpn_connman_vpnd-error.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-error.o `test -f 'src/error.c' || echo '$(srcdir)/'`src/error.c
+
+src/vpn_connman_vpnd-error.obj: src/error.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-error.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-error.Tpo -c -o src/vpn_connman_vpnd-error.obj `if test -f 'src/error.c'; then $(CYGPATH_W) 'src/error.c'; else $(CYGPATH_W) '$(srcdir)/src/error.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-error.Tpo src/$(DEPDIR)/vpn_connman_vpnd-error.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/error.c' object='src/vpn_connman_vpnd-error.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-error.obj `if test -f 'src/error.c'; then $(CYGPATH_W) 'src/error.c'; else $(CYGPATH_W) '$(srcdir)/src/error.c'; fi`
+
+src/vpn_connman_vpnd-plugin.o: src/plugin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-plugin.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-plugin.Tpo -c -o src/vpn_connman_vpnd-plugin.o `test -f 'src/plugin.c' || echo '$(srcdir)/'`src/plugin.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-plugin.Tpo src/$(DEPDIR)/vpn_connman_vpnd-plugin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/plugin.c' object='src/vpn_connman_vpnd-plugin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-plugin.o `test -f 'src/plugin.c' || echo '$(srcdir)/'`src/plugin.c
+
+src/vpn_connman_vpnd-plugin.obj: src/plugin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-plugin.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-plugin.Tpo -c -o src/vpn_connman_vpnd-plugin.obj `if test -f 'src/plugin.c'; then $(CYGPATH_W) 'src/plugin.c'; else $(CYGPATH_W) '$(srcdir)/src/plugin.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-plugin.Tpo src/$(DEPDIR)/vpn_connman_vpnd-plugin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/plugin.c' object='src/vpn_connman_vpnd-plugin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-plugin.obj `if test -f 'src/plugin.c'; then $(CYGPATH_W) 'src/plugin.c'; else $(CYGPATH_W) '$(srcdir)/src/plugin.c'; fi`
+
+src/vpn_connman_vpnd-task.o: src/task.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-task.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-task.Tpo -c -o src/vpn_connman_vpnd-task.o `test -f 'src/task.c' || echo '$(srcdir)/'`src/task.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-task.Tpo src/$(DEPDIR)/vpn_connman_vpnd-task.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/task.c' object='src/vpn_connman_vpnd-task.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-task.o `test -f 'src/task.c' || echo '$(srcdir)/'`src/task.c
+
+src/vpn_connman_vpnd-task.obj: src/task.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-task.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-task.Tpo -c -o src/vpn_connman_vpnd-task.obj `if test -f 'src/task.c'; then $(CYGPATH_W) 'src/task.c'; else $(CYGPATH_W) '$(srcdir)/src/task.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-task.Tpo src/$(DEPDIR)/vpn_connman_vpnd-task.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/task.c' object='src/vpn_connman_vpnd-task.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-task.obj `if test -f 'src/task.c'; then $(CYGPATH_W) 'src/task.c'; else $(CYGPATH_W) '$(srcdir)/src/task.c'; fi`
+
+vpn/vpn_connman_vpnd-vpn-manager.o: vpn/vpn-manager.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-manager.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Tpo -c -o vpn/vpn_connman_vpnd-vpn-manager.o `test -f 'vpn/vpn-manager.c' || echo '$(srcdir)/'`vpn/vpn-manager.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-manager.c' object='vpn/vpn_connman_vpnd-vpn-manager.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-manager.o `test -f 'vpn/vpn-manager.c' || echo '$(srcdir)/'`vpn/vpn-manager.c
+
+vpn/vpn_connman_vpnd-vpn-manager.obj: vpn/vpn-manager.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-manager.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Tpo -c -o vpn/vpn_connman_vpnd-vpn-manager.obj `if test -f 'vpn/vpn-manager.c'; then $(CYGPATH_W) 'vpn/vpn-manager.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-manager.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-manager.c' object='vpn/vpn_connman_vpnd-vpn-manager.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-manager.obj `if test -f 'vpn/vpn-manager.c'; then $(CYGPATH_W) 'vpn/vpn-manager.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-manager.c'; fi`
+
+vpn/vpn_connman_vpnd-vpn-provider.o: vpn/vpn-provider.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-provider.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Tpo -c -o vpn/vpn_connman_vpnd-vpn-provider.o `test -f 'vpn/vpn-provider.c' || echo '$(srcdir)/'`vpn/vpn-provider.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-provider.c' object='vpn/vpn_connman_vpnd-vpn-provider.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-provider.o `test -f 'vpn/vpn-provider.c' || echo '$(srcdir)/'`vpn/vpn-provider.c
+
+vpn/vpn_connman_vpnd-vpn-provider.obj: vpn/vpn-provider.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-provider.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Tpo -c -o vpn/vpn_connman_vpnd-vpn-provider.obj `if test -f 'vpn/vpn-provider.c'; then $(CYGPATH_W) 'vpn/vpn-provider.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-provider.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-provider.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-provider.c' object='vpn/vpn_connman_vpnd-vpn-provider.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-provider.obj `if test -f 'vpn/vpn-provider.c'; then $(CYGPATH_W) 'vpn/vpn-provider.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-provider.c'; fi`
+
+vpn/vpn_connman_vpnd-vpn-ipconfig.o: vpn/vpn-ipconfig.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-ipconfig.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Tpo -c -o vpn/vpn_connman_vpnd-vpn-ipconfig.o `test -f 'vpn/vpn-ipconfig.c' || echo '$(srcdir)/'`vpn/vpn-ipconfig.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-ipconfig.c' object='vpn/vpn_connman_vpnd-vpn-ipconfig.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-ipconfig.o `test -f 'vpn/vpn-ipconfig.c' || echo '$(srcdir)/'`vpn/vpn-ipconfig.c
+
+vpn/vpn_connman_vpnd-vpn-ipconfig.obj: vpn/vpn-ipconfig.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-ipconfig.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Tpo -c -o vpn/vpn_connman_vpnd-vpn-ipconfig.obj `if test -f 'vpn/vpn-ipconfig.c'; then $(CYGPATH_W) 'vpn/vpn-ipconfig.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-ipconfig.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-ipconfig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-ipconfig.c' object='vpn/vpn_connman_vpnd-vpn-ipconfig.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-ipconfig.obj `if test -f 'vpn/vpn-ipconfig.c'; then $(CYGPATH_W) 'vpn/vpn-ipconfig.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-ipconfig.c'; fi`
+
+src/vpn_connman_vpnd-inet.o: src/inet.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-inet.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-inet.Tpo -c -o src/vpn_connman_vpnd-inet.o `test -f 'src/inet.c' || echo '$(srcdir)/'`src/inet.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-inet.Tpo src/$(DEPDIR)/vpn_connman_vpnd-inet.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inet.c' object='src/vpn_connman_vpnd-inet.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-inet.o `test -f 'src/inet.c' || echo '$(srcdir)/'`src/inet.c
+
+src/vpn_connman_vpnd-inet.obj: src/inet.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-inet.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-inet.Tpo -c -o src/vpn_connman_vpnd-inet.obj `if test -f 'src/inet.c'; then $(CYGPATH_W) 'src/inet.c'; else $(CYGPATH_W) '$(srcdir)/src/inet.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-inet.Tpo src/$(DEPDIR)/vpn_connman_vpnd-inet.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inet.c' object='src/vpn_connman_vpnd-inet.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-inet.obj `if test -f 'src/inet.c'; then $(CYGPATH_W) 'src/inet.c'; else $(CYGPATH_W) '$(srcdir)/src/inet.c'; fi`
+
+vpn/vpn_connman_vpnd-vpn-rtnl.o: vpn/vpn-rtnl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-rtnl.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Tpo -c -o vpn/vpn_connman_vpnd-vpn-rtnl.o `test -f 'vpn/vpn-rtnl.c' || echo '$(srcdir)/'`vpn/vpn-rtnl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-rtnl.c' object='vpn/vpn_connman_vpnd-vpn-rtnl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-rtnl.o `test -f 'vpn/vpn-rtnl.c' || echo '$(srcdir)/'`vpn/vpn-rtnl.c
+
+vpn/vpn_connman_vpnd-vpn-rtnl.obj: vpn/vpn-rtnl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-rtnl.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Tpo -c -o vpn/vpn_connman_vpnd-vpn-rtnl.obj `if test -f 'vpn/vpn-rtnl.c'; then $(CYGPATH_W) 'vpn/vpn-rtnl.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-rtnl.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-rtnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-rtnl.c' object='vpn/vpn_connman_vpnd-vpn-rtnl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-rtnl.obj `if test -f 'vpn/vpn-rtnl.c'; then $(CYGPATH_W) 'vpn/vpn-rtnl.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-rtnl.c'; fi`
+
+src/vpn_connman_vpnd-dbus.o: src/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-dbus.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-dbus.Tpo -c -o src/vpn_connman_vpnd-dbus.o `test -f 'src/dbus.c' || echo '$(srcdir)/'`src/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-dbus.Tpo src/$(DEPDIR)/vpn_connman_vpnd-dbus.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dbus.c' object='src/vpn_connman_vpnd-dbus.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-dbus.o `test -f 'src/dbus.c' || echo '$(srcdir)/'`src/dbus.c
+
+src/vpn_connman_vpnd-dbus.obj: src/dbus.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-dbus.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-dbus.Tpo -c -o src/vpn_connman_vpnd-dbus.obj `if test -f 'src/dbus.c'; then $(CYGPATH_W) 'src/dbus.c'; else $(CYGPATH_W) '$(srcdir)/src/dbus.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-dbus.Tpo src/$(DEPDIR)/vpn_connman_vpnd-dbus.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/dbus.c' object='src/vpn_connman_vpnd-dbus.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-dbus.obj `if test -f 'src/dbus.c'; then $(CYGPATH_W) 'src/dbus.c'; else $(CYGPATH_W) '$(srcdir)/src/dbus.c'; fi`
+
+src/vpn_connman_vpnd-storage.o: src/storage.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-storage.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-storage.Tpo -c -o src/vpn_connman_vpnd-storage.o `test -f 'src/storage.c' || echo '$(srcdir)/'`src/storage.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-storage.Tpo src/$(DEPDIR)/vpn_connman_vpnd-storage.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/storage.c' object='src/vpn_connman_vpnd-storage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-storage.o `test -f 'src/storage.c' || echo '$(srcdir)/'`src/storage.c
+
+src/vpn_connman_vpnd-storage.obj: src/storage.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-storage.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-storage.Tpo -c -o src/vpn_connman_vpnd-storage.obj `if test -f 'src/storage.c'; then $(CYGPATH_W) 'src/storage.c'; else $(CYGPATH_W) '$(srcdir)/src/storage.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-storage.Tpo src/$(DEPDIR)/vpn_connman_vpnd-storage.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/storage.c' object='src/vpn_connman_vpnd-storage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-storage.obj `if test -f 'src/storage.c'; then $(CYGPATH_W) 'src/storage.c'; else $(CYGPATH_W) '$(srcdir)/src/storage.c'; fi`
+
+src/vpn_connman_vpnd-ipaddress.o: src/ipaddress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-ipaddress.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Tpo -c -o src/vpn_connman_vpnd-ipaddress.o `test -f 'src/ipaddress.c' || echo '$(srcdir)/'`src/ipaddress.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Tpo src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipaddress.c' object='src/vpn_connman_vpnd-ipaddress.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-ipaddress.o `test -f 'src/ipaddress.c' || echo '$(srcdir)/'`src/ipaddress.c
+
+src/vpn_connman_vpnd-ipaddress.obj: src/ipaddress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-ipaddress.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Tpo -c -o src/vpn_connman_vpnd-ipaddress.obj `if test -f 'src/ipaddress.c'; then $(CYGPATH_W) 'src/ipaddress.c'; else $(CYGPATH_W) '$(srcdir)/src/ipaddress.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Tpo src/$(DEPDIR)/vpn_connman_vpnd-ipaddress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/ipaddress.c' object='src/vpn_connman_vpnd-ipaddress.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-ipaddress.obj `if test -f 'src/ipaddress.c'; then $(CYGPATH_W) 'src/ipaddress.c'; else $(CYGPATH_W) '$(srcdir)/src/ipaddress.c'; fi`
+
+src/vpn_connman_vpnd-agent.o: src/agent.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-agent.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-agent.Tpo -c -o src/vpn_connman_vpnd-agent.o `test -f 'src/agent.c' || echo '$(srcdir)/'`src/agent.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-agent.Tpo src/$(DEPDIR)/vpn_connman_vpnd-agent.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/agent.c' object='src/vpn_connman_vpnd-agent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-agent.o `test -f 'src/agent.c' || echo '$(srcdir)/'`src/agent.c
+
+src/vpn_connman_vpnd-agent.obj: src/agent.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-agent.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-agent.Tpo -c -o src/vpn_connman_vpnd-agent.obj `if test -f 'src/agent.c'; then $(CYGPATH_W) 'src/agent.c'; else $(CYGPATH_W) '$(srcdir)/src/agent.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-agent.Tpo src/$(DEPDIR)/vpn_connman_vpnd-agent.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/agent.c' object='src/vpn_connman_vpnd-agent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-agent.obj `if test -f 'src/agent.c'; then $(CYGPATH_W) 'src/agent.c'; else $(CYGPATH_W) '$(srcdir)/src/agent.c'; fi`
+
+vpn/vpn_connman_vpnd-vpn-agent.o: vpn/vpn-agent.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-agent.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Tpo -c -o vpn/vpn_connman_vpnd-vpn-agent.o `test -f 'vpn/vpn-agent.c' || echo '$(srcdir)/'`vpn/vpn-agent.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-agent.c' object='vpn/vpn_connman_vpnd-vpn-agent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-agent.o `test -f 'vpn/vpn-agent.c' || echo '$(srcdir)/'`vpn/vpn-agent.c
+
+vpn/vpn_connman_vpnd-vpn-agent.obj: vpn/vpn-agent.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-agent.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Tpo -c -o vpn/vpn_connman_vpnd-vpn-agent.obj `if test -f 'vpn/vpn-agent.c'; then $(CYGPATH_W) 'vpn/vpn-agent.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-agent.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-agent.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-agent.c' object='vpn/vpn_connman_vpnd-vpn-agent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-agent.obj `if test -f 'vpn/vpn-agent.c'; then $(CYGPATH_W) 'vpn/vpn-agent.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-agent.c'; fi`
+
+src/vpn_connman_vpnd-inotify.o: src/inotify.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-inotify.o -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-inotify.Tpo -c -o src/vpn_connman_vpnd-inotify.o `test -f 'src/inotify.c' || echo '$(srcdir)/'`src/inotify.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-inotify.Tpo src/$(DEPDIR)/vpn_connman_vpnd-inotify.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inotify.c' object='src/vpn_connman_vpnd-inotify.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-inotify.o `test -f 'src/inotify.c' || echo '$(srcdir)/'`src/inotify.c
+
+src/vpn_connman_vpnd-inotify.obj: src/inotify.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT src/vpn_connman_vpnd-inotify.obj -MD -MP -MF src/$(DEPDIR)/vpn_connman_vpnd-inotify.Tpo -c -o src/vpn_connman_vpnd-inotify.obj `if test -f 'src/inotify.c'; then $(CYGPATH_W) 'src/inotify.c'; else $(CYGPATH_W) '$(srcdir)/src/inotify.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/vpn_connman_vpnd-inotify.Tpo src/$(DEPDIR)/vpn_connman_vpnd-inotify.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/inotify.c' object='src/vpn_connman_vpnd-inotify.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o src/vpn_connman_vpnd-inotify.obj `if test -f 'src/inotify.c'; then $(CYGPATH_W) 'src/inotify.c'; else $(CYGPATH_W) '$(srcdir)/src/inotify.c'; fi`
+
+vpn/vpn_connman_vpnd-vpn-config.o: vpn/vpn-config.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-config.o -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Tpo -c -o vpn/vpn_connman_vpnd-vpn-config.o `test -f 'vpn/vpn-config.c' || echo '$(srcdir)/'`vpn/vpn-config.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-config.c' object='vpn/vpn_connman_vpnd-vpn-config.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-config.o `test -f 'vpn/vpn-config.c' || echo '$(srcdir)/'`vpn/vpn-config.c
+
+vpn/vpn_connman_vpnd-vpn-config.obj: vpn/vpn-config.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -MT vpn/vpn_connman_vpnd-vpn-config.obj -MD -MP -MF vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Tpo -c -o vpn/vpn_connman_vpnd-vpn-config.obj `if test -f 'vpn/vpn-config.c'; then $(CYGPATH_W) 'vpn/vpn-config.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-config.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Tpo vpn/$(DEPDIR)/vpn_connman_vpnd-vpn-config.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vpn/vpn-config.c' object='vpn/vpn_connman_vpnd-vpn-config.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vpn_connman_vpnd_CFLAGS) $(CFLAGS) -c -o vpn/vpn_connman_vpnd-vpn-config.obj `if test -f 'vpn/vpn-config.c'; then $(CYGPATH_W) 'vpn/vpn-config.c'; else $(CYGPATH_W) '$(srcdir)/vpn/vpn-config.c'; fi`
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+       -rm -rf client/.libs client/_libs
+       -rm -rf gdbus/.libs gdbus/_libs
+       -rm -rf plugins/.libs plugins/_libs
+       -rm -rf scripts/.libs scripts/_libs
+       -rm -rf src/.libs src/_libs
+       -rm -rf tools/.libs tools/_libs
+       -rm -rf unit/.libs unit/_libs
+       -rm -rf vpn/.libs vpn/_libs
+       -rm -rf vpn/plugins/.libs vpn/plugins/_libs
+
+distclean-libtool:
+       -rm -f libtool config.lt
+install-man5: $(dist_man_MANS)
+       @$(NORMAL_INSTALL)
+       @list1=''; \
+       list2='$(dist_man_MANS)'; \
+       test -n "$(man5dir)" \
+         && test -n "`echo $$list1$$list2`" \
+         || exit 0; \
+       echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \
+       $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \
+       { for i in $$list1; do echo "$$i"; done;  \
+       if test -n "$$list2"; then \
+         for i in $$list2; do echo "$$i"; done \
+           | sed -n '/\.5[a-z]*$$/p'; \
+       fi; \
+       } | while read p; do \
+         if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; echo "$$p"; \
+       done | \
+       sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
+             -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+       sed 'N;N;s,\n, ,g' | { \
+       list=; while read file base inst; do \
+         if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+           echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
+           $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \
+         fi; \
+       done; \
+       for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+       while read files; do \
+         test -z "$$files" || { \
+           echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \
+           $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \
+       done; }
+
+uninstall-man5:
+       @$(NORMAL_UNINSTALL)
+       @list=''; test -n "$(man5dir)" || exit 0; \
+       files=`{ for i in $$list; do echo "$$i"; done; \
+       l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+         sed -n '/\.5[a-z]*$$/p'; \
+       } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
+             -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+       dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir)
+install-man8: $(dist_man_MANS)
+       @$(NORMAL_INSTALL)
+       @list1=''; \
+       list2='$(dist_man_MANS)'; \
+       test -n "$(man8dir)" \
+         && test -n "`echo $$list1$$list2`" \
+         || exit 0; \
+       echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \
+       $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \
+       { for i in $$list1; do echo "$$i"; done;  \
+       if test -n "$$list2"; then \
+         for i in $$list2; do echo "$$i"; done \
+           | sed -n '/\.8[a-z]*$$/p'; \
+       fi; \
+       } | while read p; do \
+         if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; echo "$$p"; \
+       done | \
+       sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
+             -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+       sed 'N;N;s,\n, ,g' | { \
+       list=; while read file base inst; do \
+         if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+           echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
+           $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \
+         fi; \
+       done; \
+       for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+       while read files; do \
+         test -z "$$files" || { \
+           echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \
+           $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \
+       done; }
+
+uninstall-man8:
+       @$(NORMAL_UNINSTALL)
+       @list=''; test -n "$(man8dir)" || exit 0; \
+       files=`{ for i in $$list; do echo "$$i"; done; \
+       l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+         sed -n '/\.8[a-z]*$$/p'; \
+       } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
+             -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+       dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir)
+install-dbusconfDATA: $(dbusconf_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(dbusconf_DATA)'; test -n "$(dbusconfdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(dbusconfdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(dbusconfdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbusconfdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(dbusconfdir)" || exit $$?; \
+       done
+
+uninstall-dbusconfDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(dbusconf_DATA)'; test -n "$(dbusconfdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(dbusconfdir)'; $(am__uninstall_files_from_dir)
+install-dbusserviceDATA: $(dbusservice_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(dbusservicedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(dbusservicedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbusservicedir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(dbusservicedir)" || exit $$?; \
+       done
+
+uninstall-dbusserviceDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(dbusservicedir)'; $(am__uninstall_files_from_dir)
+install-pkgconfigDATA: $(pkgconfig_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+       done
+
+uninstall-pkgconfigDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+install-policyDATA: $(policy_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(policy_DATA)'; test -n "$(policydir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(policydir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(policydir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(policydir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(policydir)" || exit $$?; \
+       done
+
+uninstall-policyDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(policy_DATA)'; test -n "$(policydir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(policydir)'; $(am__uninstall_files_from_dir)
+install-scriptDATA: $(script_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(script_DATA)'; test -n "$(scriptdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(scriptdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(scriptdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(scriptdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(scriptdir)" || exit $$?; \
+       done
+
+uninstall-scriptDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(script_DATA)'; test -n "$(scriptdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(scriptdir)'; $(am__uninstall_files_from_dir)
+install-systemdunitDATA: $(systemdunit_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(systemdunit_DATA)'; test -n "$(systemdunitdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(systemdunitdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(systemdunitdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(systemdunitdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(systemdunitdir)" || exit $$?; \
+       done
+
+uninstall-systemdunitDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(systemdunit_DATA)'; test -n "$(systemdunitdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(systemdunitdir)'; $(am__uninstall_files_from_dir)
+install-includeHEADERS: $(include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+       done
+
+uninstall-includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+       done
+
+uninstall-nodist_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+       @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+       srcdir=$(srcdir); export srcdir; \
+       list=' $(TESTS) '; \
+       $(am__tty_colors); \
+       if test -n "$$list"; then \
+         for tst in $$list; do \
+           if test -f ./$$tst; then dir=./; \
+           elif test -f $$tst; then dir=; \
+           else dir="$(srcdir)/"; fi; \
+           if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+             all=`expr $$all + 1`; \
+             case " $(XFAIL_TESTS) " in \
+             *[\ \     ]$$tst[\ \      ]*) \
+               xpass=`expr $$xpass + 1`; \
+               failed=`expr $$failed + 1`; \
+               col=$$red; res=XPASS; \
+             ;; \
+             *) \
+               col=$$grn; res=PASS; \
+             ;; \
+             esac; \
+           elif test $$? -ne 77; then \
+             all=`expr $$all + 1`; \
+             case " $(XFAIL_TESTS) " in \
+             *[\ \     ]$$tst[\ \      ]*) \
+               xfail=`expr $$xfail + 1`; \
+               col=$$lgn; res=XFAIL; \
+             ;; \
+             *) \
+               failed=`expr $$failed + 1`; \
+               col=$$red; res=FAIL; \
+             ;; \
+             esac; \
+           else \
+             skip=`expr $$skip + 1`; \
+             col=$$blu; res=SKIP; \
+           fi; \
+           echo "$${col}$$res$${std}: $$tst"; \
+         done; \
+         if test "$$all" -eq 1; then \
+           tests="test"; \
+           All=""; \
+         else \
+           tests="tests"; \
+           All="All "; \
+         fi; \
+         if test "$$failed" -eq 0; then \
+           if test "$$xfail" -eq 0; then \
+             banner="$$All$$all $$tests passed"; \
+           else \
+             if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+             banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+           fi; \
+         else \
+           if test "$$xpass" -eq 0; then \
+             banner="$$failed of $$all $$tests failed"; \
+           else \
+             if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+             banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+           fi; \
+         fi; \
+         dashes="$$banner"; \
+         skipped=""; \
+         if test "$$skip" -ne 0; then \
+           if test "$$skip" -eq 1; then \
+             skipped="($$skip test was not run)"; \
+           else \
+             skipped="($$skip tests were not run)"; \
+           fi; \
+           test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+             dashes="$$skipped"; \
+         fi; \
+         report=""; \
+         if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+           report="Please report to $(PACKAGE_BUGREPORT)"; \
+           test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+             dashes="$$report"; \
+         fi; \
+         dashes=`echo "$$dashes" | sed s/./=/g`; \
+         if test "$$failed" -eq 0; then \
+           col="$$grn"; \
+         else \
+           col="$$red"; \
+         fi; \
+         echo "$${col}$$dashes$${std}"; \
+         echo "$${col}$$banner$${std}"; \
+         test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+         test -z "$$report" || echo "$${col}$$report$${std}"; \
+         echo "$${col}$$dashes$${std}"; \
+         test "$$failed" -eq 0; \
+       else :; fi
+
+distdir: $(DISTFILES)
+       @list='$(MANS)'; if test -n "$$list"; then \
+         list=`for p in $$list; do \
+           if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+           if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+         if test -n "$$list" && \
+           grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+           echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+           grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
+           echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+           echo "       typically \`make maintainer-clean' will remove them" >&2; \
+           exit 1; \
+         else :; fi; \
+       else :; fi
+       $(am__remove_distdir)
+       test -d "$(distdir)" || mkdir "$(distdir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -755 \
+               -exec chmod u+rwx,go+rx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-lzip: distdir
+       tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+       $(am__remove_distdir)
+
+dist-lzma: distdir
+       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+       $(am__remove_distdir)
+
+dist-xz: distdir
+       tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.lzma*) \
+         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+       *.tar.lz*) \
+         lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+       *.tar.xz*) \
+         xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod u+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       test -d $(distdir)/_build || exit 0; \
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && am__cwd=`pwd` \
+         && $(am__cd) $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+         && cd "$$am__cwd" \
+         || exit 1
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+       @test -n '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: trying to run $@ with an empty' \
+              '$$(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       $(am__cd) '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \
+               $(HEADERS) config.h
+installdirs:
+       for dir in "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(scriptdir)" "$(DESTDIR)$(vpn_plugindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(scriptdir)" "$(DESTDIR)$(testdir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(dbusconfdir)" "$(DESTDIR)$(dbusservicedir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(policydir)" "$(DESTDIR)$(scriptdir)" "$(DESTDIR)$(systemdunitdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -rm -f client/$(DEPDIR)/$(am__dirstamp)
+       -rm -f client/$(am__dirstamp)
+       -rm -f gdbus/$(DEPDIR)/$(am__dirstamp)
+       -rm -f gdbus/$(am__dirstamp)
+       -rm -f gdhcp/$(DEPDIR)/$(am__dirstamp)
+       -rm -f gdhcp/$(am__dirstamp)
+       -rm -f gsupplicant/$(DEPDIR)/$(am__dirstamp)
+       -rm -f gsupplicant/$(am__dirstamp)
+       -rm -f gweb/$(DEPDIR)/$(am__dirstamp)
+       -rm -f gweb/$(am__dirstamp)
+       -rm -f plugins/$(DEPDIR)/$(am__dirstamp)
+       -rm -f plugins/$(am__dirstamp)
+       -rm -f scripts/$(DEPDIR)/$(am__dirstamp)
+       -rm -f scripts/$(am__dirstamp)
+       -rm -f src/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/$(am__dirstamp)
+       -rm -f src/shared/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/shared/$(am__dirstamp)
+       -rm -f tools/$(DEPDIR)/$(am__dirstamp)
+       -rm -f tools/$(am__dirstamp)
+       -rm -f unit/$(DEPDIR)/$(am__dirstamp)
+       -rm -f unit/$(am__dirstamp)
+       -rm -f vpn/$(DEPDIR)/$(am__dirstamp)
+       -rm -f vpn/$(am__dirstamp)
+       -rm -f vpn/plugins/$(DEPDIR)/$(am__dirstamp)
+       -rm -f vpn/plugins/$(am__dirstamp)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local \
+       clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+       clean-pluginLTLIBRARIES clean-sbinPROGRAMS \
+       clean-scriptLTLIBRARIES clean-scriptPROGRAMS \
+       clean-vpn_pluginLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf client/$(DEPDIR) gdbus/$(DEPDIR) gdhcp/$(DEPDIR) gsupplicant/$(DEPDIR) gweb/$(DEPDIR) plugins/$(DEPDIR) scripts/$(DEPDIR) src/$(DEPDIR) src/shared/$(DEPDIR) tools/$(DEPDIR) unit/$(DEPDIR) vpn/$(DEPDIR) vpn/plugins/$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-dbusconfDATA install-dbusserviceDATA \
+       install-includeHEADERS install-man \
+       install-nodist_includeHEADERS install-pkgconfigDATA \
+       install-pluginLTLIBRARIES install-policyDATA \
+       install-scriptDATA install-scriptLTLIBRARIES \
+       install-scriptPROGRAMS install-systemdunitDATA \
+       install-testSCRIPTS install-vpn_pluginLTLIBRARIES
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-sbinPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man5 install-man8
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -rf client/$(DEPDIR) gdbus/$(DEPDIR) gdhcp/$(DEPDIR) gsupplicant/$(DEPDIR) gweb/$(DEPDIR) plugins/$(DEPDIR) scripts/$(DEPDIR) src/$(DEPDIR) src/shared/$(DEPDIR) tools/$(DEPDIR) unit/$(DEPDIR) vpn/$(DEPDIR) vpn/plugins/$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-dbusconfDATA uninstall-dbusserviceDATA \
+       uninstall-includeHEADERS uninstall-man \
+       uninstall-nodist_includeHEADERS uninstall-pkgconfigDATA \
+       uninstall-pluginLTLIBRARIES uninstall-policyDATA \
+       uninstall-sbinPROGRAMS uninstall-scriptDATA \
+       uninstall-scriptLTLIBRARIES uninstall-scriptPROGRAMS \
+       uninstall-systemdunitDATA uninstall-testSCRIPTS \
+       uninstall-vpn_pluginLTLIBRARIES
+
+uninstall-man: uninstall-man5 uninstall-man8
+
+.MAKE: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \
+       clean clean-generic clean-libtool clean-local \
+       clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+       clean-pluginLTLIBRARIES clean-sbinPROGRAMS \
+       clean-scriptLTLIBRARIES clean-scriptPROGRAMS \
+       clean-vpn_pluginLTLIBRARIES ctags dist dist-all dist-bzip2 \
+       dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \
+       dist-zip distcheck distclean distclean-compile \
+       distclean-generic distclean-hdr distclean-libtool \
+       distclean-tags distcleancheck distdir distuninstallcheck dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dbusconfDATA \
+       install-dbusserviceDATA install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-includeHEADERS install-info install-info-am \
+       install-man install-man5 install-man8 \
+       install-nodist_includeHEADERS install-pdf install-pdf-am \
+       install-pkgconfigDATA install-pluginLTLIBRARIES \
+       install-policyDATA install-ps install-ps-am \
+       install-sbinPROGRAMS install-scriptDATA \
+       install-scriptLTLIBRARIES install-scriptPROGRAMS install-strip \
+       install-systemdunitDATA install-testSCRIPTS \
+       install-vpn_pluginLTLIBRARIES installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-dbusconfDATA uninstall-dbusserviceDATA \
+       uninstall-includeHEADERS uninstall-man uninstall-man5 \
+       uninstall-man8 uninstall-nodist_includeHEADERS \
+       uninstall-pkgconfigDATA uninstall-pluginLTLIBRARIES \
+       uninstall-policyDATA uninstall-sbinPROGRAMS \
+       uninstall-scriptDATA uninstall-scriptLTLIBRARIES \
+       uninstall-scriptPROGRAMS uninstall-systemdunitDATA \
+       uninstall-testSCRIPTS uninstall-vpn_pluginLTLIBRARIES
+
+
+plugins/net.connman.policy: plugins/polkit.policy
+@POLKIT_TRUE@  $(AM_V_GEN)cp $< $@
+
+@VPN_TRUE@vpn/net.connman.vpn.policy: vpn/vpn-polkit.policy
+@POLKIT_TRUE@@VPN_TRUE@        $(AM_V_GEN)cp $< $@
+
+src/builtin.h: src/genbuiltin $(builtin_sources)
+       $(AM_V_GEN)$(srcdir)/src/genbuiltin $(builtin_modules) > $@
+
+vpn/builtin.h: src/genbuiltin $(builtin_vpn_sources)
+       $(AM_V_GEN)$(srcdir)/src/genbuiltin $(builtin_vpn_modules) > $@
+
+src/connman.conf: src/connman-dbus.conf src/connman-polkit.conf
+@POLKIT_TRUE@  $(AM_V_GEN)cp $(srcdir)/src/connman-polkit.conf $@
+@POLKIT_FALSE@ $(AM_V_GEN)cp $(srcdir)/src/connman-dbus.conf $@
+
+@VPN_TRUE@vpn/connman-vpn-dbus.conf: vpn/vpn-dbus.conf vpn/vpn-polkit.conf
+@POLKIT_TRUE@@VPN_TRUE@        $(AM_V_GEN)cp $(srcdir)/vpn/vpn-polkit.conf $@
+@POLKIT_FALSE@@VPN_TRUE@       $(AM_V_GEN)cp $(srcdir)/vpn/vpn-dbus.conf $@
+
+@SELINUX_TRUE@connman-task.pp: vpn/connman-task.te
+@SELINUX_TRUE@ make -f /usr/share/selinux/devel/Makefile
+
+include/connman/version.h: include/version.h
+       $(AM_V_at)$(MKDIR_P) include/connman
+       $(AM_V_GEN)$(LN_S) $(abs_top_builddir)/$< $@
+
+include/connman/%.h: $(abs_top_srcdir)/include/%.h
+       $(AM_V_at)$(MKDIR_P) include/connman
+       $(AM_V_GEN)$(LN_S) $< $@
+
+clean-local:
+       @$(RM) -rf include/connman
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
index ce5089d..294cae0 100644 (file)
@@ -16,6 +16,11 @@ builtin_modules += ethernet
 builtin_sources += plugins/ethernet.c
 endif
 
+if GADGET
+builtin_modules += gadget
+builtin_sources += plugins/gadget.c
+endif
+
 gsupplicant_sources = gsupplicant/gsupplicant.h gsupplicant/dbus.h \
                        gsupplicant/supplicant.c gsupplicant/dbus.c
 
@@ -70,7 +75,7 @@ vpn_plugins_openconnect_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
                                                vpn/plugins/openconnect.c
 vpn_plugins_openconnect_la_CFLAGS = $(plugin_cflags) \
                                        -DOPENCONNECT=\"@OPENCONNECT@\" \
-                                       -DSTATEDIR=\""$(statedir)"\" \
+                                       -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
 vpn_plugins_openconnect_la_LDFLAGS = $(plugin_ldflags)
 endif
@@ -88,7 +93,7 @@ vpn_plugin_objects += $(plugins_openvpn_la_OBJECTS)
 vpn_plugins_openvpn_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
                                                vpn/plugins/openvpn.c
 vpn_plugins_openvpn_la_CFLAGS = $(plugin_cflags) -DOPENVPN=\"@OPENVPN@\" \
-                                       -DSTATEDIR=\""$(statedir)"\" \
+                                       -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
 vpn_plugins_openvpn_la_LDFLAGS = $(plugin_ldflags)
 endif
@@ -106,7 +111,7 @@ vpn_plugin_objects += $(plugins_vpnc_la_OBJECTS)
 vpn_plugins_vpnc_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
                                                vpn/plugins/vpnc.c
 vpn_plugins_vpnc_la_CFLAGS = $(plugin_cflags) -DVPNC=\"@VPNC@\" \
-                                       -DSTATEDIR=\""$(statedir)"\" \
+                                       -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
 vpn_plugins_vpnc_la_LDFLAGS = $(plugin_ldflags)
 endif
@@ -124,7 +129,7 @@ vpn_plugin_objects += $(plugins_l2tp_la_OBJECTS)
 vpn_plugins_l2tp_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
                                                vpn/plugins/l2tp.c
 vpn_plugins_l2tp_la_CFLAGS = $(plugin_cflags) -DL2TP=\"@L2TP@\" \
-                                       -DSTATEDIR=\""$(statedir)"\" \
+                                       -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
 vpn_plugins_l2tp_la_LDFLAGS = $(plugin_ldflags)
 endif
@@ -143,7 +148,7 @@ vpn_plugins_pptp_la_SOURCES = vpn/plugins/vpn.h vpn/plugins/vpn.c \
                                                vpn/plugins/pptp.c
 vpn_plugins_pptp_la_CFLAGS = $(plugin_cflags) -DPPPD=\"@PPPD@\" \
                                        -DPPTP=\"@PPTP@\" \
-                                       -DSTATEDIR=\""$(statedir)"\" \
+                                       -DVPN_STATEDIR=\""$(vpn_statedir)"\" \
                                        -DSCRIPTDIR=\""$(build_scriptdir)"\"
 vpn_plugins_pptp_la_LDFLAGS = $(plugin_ldflags)
 endif
diff --git a/README b/README
index 161c535..9361287 100644 (file)
--- a/README
+++ b/README
@@ -71,6 +71,14 @@ For a working system, certain configuration options need to be enabled:
                enabled. This option can be used to build a small daemon
                for a specific system if Ethernet support is not required.
 
+       --disable-gadget
+
+               Disable support for USB Ethernet Gadget devices
+
+               By default USB Ethernet Gadget technology support is built-in and
+               enabled. This option can be used to build a small daemon
+               for a specific system if USB Ethernet Gadget support is not required.
+
        --disable-wifi
 
                Disable support for WiFi devices
@@ -246,6 +254,12 @@ Following environment variables can be used:
 Example:
     CONNMAN_WEB_DEBUG=1 src/connmand -n
 
+If timing conditions are relevant then it is recommended command to
+get log traces as follows:
+    connmand -d 2>&1 | ts '[%H:%M:%.S]' | tee connman.log
+
+The 'ts' program is normaly avialable in the moreutils package.
+
 
 Kernel configuration
 ====================
@@ -263,6 +277,23 @@ CONFIG_NETFILTER
 CONFIG_NF_CONNTRACK_IPV4
 CONFIG_NF_NAT_IPV4
 
+For routing and statistic support in Sessions, the following options
+need to be enabled as modules (m) or builtin (y):
+
+CONFIG_IP_NF_IPTABLES
+CONFIG_IP_MULTIPLE_TABLES
+CONFIG_NETFILTER_NETLINK_ACCT
+CONFIG_NETFILTER_XT_MATCH_NFACCT
+CONFIG_NETFILTER_XT_CONNMARK
+CONFIG_NETFILTER_XT_TARGET_CONNMARK
+CONFIG_NETFILTER_XT_MATCH_CONNMARK
+
+In order to support USB gadget tethering, the following kernel configuration
+options need to be enabled:
+
+CONFIG_USB_GADGET
+CONFIG_USB_ETH
+
 
 wpa_supplicant configuration
 ============================
@@ -288,7 +319,13 @@ CONFIG_AUTOSCAN_EXPONENTIAL=y
 This will enable the exact same function as bgscan but while being
 disconnected.
 
-It is recommended to use wpa_supplicant 1.x or later.
+It is recommended to use wpa_supplicant 2.x or later.
+
+If wpa_supplicant is configured to D-Bus autostart, then ConnMan will
+trigger the autostart of wpa_supplicant. However please keep in mind
+that this trigger only happens once. If wpa_supplicant stops or crashes,
+ConnMan does not periodically try to autostart it. It is up to systemd or
+similar service management tool to autostart it.
 
 
 VPN
@@ -323,4 +360,7 @@ Mailing list:
        connman@connman.net
 
 For additional information about the project visit ConnMan web site:
+       https://01.org/connman
        http://www.connman.net
+
+You can report bugs at https://01.org/jira/browse/CM
diff --git a/TODO b/TODO
index 1b3974f..8036538 100644 (file)
--- a/TODO
+++ b/TODO
@@ -12,21 +12,6 @@ Background
 Core
 ====
 
-- Session API implementation
-
-   Priority: High
-   Complexity: C4
-   Owner: Daniel Wagner <daniel.wagner@bmw-carit.de>
-   Owner: Patrik Flykt <patrik.flykt@linux.intel.com>
-
-   The session API should provide a connection abstraction in order to
-   prioritize applications network accesses, prevent or allow network
-   and bearer roaming, or provide applications with a way to request
-   for periodic network connections. On-demand connections will be
-   implemented through this API as well.
-   See http://www.mail-archive.com/connman@connman.net/msg01653.html
-
-
 - Personal firewall
 
    Priority: Low
@@ -55,36 +40,14 @@ Core
    and get rid of the unnecessary ones.
 
 
-- Support for multiple agents
-
-  Priority: Medium
-  Complexity: C2
-
-  Allow to register multiple agents. Each unique system bus name owner
-  however is only allowed to register one agent.
-
-  The selection of which agents is used  should be matched by bus name
-  owner if possible or first come first serve. A graceful fallback to
-  the next agent should be also used in case of malfunctional agents.
-
 - Remove --nobacktrace option
 
- Priority: Medium
- Complexity: C1
- When: 2.0
-
- Remove the --nobacktrace option or change it to --backtrace depending on the
- level of systemd integration or other factors.
-
-
-- Clean up type definitions
-
    Priority: Medium
    Complexity: C1
+   When: 2.0
 
-   Go through variable types and use the following:
-   * bool from <stdbool.h> instead of connman_bool_t and gboolean, in the
-     latter case in those places it makes sense
+   Remove the --nobacktrace option or change it to --backtrace depending on
+   the level of systemd integration or other factors.
 
 
 - Clean up data structure usage
@@ -106,12 +69,6 @@ Core
    and oFono in general.
 
 
-- DHCPv6 DECLINE message support
-
-   Priority: Medium
-   Complexity: C2
-
-
 - Support other time sources than NTP
 
    Priority: Medium
@@ -206,17 +163,25 @@ VPN
    code and only allow "PPPD." prefix for PPP options.
 
 
+- Update VPNC and OpenVPN with Agent support
+
+   Priority: Medium
+   Complexity: C2
+
+   Update VPNC and OpenVPN with VPN Agent support to request possible user
+   ids and passphrases.
+
+
 Tools
 =====
 
-- Add Session mode, VPN and Clock API support to connmanctl command line tool
+- Add Clock API and MoveBefore/MoveAfter support to connmanctl
 
    Priority: Low
    Complexity: C2
 
-   The connmanctl command line tool should support Session mode and VPN
-   Agent with a set of suitable commands used in both interactive and
-   non-interactive mode. Also add support for Clock API.
+   The connmanctl command line tool should support Clock API and Service API
+   MoveBefore/MoveAfter.
 
 
 User Interface
index 0a59871..9e8e0dc 100644 (file)
@@ -12,7 +12,7 @@ AC_DEFUN([AC_PROG_CC_PIE], [
 
 AC_DEFUN([COMPILER_FLAGS], [
        if (test "${CFLAGS}" = ""); then
-               CFLAGS="-Wall -O2 -D_FORTIFY_SOURCE=2"
+               CFLAGS="-Wall -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
        fi
        if (test "$USE_MAINTAINER_MODE" = "yes"); then
                CFLAGS+=" -Werror -Wextra"
@@ -25,37 +25,3 @@ AC_DEFUN([COMPILER_FLAGS], [
                CFLAGS="$CFLAGS -DG_DISABLE_DEPRECATED"
        fi
 ])
-
-AC_DEFUN([GTK_DOC_CHECK],
-[
-  AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
-  AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
-  dnl for overriding the documentation installation directory
-  AC_ARG_WITH([html-dir],
-    AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
-    [with_html_dir='${datadir}/gtk-doc/html'])
-  HTML_DIR="$with_html_dir"
-  AC_SUBST([HTML_DIR])
-
-  dnl enable/disable documentation building
-  AC_ARG_ENABLE([gtk-doc],
-    AS_HELP_STRING([--enable-gtk-doc],
-                   [use gtk-doc to build documentation [[default=no]]]),,
-    [enable_gtk_doc=no])
-
-  if test x$enable_gtk_doc = xyes; then
-    ifelse([$1],[],
-      [PKG_CHECK_EXISTS([gtk-doc],,
-                        AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))],
-      [PKG_CHECK_EXISTS([gtk-doc >= $1],,
-                        AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build gtk-doc]))])
-  fi
-
-  AC_MSG_CHECKING([whether to build gtk-doc documentation])
-  AC_MSG_RESULT($enable_gtk_doc)
-
-  AC_PATH_PROGS(GTKDOC_CHECK,gtkdoc-check,)
-
-  AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes])
-  AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"])
-])
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..04c5297
--- /dev/null
@@ -0,0 +1,9852 @@
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+                  [m4_fatal([Libtool version $1 or higher is required],
+                            63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\    *)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+       [m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+       [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+       [tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+          m4_quote(lt_decl_varnames),
+       m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+                       lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+                                          [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+       dnl If the libtool generation code has been placed in $CONFIG_LT,
+       dnl instead of duplicating it all over again into config.status,
+       dnl then we will have config.status run $CONFIG_LT later, so it
+       dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],                 [_LT_LANG(C)],
+  [C++],               [_LT_LANG(CXX)],
+  [Go],                        [_LT_LANG(GO)],
+  [Java],              [_LT_LANG(GCJ)],
+  [Fortran 77],                [_LT_LANG(F77)],
+  [Fortran],           [_LT_LANG(FC)],
+  [Windows Resource],  [_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+       [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+       [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+       [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+       # By default we will add the -single_module flag. You can override
+       # by either setting the environment variable LT_MULTI_MODULE
+       # non-empty at configure time, or by adding -multi_module to the
+       # link flags.
+       rm -rf libconftest.dylib*
+       echo "int foo(void){return 1;}" > conftest.c
+       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&AS_MESSAGE_LOG_FD
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+         lt_cv_apple_cc_single_mod=yes
+       else
+         cat conftest.err >&AS_MESSAGE_LOG_FD
+       fi
+       rm -rf libconftest.dylib*
+       rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+       [lt_cv_ld_exported_symbols_list=yes],
+       [lt_cv_ld_exported_symbols_list=no])
+       LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+       10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+       10.[[012]]*)
+         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+       10.*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+       HPUX_IA64_MODE="32"
+       ;;
+      *ELF-64*)
+       HPUX_IA64_MODE="64"
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -melf32bsmip"
+         ;;
+       *N32*)
+         LD="${LD-ld} -melf32bmipn32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -melf64bmip"
+       ;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -32"
+         ;;
+       *N32*)
+         LD="${LD-ld} -n32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -64"
+         ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_i386_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_i386"
+           ;;
+         ppc64-*linux*|powerpc64-*linux*)
+           LD="${LD-ld} -m elf32ppclinux"
+           ;;
+         s390x-*linux*)
+           LD="${LD-ld} -m elf_s390"
+           ;;
+         sparc64-*linux*)
+           LD="${LD-ld} -m elf32_sparc"
+           ;;
+       esac
+       ;;
+      *64-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_x86_64_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_x86_64"
+           ;;
+         ppc*-*linux*|powerpc*-*linux*)
+           LD="${LD-ld} -m elf64ppc"
+           ;;
+         s390*-*linux*|s390*-*tpf*)
+           LD="${LD-ld} -m elf64_s390"
+           ;;
+         sparc*-*linux*)
+           LD="${LD-ld} -m elf64_sparc"
+           ;;
+       esac
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+       if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+         LD="${LD-ld} -64"
+       fi
+       ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+       # Ensure the archiver fails upon bogus file names.
+       rm -f conftest.$ac_objext libconftest.a
+       AC_TRY_EVAL([lt_ar_try])
+       if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#              [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536      # usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[        ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+             test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+               [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+         [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+           [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+       [AC_CHECK_FUNC([dlopen],
+             [lt_cv_dlopen="dlopen"],
+         [AC_CHECK_LIB([dl], [dlopen],
+               [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+           [AC_CHECK_LIB([svld], [dlopen],
+                 [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+             [AC_CHECK_LIB([dld], [dld_link],
+                   [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+             ])
+           ])
+         ])
+       ])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+         lt_cv_dlopen_self, [dnl
+         _LT_TRY_DLOPEN_SELF(
+           lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+           lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+         lt_cv_dlopen_self_static, [dnl
+         _LT_TRY_DLOPEN_SELF(
+           lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+           lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+        [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+        [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+        [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+       [Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+       [], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+       lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux # correct to gnu/linux during the next big refactor
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+        LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+        [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[  ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+        [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+       [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+       # Check to see if the nm accepts a BSD-compat flag.
+       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       #   nm: unknown option "B" ignored
+       # Tru64's nm complains that /dev/null is an invalid object file
+       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+       */dev/null* | *'Invalid file or object type'*)
+         lt_cv_path_NM="$tmp_nm -B"
+         break
+         ;;
+       *)
+         case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+         */dev/null*)
+           lt_cv_path_NM="$tmp_nm -p"
+           break
+           ;;
+         *)
+           lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+           continue # so that we can try to find one that supports BSD flags
+           ;;
+         esac
+         ;;
+       esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+       [Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[    ]]\($symcode$symcode*\)[[       ]][[    ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+       if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+         cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         lt_globsym_save_LIBS=$LIBS
+         lt_globsym_save_CFLAGS=$CFLAGS
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+         if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+           pipe_works=yes
+         fi
+         LIBS=$lt_globsym_save_LIBS
+         CFLAGS=$lt_globsym_save_CFLAGS
+       else
+         echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+       [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       ;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+       # All AIX code is PIC.
+       if test "$host_cpu" = ia64; then
+         # AIX 5 now supports IA64 processor
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+       else
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+       fi
+       ;;
+      chorus*)
+       case $cc_basename in
+       cxch68*)
+         # Green Hills C++ Compiler
+         # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+         ;;
+       esac
+       ;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+       # This hack is so that the source file can tell whether it is being
+       # built for inclusion in a dll (and should export symbols for example).
+       m4_if([$1], [GCJ], [],
+         [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+       ;;
+      dgux*)
+       case $cc_basename in
+         ec++*)
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           ;;
+         ghcx*)
+           # Green Hills C++ Compiler
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      freebsd* | dragonfly*)
+       # FreeBSD uses GNU C++
+       ;;
+      hpux9* | hpux10* | hpux11*)
+       case $cc_basename in
+         CC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+           if test "$host_cpu" != ia64; then
+             _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+           fi
+           ;;
+         aCC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+           case $host_cpu in
+           hppa*64*|ia64*)
+             # +Z the default
+             ;;
+           *)
+             _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+             ;;
+           esac
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      interix*)
+       # This is c89, which is MS Visual C++ (no shared libs)
+       # Anyone wants to do a port?
+       ;;
+      irix5* | irix6* | nonstopux*)
+       case $cc_basename in
+         CC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+           # CC pic flag -KPIC is the default.
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+       case $cc_basename in
+         KCC*)
+           # KAI C++ Compiler
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+           ;;
+         ecpc* )
+           # old Intel C++ for x86_64 which still supported -KPIC.
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+           ;;
+         icpc* )
+           # Intel C++, used to be incompatible with GCC.
+           # ICC 10 doesn't accept -KPIC any more.
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+           ;;
+         pgCC* | pgcpp*)
+           # Portland Group C++ compiler
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           ;;
+         cxx*)
+           # Compaq C++
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+           ;;
+         xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+           # IBM XL 8.0, 9.0 on PPC and BlueGene
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+             _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+             _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+      lynxos*)
+       ;;
+      m88k*)
+       ;;
+      mvs*)
+       case $cc_basename in
+         cxx*)
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      netbsd* | netbsdelf*-gnu)
+       ;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+       case $cc_basename in
+         KCC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+           ;;
+         RCC*)
+           # Rational C++ 2.4.1
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           ;;
+         cxx*)
+           # Digital/Compaq C++
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      psos*)
+       ;;
+      solaris*)
+       case $cc_basename in
+         CC* | sunCC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+           ;;
+         gcx*)
+           # Green Hills C++ Compiler
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sunos4*)
+       case $cc_basename in
+         CC*)
+           # Sun C++ 4.x
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           ;;
+         lcc*)
+           # Lucid
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+       case $cc_basename in
+         CC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           ;;
+       esac
+       ;;
+      tandem*)
+       case $cc_basename in
+         NCC*)
+           # NonStop-UX NCC 3.20
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      vxworks*)
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+       ;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+       [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       # +Z the default
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       ;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+       [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+       # +Z the default
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+       ;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+       ;;
+      nagfor*)
+       # NAG Fortran compiler
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+       # which looks to be a dead project)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+       ;;
+      *)
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+         ;;
+       *Sun\ F* | *Sun*Fortran*)
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+         ;;
+       *Sun\ C*)
+         # Sun C 5.9
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         ;;
+        *Intel*\ [[CF]]*Compiler*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+         ;;
+       *Portland\ Group*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         ;;
+       esac
+       ;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+       [Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+       [How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+       [Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+         *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+       # support --undefined.  This deserves some investigation.  FIXME
+       _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file (1st line
+       # is EXPORTS), use it as is; otherwise, prepend...
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+         cp $export_symbols $output_objdir/$soname.def;
+       else
+         echo EXPORTS > $output_objdir/$soname.def;
+         cat $export_symbols >> $output_objdir/$soname.def;
+       fi~
+       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+       case $cc_basename in
+         diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
+       esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+        && test "$tmp_diet" = no
+      then
+       tmp_addflag=' $pic_flag'
+       tmp_sharedflag='-shared'
+       case $cc_basename,$host_cpu in
+        pgcc*)                         # Portland Group C compiler
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag'
+         ;;
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag -Mnomain' ;;
+       ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
+         tmp_addflag=' -i_dynamic' ;;
+       efc*,ia64* | ifort*,ia64*)      # Intel Fortran compiler on ia64
+         tmp_addflag=' -i_dynamic -nofor_main' ;;
+       ifc* | ifort*)                  # Intel Fortran compiler
+         tmp_addflag=' -nofor_main' ;;
+       lf95*)                          # Lahey Fortran 8.1
+         _LT_TAGVAR(whole_archive_flag_spec, $1)=
+         tmp_sharedflag='--shared' ;;
+       xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+         tmp_sharedflag='-qmkshrobj'
+         tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(compiler_needs_object, $1)=yes
+         ;;
+       esac
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ C*)                       # Sun C 5.9
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(compiler_needs_object, $1)=yes
+         tmp_sharedflag='-G' ;;
+       *Sun\ F*)                       # Sun Fortran 8.3
+         tmp_sharedflag='-G' ;;
+       esac
+       _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+           echo "local: *; };" >> $output_objdir/$libname.ver~
+           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+       case $cc_basename in
+       xlf* | bgf* | bgxlf* | mpixlf*)
+         # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+         _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+         if test "x$supports_anon_versioning" = xyes; then
+           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+             echo "local: *; };" >> $output_objdir/$libname.ver~
+             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+         fi
+         ;;
+       esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+       wlarc=
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+       ;;
+       *)
+         # For security reasons, it is highly recommended that you always
+         # use absolute paths for naming shared libraries, and exclude the
+         # DT_RUNPATH tag from executables and libraries.  But doing so
+         # requires that you compile everything twice, which is a pain.
+         if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+         else
+           _LT_TAGVAR(ld_shlibs, $1)=no
+         fi
+       ;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+       # Neither direct hardcoding nor static linking is supported with a
+       # broken collect2.
+       _LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+       # On IA64, the linker does run time linking by default, so we don't
+       # have to do anything special.
+       aix_use_runtimelinking=no
+       exp_sym_flag='-Bexport'
+       no_entry_flag=""
+      else
+       # If we're using GNU nm, then we don't want the "-C" option.
+       # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
+       if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       else
+         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       fi
+       aix_use_runtimelinking=no
+
+       # Test if we are trying to use run time linking or normal
+       # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+       # need to do runtime linking.
+       case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+         for ld_flag in $LDFLAGS; do
+         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+           aix_use_runtimelinking=yes
+           break
+         fi
+         done
+         ;;
+       esac
+
+       exp_sym_flag='-bexport'
+       no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+       case $host_os in aix4.[[012]]|aix4.[[012]].*)
+       # We only want to do this on AIX 4.2 and lower, the check
+       # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+          strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+         # We have reworked collect2
+         :
+         else
+         # We have old collect2
+         _LT_TAGVAR(hardcode_direct, $1)=unsupported
+         # It fails to find uninstalled libraries when the uninstalled
+         # path is not listed in the libpath.  Setting hardcode_minus_L
+         # to unsupported forces relinking
+         _LT_TAGVAR(hardcode_minus_L, $1)=yes
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+         _LT_TAGVAR(hardcode_libdir_separator, $1)=
+         fi
+         ;;
+       esac
+       shared_flag='-shared'
+       if test "$aix_use_runtimelinking" = yes; then
+         shared_flag="$shared_flag "'${wl}-G'
+       fi
+       _LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+       # not using gcc
+       if test "$host_cpu" = ia64; then
+       # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+       # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+       else
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag='${wl}-G'
+         else
+           shared_flag='${wl}-bM:SRE'
+         fi
+       fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+       # Warning - without using the other runtime loading flags (-brtl),
+       # -berok will link without error, but may produce a broken library.
+       _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+       if test "$host_cpu" = ia64; then
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+         _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+       else
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+         # Warning - without using the other run time loading flags,
+         # -berok will link without error, but may produce a broken library.
+         _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+         _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+         fi
+         _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+         # This is similar to how AIX traditionally builds its shared libraries.
+         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+       fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+       # Native MSVC
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       _LT_TAGVAR(always_export_symbols, $1)=yes
+       _LT_TAGVAR(file_list_spec, $1)='@'
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+         else
+           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+         fi~
+         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+         linknames='
+       # The linker will not automatically build a static lib if we build a DLL.
+       # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+       _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+       # Don't use ranlib
+       _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+       _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+         lt_tool_outputfile="@TOOL_OUTPUT@"~
+         case $lt_outputfile in
+           *.exe|*.EXE) ;;
+           *)
+             lt_outputfile="$lt_outputfile.exe"
+             lt_tool_outputfile="$lt_tool_outputfile.exe"
+             ;;
+         esac~
+         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+           $RM "$lt_outputfile.manifest";
+         fi'
+       ;;
+      *)
+       # Assume MSVC wrapper
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+       # The linker will automatically build a .lib file if we build a DLL.
+       _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+       # FIXME: Should let the user specify the lib program.
+       _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       ;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+       _LT_TAGVAR(hardcode_direct, $1)=yes
+       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       # hardcode_minus_L: Not really in the search PATH,
+       # but as the default location of the library.
+       _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       case $host_cpu in
+       hppa*64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       esac
+      else
+       case $host_cpu in
+       hppa*64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+       m4_if($1, [], [
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         _LT_LINKER_OPTION([if $CC understands -b],
+           _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+           [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+           [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+         [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+         ;;
+       esac
+      fi
+      if test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+       case $host_cpu in
+       hppa*64*|ia64*)
+         _LT_TAGVAR(hardcode_direct, $1)=no
+         _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+         ;;
+       *)
+         _LT_TAGVAR(hardcode_direct, $1)=yes
+         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+         # hardcode_minus_L: Not really in the search PATH,
+         # but as the default location of the library.
+         _LT_TAGVAR(hardcode_minus_L, $1)=yes
+         ;;
+       esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       # Try to use the -exported_symbol ld option, if it does not
+       # work, assume that -exports_file does not work either and
+       # implicitly export all symbols.
+       # This should be the same for all languages, so no per-tag cache variable.
+       AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+         [lt_cv_irix_exported_symbol],
+         [save_LDFLAGS="$LDFLAGS"
+          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+          AC_LINK_IFELSE(
+            [AC_LANG_SOURCE(
+               [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+                             [C++], [[int foo (void) { return 0; }]],
+                             [Fortran 77], [[
+      subroutine foo
+      end]],
+                             [Fortran], [[
+      subroutine foo
+      end]])])],
+             [lt_cv_irix_exported_symbol=yes],
+             [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+       if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       fi
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+       _LT_TAGVAR(hardcode_direct, $1)=yes
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       else
+         case $host_os in
+          openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+            _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+            ;;
+          *)
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+            ;;
+         esac
+       fi
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+       _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)     # as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+       _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+       # Both c and cxx compiler support -rpath directly
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+       wlarc='${wl}'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+       case `$CC -V 2>&1` in
+       *"Compilers 5.0"*)
+         wlarc=''
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+         ;;
+       *)
+         wlarc='${wl}'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         ;;
+       esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+       # The compiler driver will combine and reorder linker options,
+       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but is careful enough not to reorder.
+       # Supported since Solaris 2.6 (maybe 2.5.1?)
+       if test "$GCC" = yes; then
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       else
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+       fi
+       ;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+       # Use $CC to link under sequent, because it throws in some extra .o
+       # files that make .init and .fini sections work.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+       sni)
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+       ;;
+       siemens)
+         ## LD is ld it makes a PLAMLIB
+         ## CC just makes a GrossModule.
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+         _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+       motorola)
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+       ;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       runpath_var=LD_RUN_PATH
+       hardcode_runpath_var=yes
+       _LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+       ;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+       [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+       [$RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+         pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+         _LT_TAGVAR(allow_undefined_flag, $1)=
+         if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+         then
+           lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+         else
+           lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+         fi
+         _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+       ])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+         $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+           for ld_flag in $LDFLAGS; do
+             case $ld_flag in
+             *-brtl*)
+               aix_use_runtimelinking=yes
+               break
+               ;;
+             esac
+           done
+           ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+            strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+           # We have reworked collect2
+           :
+         else
+           # We have old collect2
+           _LT_TAGVAR(hardcode_direct, $1)=unsupported
+           # It fails to find uninstalled libraries when the uninstalled
+           # path is not listed in the libpath.  Setting hardcode_minus_L
+           # to unsupported forces relinking
+           _LT_TAGVAR(hardcode_minus_L, $1)=yes
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=
+         fi
+          esac
+          shared_flag='-shared'
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag="$shared_flag "'${wl}-G'
+         fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+         # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+         # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+          else
+           if test "$aix_use_runtimelinking" = yes; then
+             shared_flag='${wl}-G'
+           else
+             shared_flag='${wl}-bM:SRE'
+           fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+       # export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+           _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+           # Determine the default libpath from the value encoded in an
+           # empty executable.
+           _LT_SYS_MODULE_PATH_AIX([$1])
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+           # Warning - without using the other run time loading flags,
+           # -berok will link without error, but may produce a broken library.
+           _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+           _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+           if test "$with_gnu_ld" = yes; then
+             # We only use this code for GNU lds that support --whole-archive.
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           else
+             # Exported symbols can be pulled into shared objects from archives
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+           fi
+           _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+           # This is similar to how AIX traditionally builds its shared
+           # libraries.
+           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+         # support --undefined.  This deserves some investigation.  FIXME
+         _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       else
+         _LT_TAGVAR(ld_shlibs, $1)=no
+       fi
+       ;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+         # FIXME: insert proper C++ library support
+         _LT_TAGVAR(ld_shlibs, $1)=no
+         ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+       case $GXX,$cc_basename in
+       ,cl* | no,cl*)
+         # Native MSVC
+         # hardcode_libdir_flag_spec is actually meaningless, as there is
+         # no search path for DLLs.
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         _LT_TAGVAR(always_export_symbols, $1)=yes
+         _LT_TAGVAR(file_list_spec, $1)='@'
+         # Tell ltmain to make .lib files, not .a files.
+         libext=lib
+         # Tell ltmain to make .dll files, not .so files.
+         shrext_cmds=".dll"
+         # FIXME: Setting linknames here is a bad hack.
+         _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+         _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+           else
+             $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+           fi~
+           $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+           linknames='
+         # The linker will not automatically build a static lib if we build a DLL.
+         # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+         _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+         # Don't use ranlib
+         _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+         _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+           lt_tool_outputfile="@TOOL_OUTPUT@"~
+           case $lt_outputfile in
+             *.exe|*.EXE) ;;
+             *)
+               lt_outputfile="$lt_outputfile.exe"
+               lt_tool_outputfile="$lt_tool_outputfile.exe"
+               ;;
+           esac~
+           func_to_tool_file "$lt_outputfile"~
+           if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+             $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+             $RM "$lt_outputfile.manifest";
+           fi'
+         ;;
+       *)
+         # g++
+         # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+         # as there is no search path for DLLs.
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         _LT_TAGVAR(always_export_symbols, $1)=no
+         _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+         if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           # If the export-symbols file already is a .def file (1st line
+           # is EXPORTS), use it as is; otherwise, prepend...
+           _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             cp $export_symbols $output_objdir/$soname.def;
+           else
+             echo EXPORTS > $output_objdir/$soname.def;
+             cat $export_symbols >> $output_objdir/$soname.def;
+           fi~
+           $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+         else
+           _LT_TAGVAR(ld_shlibs, $1)=no
+         fi
+         ;;
+       esac
+       ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+       ;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          ghcx*)
+           # Green Hills C++ Compiler
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+       # switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+                                            # but as the default
+                                            # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+             _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+                                                # but as the default
+                                                # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          aCC*)
+           case $host_cpu in
+             hppa*64*)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             ia64*)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             *)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+           esac
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test $with_gnu_ld = no; then
+               case $host_cpu in
+                 hppa*64*)
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 ia64*)
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 *)
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+               esac
+             fi
+           else
+             # FIXME: insert proper C++ library support
+             _LT_TAGVAR(ld_shlibs, $1)=no
+           fi
+           ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+       _LT_TAGVAR(hardcode_direct, $1)=no
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+       # Instead, shared libraries are loaded at an image base (0x10000000 by
+       # default) and relocated if they conflict, which is a slow very memory
+       # consuming and fragmenting process.  To avoid this, we pick a random,
+       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       ;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+           # SGI C++
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+           # Archives containing C++ object files must be created using
+           # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test "$with_gnu_ld" = no; then
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+             else
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+             fi
+           fi
+           _LT_TAGVAR(link_all_deplibs, $1)=yes
+           ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+           # Archives containing C++ object files must be created using
+           # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+           ;;
+         icpc* | ecpc* )
+           # Intel C++
+           with_gnu_ld=yes
+           # version 8.0 and above of icpc choke on multiply defined symbols
+           # if we add $predep_objects and $postdep_objects, however 7.1 and
+           # earlier do not add the objects themselves.
+           case `$CC -V 2>&1` in
+             *"Version 7."*)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+             *)  # Version 8.0 or newer
+               tmp_idyn=
+               case $host_cpu in
+                 ia64*) tmp_idyn=' -i_dynamic';;
+               esac
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+           esac
+           _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+           case `$CC -V` in
+           *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+             _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+             _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+               $RANLIB $oldlib'
+             _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           *) # Version 6 and above use weak symbols
+             _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           esac
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+         cxx*)
+           # Compaq C++
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+           runpath_var=LD_RUN_PATH
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+           ;;
+         xl* | mpixl* | bgxl*)
+           # IBM XL 8.0 on PPC, with GNU ld
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           if test "x$supports_anon_versioning" = xyes; then
+             _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+               cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+               echo "local: *; };" >> $output_objdir/$libname.ver~
+               $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+           fi
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+             _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+             _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+             # Not sure whether something based on
+             # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+             # would be better.
+             output_verbose_link_cmd='func_echo_all'
+
+             # Archives containing C++ object files must be created using
+             # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+             # necessary to make sure instantiated templates are included
+             # in the archive.
+             _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       ;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+       ;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+         *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+       esac
+       ;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+         _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+         wlarc=
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+         _LT_TAGVAR(hardcode_direct, $1)=yes
+         _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       fi
+       # Workaround some broken pre-1.5 toolchains
+       output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+       ;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+       ;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       ;;
+
+      openbsd*)
+       if test -f /usr/libexec/ld.so; then
+         _LT_TAGVAR(hardcode_direct, $1)=yes
+         _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+         fi
+         output_verbose_link_cmd=func_echo_all
+       else
+         _LT_TAGVAR(ld_shlibs, $1)=no
+       fi
+       ;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+           # Archives containing C++ object files must be created using
+           # the KAI C++ compiler.
+           case $host in
+             osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+             *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+           esac
+           ;;
+          RCC*)
+           # Rational C++ 2.4.1
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          cxx*)
+           case $host in
+             osf3*)
+               _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+               ;;
+             *)
+               _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                 echo "-hidden">> $lib.exp~
+                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+                 $RM $lib.exp'
+               _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+               ;;
+           esac
+
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+         *)
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+             case $host in
+               osf3*)
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+               *)
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+             esac
+
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+             _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+             # Commands to make compiler produce verbose output that lists
+             # what "hidden" libraries, object files and flags are used when
+             # linking a shared library.
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+           else
+             # FIXME: insert proper C++ library support
+             _LT_TAGVAR(ld_shlibs, $1)=no
+           fi
+           ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+           # Sun C++ 4.x
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          lcc*)
+           # Lucid
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+           _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+             $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+           _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+           case $host_os in
+             solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+             *)
+               # The compiler driver will combine and reorder linker options,
+               # but understands `-z linker_flag'.
+               # Supported since Solaris 2.6 (maybe 2.5.1?)
+               _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+               ;;
+           esac
+           _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+           output_verbose_link_cmd='func_echo_all'
+
+           # Archives containing C++ object files must be created using
+           # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+           ;;
+          gcx*)
+           # Green Hills C++ Compiler
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+           # The C++ compiler must be used to create the archive.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+           ;;
+          *)
+           # GNU C++ compiler with Solaris linker
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+             if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             else
+               # g++ 2.7 appears to require `-G' NOT `-shared' on this
+               # platform.
+               _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             fi
+
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+             case $host_os in
+               solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+               *)
+                 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+                 ;;
+             esac
+           fi
+           ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+       # Note: We can NOT use -z defs as we might desire, because we do not
+       # link with -lc, and that would cause any symbols used from libc to
+       # always be unresolved, which means just about no library would
+       # ever link correctly.  If we're not using GNU ld we use -z text
+       # though, which does catch some bad symbols but isn't as heavy-handed
+       # as -z defs.
+       _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+       _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+       _LT_TAGVAR(link_all_deplibs, $1)=yes
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+       runpath_var='LD_RUN_PATH'
+
+       case $cc_basename in
+          CC*)
+           _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+             '"$_LT_TAGVAR(old_archive_cmds, $1)"
+           _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+             '"$_LT_TAGVAR(reload_cmds, $1)"
+           ;;
+         *)
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           ;;
+       esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+           # NonStop-UX NCC 3.20
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+        prev=$p
+        continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+        case ${prev} in
+        -L | -R)
+          # Internal compiler library paths should come after those
+          # provided the user.  The postdeps already come after the
+          # user supplied libs so there is no need to process them.
+          if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+            _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+          else
+            _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+          fi
+          ;;
+        # The "-l" case would never come before the object being
+        # linked, so don't bother handling this case.
+        esac
+       else
+        if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+          _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+        else
+          _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+        fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+        pre_test_object_deps_done=yes
+        continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+        if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+          _LT_TAGVAR(predep_objects, $1)="$p"
+        else
+          _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+        fi
+       else
+        if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+          _LT_TAGVAR(postdep_objects, $1)="$p"
+        else
+          _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+        fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+       if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+         test "$enable_shared" = yes && enable_static=no
+       fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+       if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+         test "$enable_shared" = yes && enable_static=no
+       fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([    ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
+
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+           [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+                     [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+                  [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+       [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_shared=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+       [Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+       [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_static=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+       [Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_fast_install=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+        [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+       [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+                [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+                [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+                [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+                [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+                [m4_define([_LTDL_TYPE], [convenience])])
+
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+          m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+            [m4_foreach([_Lt_suffix],
+               ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+       [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+         [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+                [lt_append([$1], [$2], [$3])$4],
+                [$5])],
+         [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+       m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+       [$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+                     [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
+
+# ltversion.m4 -- version numbers                      -*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],  [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],             [AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],        [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],         [AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],    [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],           [AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],             [AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],    [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],           [AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],       [AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],               [AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],        [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],    [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],    [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],         [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],            [AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],  [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],             [AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],            [AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],    [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],   [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],          [AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],            [AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],           [AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],  [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],    [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],          [AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],          [AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],                [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],     [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],          [AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],   [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],           [AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],           [AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],           [AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],  [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],      [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],    [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],    [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],    [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],     [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],         [AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],       [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],        [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],                [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],        [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],   [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],              [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],               [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],              [AC_DEFUN([_LT_PROG_CXX])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# serial 1 (pkg-config-0.24)
+# 
+# Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+# only at the first occurence in configure.ac, so if the first place
+# it's called might be skipped (such as if it is within an "if", you
+# have to call PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_default([$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes ],
+                    [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+       AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+       AC_MSG_RESULT([no])
+       m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+        ])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       $3
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.6], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+             [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                 [_AM_DEPENDENCIES(CC)],
+                 [define([AC_PROG_CC],
+                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                 [_AM_DEPENDENCIES(CXX)],
+                 [define([AC_PROG_CXX],
+                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                 [_AM_DEPENDENCIES(OBJC)],
+                 [define([AC_PROG_OBJC],
+                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_PROG_CC_C_O
+# --------------
+# Like AC_PROG_CC_C_O, but changed for automake.
+AC_DEFUN([AM_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC_C_O])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+dnl Make sure AC_PROG_CC is never called again, or it will override our
+dnl setting of CC.
+m4_define([AC_PROG_CC],
+          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2009, 2011  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# (`yes' being less verbose, `no' or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules],
+[  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')])
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few `make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using `$V' instead of `$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([acinclude.m4])
diff --git a/bootstrap b/bootstrap
deleted file mode 100755 (executable)
index 0dd71d9..0000000
--- a/bootstrap
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-aclocal && \
-    autoheader && \
-        libtoolize --automake --copy --force && \
-           automake --add-missing --copy && \
-               autoconf
diff --git a/bootstrap-configure b/bootstrap-configure
deleted file mode 100755 (executable)
index 0741bcd..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-if [ -f config.status ]; then
-       make maintainer-clean
-fi
-
-if [ ! -f doc/gtk-doc.make ]; then
-       gtkdocize --copy --docdir doc
-fi
-
-./bootstrap && \
-    ./configure --enable-maintainer-mode \
-               --enable-debug \
-               --prefix=/usr \
-               --mandir=/usr/share/man \
-               --localstatedir=/var \
-               --sysconfdir=/etc \
-               --disable-datafiles \
-               --enable-openconnect=builtin \
-               --enable-openvpn=builtin \
-               --enable-vpnc=builtin \
-               --enable-session-policy-local=builtin \
-               --enable-nmcompat \
-               --enable-polkit $*
index 12b0a98..baa0a87 100644 (file)
@@ -95,6 +95,11 @@ static struct agent_data agent_request = {
 static struct agent_input_data vpnagent_input_handler[] = {
        { "OpenConnect.Cookie", false, "OpenConnect Cookie? ",
          request_input_string_return },
+       { "OpenConnect.ServerCert", false,
+         "OpenConnect server certificate hash? ",
+         request_input_string_return },
+       { "OpenConnect.VPNHost", false, "OpenConnect VPN server? ",
+         request_input_string_return },
        { "Username", false, "VPN username? ", request_input_string_return },
        { "Password", false, "VPN password? ", request_input_string_return },
        { },
@@ -109,7 +114,7 @@ static int confirm_input(char *input)
 {
        int i;
 
-       if (input == NULL)
+       if (!input)
                return -1;
 
        for (i = 0; input[i] != '\0'; i++)
@@ -130,7 +135,7 @@ static int confirm_input(char *input)
 static char *strip_path(char *path)
 {
        char *name = strrchr(path, '/');
-       if (name != NULL)
+       if (name)
                name++;
        else
                name = path;
@@ -142,7 +147,7 @@ static char *agent_path(void)
 {
        static char *path = NULL;
 
-       if (path == NULL)
+       if (!path)
                path = g_strdup_printf("/net/connman/connmanctl%d", getpid());
 
        return path;
@@ -150,12 +155,12 @@ static char *agent_path(void)
 
 static void pending_message_remove(struct agent_data *request)
 {
-       if (request->message != NULL) {
+       if (request->message) {
                dbus_message_unref(request->message);
                request->message = NULL;
        }
 
-       if (request->reply != NULL) {
+       if (request->reply) {
                dbus_message_unref(request->reply);
                request->reply = NULL;
        }
@@ -178,12 +183,12 @@ static void pending_command_complete(char *message)
        else
                __connmanctl_agent_mode("", NULL, NULL);
 
-       if (agent_request.message != NULL)
+       if (agent_request.message)
                next_request = &agent_request;
-       else if (vpn_agent_request.message != NULL)
+       else if (vpn_agent_request.message)
                next_request = &vpn_agent_request;
 
-       if (next_request == NULL)
+       if (!next_request)
                return;
 
        pending_message = next_request->message;
@@ -199,8 +204,8 @@ static void pending_command_complete(char *message)
 static bool handle_message(DBusMessage *message, struct agent_data *request,
                GDBusMethodFunction function)
 {
-       if (agent_request.pending_function == NULL &&
-                       vpn_agent_request.pending_function == NULL)
+       if (!agent_request.pending_function &&
+                       !vpn_agent_request.pending_function)
                return true;
 
        request->message = dbus_message_ref(message);
@@ -367,9 +372,9 @@ static void request_input_next(struct agent_data *request)
 {
        int i;
 
-       for (i = 0; request->input[i].attribute != NULL; i++) {
+       for (i = 0; request->input[i].attribute; i++) {
                if (request->input[i].requested == true) {
-                       if(request->input[i].func != NULL)
+                       if (request->input[i].func)
                                __connmanctl_agent_mode(request->input[i].prompt,
                                                request->input[i].func,
                                                request);
@@ -403,7 +408,7 @@ static void request_input_ssid_return(char *input,
        struct agent_data *request = user_data;
        int len = 0;
 
-       if (input != NULL)
+       if (input)
                len = strlen(input);
 
        if (len > 0 && len <= 32) {
@@ -422,7 +427,7 @@ static void request_input_passphrase_return(char *input, void *user_data)
 
        /* TBD passphrase length checking */
 
-       if (input != NULL)
+       if (input)
                len = strlen(input);
 
        if (len == 0 && request->input[WPS].requested == false)
@@ -445,7 +450,7 @@ static void request_input_string_return(char *input, void *user_data)
        struct agent_data *request = user_data;
        int i;
 
-       for (i = 0; request->input[i].attribute != NULL; i++) {
+       for (i = 0; request->input[i].attribute; i++) {
                if (request->input[i].requested == true) {
                        request_input_append(request,
                                        request->input[i].attribute, input);
@@ -464,7 +469,7 @@ static DBusMessage *agent_request_input(DBusConnection *connection,
        DBusMessageIter iter, dict, entry, variant;
        char *service, *str, *field;
        DBusMessageIter dict_entry, field_entry, field_value;
-       char *argument, *value, *attr_type;
+       char *argument, *value, *attr_type = NULL;
 
        int i;
 
@@ -519,7 +524,7 @@ static DBusMessage *agent_request_input(DBusConnection *connection,
                        dbus_message_iter_next(&dict_entry);
                }
 
-               for (i = 0; request->input[i].attribute != NULL; i++) {
+               for (i = 0; request->input[i].attribute; i++) {
                        if (strcmp(field, request->input[i].attribute) == 0) {
                                request->input[i].requested = true;
                                break;
@@ -570,7 +575,7 @@ static int agent_register_return(DBusMessageIter *iter, const char *error,
 {
        DBusConnection *connection = user_data;
 
-       if (error != NULL) {
+       if (error) {
                g_dbus_unregister_interface(connection, agent_path(),
                                AGENT_INTERFACE);
                fprintf(stderr, "Error registering Agent: %s\n", error);
@@ -583,6 +588,13 @@ static int agent_register_return(DBusMessageIter *iter, const char *error,
        return -EINPROGRESS;
 }
 
+static void append_path(DBusMessageIter *iter, void *user_data)
+{
+       const char *path = user_data;
+
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
+}
+
 int __connmanctl_agent_register(DBusConnection *connection)
 {
        char *path = agent_path();
@@ -595,18 +607,16 @@ int __connmanctl_agent_register(DBusConnection *connection)
 
        agent_connection = connection;
 
-       if (g_dbus_register_interface(connection, path,
+       if (!g_dbus_register_interface(connection, path,
                                        AGENT_INTERFACE, agent_methods,
-                                       NULL, NULL, &agent_request,
-                                       NULL) == FALSE) {
+                                       NULL, NULL, &agent_request, NULL)) {
                fprintf(stderr, "Error: Failed to register Agent callbacks\n");
                return 0;
        }
 
        result = __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
                        CONNMAN_PATH, "net.connman.Manager", "RegisterAgent",
-                       agent_register_return, connection,
-                       DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
+                       agent_register_return, connection, append_path, path);
 
        if (result != -EINPROGRESS) {
                g_dbus_unregister_interface(connection, agent_path(),
@@ -621,7 +631,7 @@ int __connmanctl_agent_register(DBusConnection *connection)
 static int agent_unregister_return(DBusMessageIter *iter, const char *error,
                void *user_data)
 {
-       if (error != NULL) {
+       if (error) {
                fprintf(stderr, "Error unregistering Agent: %s\n", error);
                return 0;
        }
@@ -646,8 +656,7 @@ int __connmanctl_agent_unregister(DBusConnection *connection)
 
        result = __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
                        CONNMAN_PATH, "net.connman.Manager", "UnregisterAgent",
-                       agent_unregister_return, NULL,
-                       DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
+                       agent_unregister_return, NULL, append_path, path);
 
        if (result != -EINPROGRESS)
                fprintf(stderr, "Error: Failed to unregister Agent\n");
@@ -675,7 +684,7 @@ static int vpn_agent_register_return(DBusMessageIter *iter, const char *error,
 {
        DBusConnection *connection = user_data;
 
-       if (error != NULL) {
+       if (error) {
                g_dbus_unregister_interface(connection, agent_path(),
                                VPN_AGENT_INTERFACE);
                fprintf(stderr, "Error registering VPN Agent: %s\n", error);
@@ -700,10 +709,9 @@ int __connmanctl_vpn_agent_register(DBusConnection *connection)
 
        agent_connection = connection;
 
-       if (g_dbus_register_interface(connection, path,
-                                       VPN_AGENT_INTERFACE, vpn_agent_methods,
-                                       NULL, NULL, &vpn_agent_request,
-                                       NULL) == FALSE) {
+       if (!g_dbus_register_interface(connection, path,
+                       VPN_AGENT_INTERFACE, vpn_agent_methods,
+                       NULL, NULL, &vpn_agent_request, NULL)) {
                fprintf(stderr, "Error: Failed to register VPN Agent "
                                "callbacks\n");
                return 0;
@@ -711,8 +719,8 @@ int __connmanctl_vpn_agent_register(DBusConnection *connection)
 
        result = __connmanctl_dbus_method_call(connection, VPN_SERVICE,
                        VPN_PATH, "net.connman.vpn.Manager", "RegisterAgent",
-                       vpn_agent_register_return, connection,
-                       DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
+                       vpn_agent_register_return, connection, append_path,
+                       path);
 
        if (result != -EINPROGRESS) {
                g_dbus_unregister_interface(connection, agent_path(),
@@ -727,7 +735,7 @@ int __connmanctl_vpn_agent_register(DBusConnection *connection)
 static int vpn_agent_unregister_return(DBusMessageIter *iter,
                const char *error, void *user_data)
 {
-       if (error != NULL) {
+       if (error) {
                fprintf(stderr, "Error unregistering VPN Agent: %s\n", error);
                return 0;
        }
@@ -753,8 +761,7 @@ int __connmanctl_vpn_agent_unregister(DBusConnection *connection)
 
        result = __connmanctl_dbus_method_call(connection, VPN_SERVICE,
                        VPN_PATH, "net.connman.vpn.Manager", "UnregisterAgent",
-                       vpn_agent_unregister_return, NULL,
-                       DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
+                       vpn_agent_unregister_return, NULL, append_path, path);
 
        if (result != -EINPROGRESS)
                fprintf(stderr, "Error: Failed to unregister VPN Agent\n");
index 557a8ff..9c01fd5 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -29,6 +29,8 @@
 #include <string.h>
 #include <errno.h>
 #include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
 
 #include <glib.h>
 #include <gdbus.h>
 #include "dbus_helpers.h"
 #include "input.h"
 #include "services.h"
+#include "peers.h"
 #include "commands.h"
 #include "agent.h"
 #include "vpnconnections.h"
 
 static DBusConnection *connection;
+static GHashTable *service_hash;
+static GHashTable *peer_hash;
+static GHashTable *technology_hash;
+static char *session_notify_path;
+static char *session_path;
+static bool session_connected;
 
 struct connman_option {
        const char *name;
@@ -74,7 +83,7 @@ static bool check_dbus_name(const char *name)
         */
        unsigned int i;
 
-       if (name == NULL || name[0] == '\0')
+       if (!name || name[0] == '\0')
                return false;
 
        for (i = 0; name[i] != '\0'; i++)
@@ -89,7 +98,7 @@ static bool check_dbus_name(const char *name)
 
 static int parse_boolean(char *arg)
 {
-       if (arg == NULL)
+       if (!arg)
                return -1;
 
        if (strcasecmp(arg, "no") == 0 ||
@@ -117,10 +126,10 @@ static int parse_args(char *arg, struct connman_option *options)
 {
        int i;
 
-       if (arg == NULL)
+       if (!arg)
                return -1;
 
-       for (i = 0; options[i].name != NULL; i++) {
+       for (i = 0; options[i].name; i++) {
                if (strcmp(options[i].name, arg) == 0 ||
                                (strncmp(arg, "--", 2) == 0 &&
                                        strcmp(&arg[2], options[i].name) == 0))
@@ -137,14 +146,14 @@ static int enable_return(DBusMessageIter *iter, const char *error,
        char *str;
 
        str = strrchr(tech, '/');
-       if (str != NULL)
+       if (str)
                str++;
        else
                str = tech;
 
-       if (error == NULL) {
+       if (!error)
                fprintf(stdout, "Enabled %s\n", str);
-       else
+       else
                fprintf(stderr, "Error %s: %s\n", str, error);
 
        g_free(user_data);
@@ -166,7 +175,7 @@ static int cmd_enable(char *args[], int num, struct connman_option *options)
        if (check_dbus_name(args[1]) == false)
                return -EINVAL;
 
-       if (strcmp(args[1], "offlinemode") == 0) {
+       if (strcmp(args[1], "offline") == 0) {
                tech = g_strdup(args[1]);
                return __connmanctl_dbus_set_property(connection, "/",
                                "net.connman.Manager", enable_return, tech,
@@ -186,14 +195,14 @@ static int disable_return(DBusMessageIter *iter, const char *error,
        char *str;
 
        str = strrchr(tech, '/');
-       if (str != NULL)
+       if (str)
                str++;
        else
                str = tech;
 
-       if (error == NULL) {
+       if (!error)
                fprintf(stdout, "Disabled %s\n", str);
-       else
+       else
                fprintf(stderr, "Error %s: %s\n", str, error);
 
        g_free(user_data);
@@ -215,7 +224,7 @@ static int cmd_disable(char *args[], int num, struct connman_option *options)
        if (check_dbus_name(args[1]) == false)
                return -EINVAL;
 
-       if (strcmp(args[1], "offlinemode") == 0) {
+       if (strcmp(args[1], "offline") == 0) {
                tech = g_strdup(args[1]);
                return __connmanctl_dbus_set_property(connection, "/",
                                "net.connman.Manager", disable_return, tech,
@@ -233,7 +242,7 @@ static int state_print(DBusMessageIter *iter, const char *error,
 {
        DBusMessageIter entry;
 
-       if (error != NULL) {
+       if (error) {
                fprintf(stderr, "Error: %s", error);
                return 0;
        }
@@ -252,13 +261,13 @@ static int cmd_state(char *args[], int num, struct connman_option *options)
 
        return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
                        CONNMAN_PATH, "net.connman.Manager", "GetProperties",
-                       state_print, NULL, DBUS_TYPE_INVALID);
+                       state_print, NULL, NULL, NULL);
 }
 
 static int services_list(DBusMessageIter *iter, const char *error,
                void *user_data)
 {
-       if (error == NULL) {
+       if (!error) {
                __connmanctl_services_list(iter);
                fprintf(stdout, "\n");
        } else {
@@ -268,14 +277,26 @@ static int services_list(DBusMessageIter *iter, const char *error,
        return 0;
 }
 
-static int services_properties(DBusMessageIter *iter, const char *error,
-               void *user_data)
+static int peers_list(DBusMessageIter *iter,
+                                       const char *error, void *user_data)
+{
+       if (!error) {
+               __connmanctl_peers_list(iter);
+               fprintf(stdout, "\n");
+       } else
+               fprintf(stderr, "Error: %s\n", error);
+
+       return 0;
+}
+
+static int object_properties(DBusMessageIter *iter,
+                                       const char *error, void *user_data)
 {
        char *path = user_data;
        char *str;
        DBusMessageIter dict;
 
-       if (error == NULL) {
+       if (!error) {
                fprintf(stdout, "%s\n", path);
 
                dbus_message_iter_recurse(iter, &dict);
@@ -285,7 +306,7 @@ static int services_properties(DBusMessageIter *iter, const char *error,
 
        } else {
                str = strrchr(path, '/');
-               if (str != NULL)
+               if (str)
                        str++;
                else
                        str = path;
@@ -323,11 +344,11 @@ static int cmd_services(char *args[], int num, struct connman_option *options)
                break;
        }
 
-       if (service_name == NULL) {
+       if (!service_name) {
                return __connmanctl_dbus_method_call(connection,
                                CONNMAN_SERVICE, CONNMAN_PATH,
                                "net.connman.Manager", "GetServices",
-                               services_list, NULL, DBUS_TYPE_INVALID);
+                               services_list, NULL, NULL, NULL);
        }
 
        if (check_dbus_name(service_name) == false)
@@ -336,7 +357,34 @@ static int cmd_services(char *args[], int num, struct connman_option *options)
        path = g_strdup_printf("/net/connman/service/%s", service_name);
        return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
                        "net.connman.Service", "GetProperties",
-                       services_properties, path, DBUS_TYPE_INVALID);
+                       object_properties, path, NULL, NULL);
+}
+
+static int cmd_peers(char *args[], int num, struct connman_option *options)
+{
+       char *peer_name = NULL;
+       char *path;
+
+       if (num > 2)
+               return -E2BIG;
+
+       if (num == 2)
+               peer_name = args[1];
+
+       if (!peer_name) {
+               return __connmanctl_dbus_method_call(connection,
+                                       CONNMAN_SERVICE, CONNMAN_PATH,
+                                       "net.connman.Manager", "GetPeers",
+                                       peers_list, NULL, NULL, NULL);
+       }
+
+       if (check_dbus_name(peer_name) == false)
+               return -EINVAL;
+
+       path = g_strdup_printf("/net/connman/peer/%s", peer_name);
+       return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
+                               path, "net.connman.Peer", "GetProperties",
+                               object_properties, path, NULL, NULL);
 }
 
 static int technology_print(DBusMessageIter *iter, const char *error,
@@ -344,7 +392,7 @@ static int technology_print(DBusMessageIter *iter, const char *error,
 {
        DBusMessageIter array;
 
-       if (error != NULL) {
+       if (error) {
                fprintf(stderr, "Error: %s\n", error);
                return 0;
        }
@@ -378,7 +426,7 @@ static int cmd_technologies(char *args[], int num,
 
        return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
                        CONNMAN_PATH, "net.connman.Manager", "GetTechnologies",
-                       technology_print, NULL, DBUS_TYPE_INVALID);
+                       technology_print, NULL, NULL, NULL);
 }
 
 struct tether_enable {
@@ -393,19 +441,19 @@ static int tether_set_return(DBusMessageIter *iter, const char *error,
        char *str;
 
        str = strrchr(tether->path, '/');
-       if (str != NULL)
+       if (str)
                str++;
        else
                str = tether->path;
 
-       if (error == NULL) {
+       if (!error) {
                fprintf(stdout, "%s tethering for %s\n",
-                               tether->enable == TRUE ? "Enabled": "Disabled",
+                               tether->enable ? "Enabled" : "Disabled",
                                str);
        } else
                fprintf(stderr, "Error %s %s tethering: %s\n",
-                               tether->enable == TRUE ?
-                               "enabling": "disabling", str, error);
+                               tether->enable ?
+                               "enabling" : "disabling", str, error);
 
        g_free(tether->path);
        g_free(user_data);
@@ -446,9 +494,6 @@ struct tether_properties {
 
 static int tether_update(struct tether_properties *tether)
 {
-       printf("%d %d %d\n", tether->ssid_result, tether->passphrase_result,
-               tether->set_tethering);
-
        if (tether->ssid_result == 0 && tether->passphrase_result == 0)
                return tether_set("wifi", tether->set_tethering);
 
@@ -466,7 +511,7 @@ static int tether_set_ssid_return(DBusMessageIter *iter, const char *error,
 {
        struct tether_properties *tether = user_data;
 
-       if (error == NULL) {
+       if (!error) {
                fprintf(stdout, "Wifi SSID set\n");
                tether->ssid_result = 0;
        } else {
@@ -482,7 +527,7 @@ static int tether_set_passphrase_return(DBusMessageIter *iter,
 {
        struct tether_properties *tether = user_data;
 
-       if (error == NULL) {
+       if (!error) {
                fprintf(stdout, "Wifi passphrase set\n");
                tether->passphrase_result = 0;
        } else {
@@ -565,7 +610,7 @@ static int scan_return(DBusMessageIter *iter, const char *error,
 {
        char *path = user_data;
 
-       if (error == NULL) {
+       if (!error) {
                char *str = strrchr(path, '/');
                str++;
                fprintf(stdout, "Scan completed for %s\n", str);
@@ -593,7 +638,7 @@ static int cmd_scan(char *args[], int num, struct connman_option *options)
        path = g_strdup_printf("/net/connman/technology/%s", args[1]);
        return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
                        "net.connman.Technology", "Scan",
-                       scan_return, path, DBUS_TYPE_INVALID);
+                       scan_return, path, NULL, NULL);
 }
 
 static int connect_return(DBusMessageIter *iter, const char *error,
@@ -601,7 +646,7 @@ static int connect_return(DBusMessageIter *iter, const char *error,
 {
        char *path = user_data;
 
-       if (error == NULL) {
+       if (!error) {
                char *str = strrchr(path, '/');
                str++;
                fprintf(stdout, "Connected %s\n", str);
@@ -629,7 +674,7 @@ static int cmd_connect(char *args[], int num, struct connman_option *options)
        path = g_strdup_printf("/net/connman/service/%s", args[1]);
        return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
                        "net.connman.Service", "Connect",
-                       connect_return, path, DBUS_TYPE_INVALID);
+                       connect_return, path, NULL, NULL);
 }
 
 static int disconnect_return(DBusMessageIter *iter, const char *error,
@@ -637,7 +682,7 @@ static int disconnect_return(DBusMessageIter *iter, const char *error,
 {
        char *path = user_data;
 
-       if (error == NULL) {
+       if (!error) {
                char *str = strrchr(path, '/');
                str++;
                fprintf(stdout, "Disconnected %s\n", str);
@@ -665,7 +710,7 @@ static int cmd_disconnect(char *args[], int num, struct connman_option *options)
        path = g_strdup_printf("/net/connman/service/%s", args[1]);
        return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
                        "net.connman.Service", "Disconnect",
-                       disconnect_return, path, DBUS_TYPE_INVALID);
+                       disconnect_return, path, NULL, NULL);
 }
 
 static int config_return(DBusMessageIter *iter, const char *error,
@@ -673,7 +718,7 @@ static int config_return(DBusMessageIter *iter, const char *error,
 {
        char *service_name = user_data;
 
-       if (error != NULL)
+       if (error)
                fprintf(stderr, "Error %s: %s\n", service_name, error);
 
        g_free(user_data);
@@ -693,10 +738,10 @@ static void config_append_ipv4(DBusMessageIter *iter,
        char **opts = append->opts;
        int i = 0;
 
-       if (opts == NULL)
+       if (!opts)
                return;
 
-       while (opts[i] != NULL && ipv4[i] != NULL) {
+       while (opts[i] && ipv4[i]) {
                __connmanctl_dbus_append_dict_entry(iter, ipv4[i],
                                DBUS_TYPE_STRING, &opts[i]);
                i++;
@@ -710,7 +755,7 @@ static void config_append_ipv6(DBusMessageIter *iter, void *user_data)
        struct config_append *append = user_data;
        char **opts = append->opts;
 
-       if (opts == NULL)
+       if (!opts)
                return;
 
        append->values = 1;
@@ -736,7 +781,7 @@ static void config_append_ipv6(DBusMessageIter *iter, void *user_data)
                        break;
 
                default:
-                       if (opts[1] != NULL) {
+                       if (opts[1]) {
                                append->values = 2;
 
                                if (g_strcmp0(opts[1], "prefered") != 0 &&
@@ -758,7 +803,7 @@ static void config_append_ipv6(DBusMessageIter *iter, void *user_data)
        } else if (g_strcmp0(opts[0], "manual") == 0) {
                int i = 1;
 
-               while (opts[i] != NULL && ipv6[i] != NULL) {
+               while (opts[i] && ipv6[i]) {
                        if (i == 2) {
                                int value = atoi(opts[i]);
                                __connmanctl_dbus_append_dict_entry(iter,
@@ -775,7 +820,7 @@ static void config_append_ipv6(DBusMessageIter *iter, void *user_data)
                append->values = i;
 
        } else if (g_strcmp0(opts[0], "off") != 0) {
-               fprintf(stderr, "Error %s: %s\n", opts[0], strerror(-EINVAL));
+               fprintf(stderr, "Error %s: %s\n", opts[0], strerror(EINVAL));
 
                return;
        }
@@ -790,10 +835,10 @@ static void config_append_str(DBusMessageIter *iter, void *user_data)
        char **opts = append->opts;
        int i = 0;
 
-       if (opts == NULL)
+       if (!opts)
                return;
 
-       while (opts[i] != NULL) {
+       while (opts[i]) {
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                &opts[i]);
                i++;
@@ -808,10 +853,10 @@ static void append_servers(DBusMessageIter *iter, void *user_data)
        char **opts = append->opts;
        int i = 1;
 
-       if (opts == NULL)
+       if (!opts)
                return;
 
-       while (opts[i] != NULL && g_strcmp0(opts[i], "--excludes") != 0) {
+       while (opts[i] && g_strcmp0(opts[i], "--excludes") != 0) {
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                &opts[i]);
                i++;
@@ -826,12 +871,12 @@ static void append_excludes(DBusMessageIter *iter, void *user_data)
        char **opts = append->opts;
        int i = append->values;
 
-       if (opts == NULL || opts[i] == NULL ||
+       if (!opts || !opts[i] ||
                        g_strcmp0(opts[i], "--excludes") != 0)
                return;
 
        i++;
-       while (opts[i] != NULL) {
+       while (opts[i]) {
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                &opts[i]);
                i++;
@@ -845,7 +890,7 @@ static void config_append_proxy(DBusMessageIter *iter, void *user_data)
        struct config_append *append = user_data;
        char **opts = append->opts;
 
-       if (opts == NULL)
+       if (!opts)
                return;
 
        if (g_strcmp0(opts[0], "manual") == 0) {
@@ -856,7 +901,7 @@ static void config_append_proxy(DBusMessageIter *iter, void *user_data)
                                append_excludes, append);
 
        } else if (g_strcmp0(opts[0], "auto") == 0) {
-               if (opts[1] != NULL) {
+               if (opts[1]) {
                        __connmanctl_dbus_append_dict_entry(iter, "URL",
                                        DBUS_TYPE_STRING, &opts[1]);
                        append->values++;
@@ -881,13 +926,13 @@ static int cmd_config(char *args[], int num, struct connman_option *options)
        struct config_append append;
 
        service_name = args[1];
-       if (service_name == NULL)
+       if (!service_name)
                return -EINVAL;
 
        if (check_dbus_name(service_name) == false)
                return -EINVAL;
 
-       while (index < num && args[index] != NULL) {
+       while (index < num && args[index]) {
                c = parse_args(args[index], options);
                opt_start = &args[index + 1];
                append.opts = opt_start;
@@ -985,7 +1030,7 @@ static int cmd_config(char *args[], int num, struct connman_option *options)
                                        CONNMAN_SERVICE, path,
                                        "net.connman.Service", "Remove",
                                        config_return, g_strdup(service_name),
-                                       DBUS_TYPE_INVALID);
+                                       NULL, NULL);
                        break;
                default:
                        res = -EINVAL;
@@ -1016,25 +1061,30 @@ static DBusHandlerResult monitor_changed(DBusConnection *connection,
        const char *interface, *path;
 
        interface = dbus_message_get_interface(message);
+       if (!interface)
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
        if (strncmp(interface, "net.connman.", 12) != 0)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       if (strncmp(interface, "net.connman.Agent", 17) == 0 ||
-                       strncmp(interface, "net.connman.vpn.Agent", 21) == 0)
+       if (!strcmp(interface, "net.connman.Agent") ||
+                       !strcmp(interface, "net.connman.vpn.Agent") ||
+                       !strcmp(interface, "net.connman.Session") ||
+                       !strcmp(interface, "net.connman.Notification"))
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
        interface = strrchr(interface, '.');
-       if (interface != NULL && *interface != '\0')
+       if (interface && *interface != '\0')
                interface++;
 
        path = strrchr(dbus_message_get_path(message), '/');
-       if (path != NULL && *path != '\0')
+       if (path && *path != '\0')
                path++;
 
        __connmanctl_save_rl();
 
        if (dbus_message_is_signal(message, "net.connman.Manager",
-                                       "ServicesChanged") == TRUE) {
+                                       "ServicesChanged")) {
 
                fprintf(stdout, "%-12s %-20s = {\n", interface,
                                "ServicesChanged");
@@ -1044,22 +1094,30 @@ static DBusHandlerResult monitor_changed(DBusConnection *connection,
 
                __connmanctl_redraw_rl();
 
-               return DBUS_HANDLER_RESULT_HANDLED;
-       }
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       } else if (dbus_message_is_signal(message, "net.connman.Manager",
+                                                       "PeersChanged")) {
+               fprintf(stdout, "%-12s %-20s = {\n", interface,
+                                                       "PeersChanged");
+               dbus_message_iter_init(message, &iter);
+               __connmanctl_peers_list(&iter);
+               fprintf(stdout, "\n}\n");
 
+               __connmanctl_redraw_rl();
 
-       if (dbus_message_is_signal(message, "net.connman.vpn.Manager",
-                                       "ConnectionAdded") == TRUE ||
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       } else if (dbus_message_is_signal(message, "net.connman.vpn.Manager",
+                                       "ConnectionAdded") ||
                        dbus_message_is_signal(message,
                                        "net.connman.vpn.Manager",
-                                       "ConnectionRemoved") == TRUE) {
+                                       "ConnectionRemoved")) {
                interface = "vpn.Manager";
                path = dbus_message_get_member(message);
 
        } else if (dbus_message_is_signal(message, "net.connman.Manager",
-                                       "TechnologyAdded") == TRUE ||
+                                       "TechnologyAdded") ||
                        dbus_message_is_signal(message, "net.connman.Manager",
-                                       "TechnologyRemoved") == TRUE)
+                                       "TechnologyRemoved"))
                path = dbus_message_get_member(message);
 
        fprintf(stdout, "%-12s %-20s ", interface, path);
@@ -1070,7 +1128,7 @@ static DBusHandlerResult monitor_changed(DBusConnection *connection,
 
        __connmanctl_redraw_rl();
 
-       return DBUS_HANDLER_RESULT_HANDLED;
+       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
 static struct {
@@ -1092,7 +1150,7 @@ static void monitor_add(char *interface)
        char *rule;
        DBusError err;
 
-       for (i = 0; monitor[i].interface != NULL; i++) {
+       for (i = 0; monitor[i].interface; i++) {
                if (monitor[i].enabled == true)
                        add_filter = false;
 
@@ -1129,7 +1187,7 @@ static void monitor_del(char *interface)
        char *rule;
 
 
-       for (i = 0; monitor[i].interface != NULL; i++) {
+       for (i = 0; monitor[i].interface; i++) {
                if (g_strcmp0(interface, monitor[i].interface) == 0) {
                        if (monitor[i].enabled == false)
                                return;
@@ -1250,6 +1308,12 @@ static int cmd_monitor(char *args[], int num, struct connman_option *options)
 
 static int cmd_agent(char *args[], int num, struct connman_option *options)
 {
+       if (!__connmanctl_is_interactive()) {
+               fprintf(stderr, "Error: Not supported in non-interactive "
+                               "mode\n");
+               return 0;
+       }
+
        if (num > 2)
                return -E2BIG;
 
@@ -1282,7 +1346,7 @@ static int vpnconnections_properties(DBusMessageIter *iter, const char *error,
        char *str;
        DBusMessageIter dict;
 
-       if (error == NULL) {
+       if (!error) {
                fprintf(stdout, "%s\n", path);
 
                dbus_message_iter_recurse(iter, &dict);
@@ -1292,7 +1356,7 @@ static int vpnconnections_properties(DBusMessageIter *iter, const char *error,
 
        } else {
                str = strrchr(path, '/');
-               if (str != NULL)
+               if (str)
                        str++;
                else
                        str = path;
@@ -1308,7 +1372,7 @@ static int vpnconnections_properties(DBusMessageIter *iter, const char *error,
 static int vpnconnections_list(DBusMessageIter *iter, const char *error,
                void *user_data)
 {
-       if (error == NULL)
+       if (!error)
                __connmanctl_vpnconnections_list(iter);
         else
                fprintf(stderr, "Error: %s\n", error);
@@ -1326,12 +1390,12 @@ static int cmd_vpnconnections(char *args[], int num,
 
        vpnconnection_name = args[1];
 
-       if (vpnconnection_name == NULL)
+       if (!vpnconnection_name)
                return __connmanctl_dbus_method_call(connection,
                                VPN_SERVICE, VPN_PATH,
                                "net.connman.vpn.Manager", "GetConnections",
                                vpnconnections_list, NULL,
-                               DBUS_TYPE_INVALID);
+                               NULL, NULL);
 
        if (check_dbus_name(vpnconnection_name) == false)
                return -EINVAL;
@@ -1340,12 +1404,18 @@ static int cmd_vpnconnections(char *args[], int num,
                        vpnconnection_name);
        return __connmanctl_dbus_method_call(connection, VPN_SERVICE, path,
                        "net.connman.vpn.Connection", "GetProperties",
-                       vpnconnections_properties, path, DBUS_TYPE_INVALID);
+                       vpnconnections_properties, path, NULL, NULL);
 
 }
 
 static int cmd_vpnagent(char *args[], int num, struct connman_option *options)
 {
+       if (!__connmanctl_is_interactive()) {
+               fprintf(stderr, "Error: Not supported in non-interactive "
+                               "mode\n");
+               return 0;
+       }
+
        if (num > 2)
                return -E2BIG;
 
@@ -1372,165 +1442,1112 @@ static int cmd_vpnagent(char *args[], int num, struct connman_option *options)
        return 0;
 }
 
-static int cmd_exit(char *args[], int num, struct connman_option *options)
+static DBusMessage *session_release(DBusConnection *connection,
+               DBusMessage *message, void *user_data)
 {
-       return 1;
-}
+       __connmanctl_save_rl();
 
-static struct connman_option service_options[] = {
-       {"properties", 'p', "[<service>]      (obsolete)"},
-       { NULL, }
-};
+       fprintf(stdout, "Session %s released\n", session_path);
 
-static struct connman_option config_options[] = {
-       {"nameservers", 'n', "<dns1> [<dns2>] [<dns3>]"},
-       {"timeservers", 't', "<ntp1> [<ntp2>] [...]"},
-       {"domains", 'd', "<domain1> [<domain2>] [...]"},
-       {"ipv6", 'v', "off|auto [enable|disable|prefered]|\n"
-                     "\t\t\tmanual <address> <prefixlength> <gateway>"},
-       {"proxy", 'x', "direct|auto <URL>|manual <URL1> [<URL2>] [...]\n"
-                      "\t\t\t[exclude <exclude1> [<exclude2>] [...]]"},
-       {"autoconnect", 'a', "yes|no"},
-       {"ipv4", 'i', "off|dhcp|manual <address> <netmask> <gateway>"},
-       {"remove", 'r', "                 Remove service"},
-       { NULL, }
-};
+       __connmanctl_redraw_rl();
 
-static struct connman_option monitor_options[] = {
-       {"services", 's', "[off]            Monitor only services"},
-       {"tech", 'c', "[off]            Monitor only technologies"},
-       {"manager", 'm', "[off]            Monitor only manager interface"},
-       {"vpnmanager", 'M', "[off]            Monitor only VPN manager "
-        "interface"},
-       {"vpnconnection", 'C', "[off]            Monitor only VPN "
-        "connections" },
-       { NULL, }
-};
+       g_free(session_path);
+       session_path = NULL;
+       session_connected = false;
 
-static const struct {
-        const char *cmd;
-       const char *argument;
-        struct connman_option *options;
-        int (*func) (char *args[], int num, struct connman_option *options);
-        const char *desc;
-} cmd_table[] = {
-       { "state",        NULL,           NULL,            cmd_state,
-         "Shows if the system is online or offline" },
-       { "technologies", NULL,           NULL,            cmd_technologies,
-         "Display technologies" },
-       { "enable",       "<technology>|offline", NULL,    cmd_enable,
-         "Enables given technology or offline mode" },
-       { "disable",      "<technology>|offline", NULL,    cmd_disable,
-         "Disables given technology or offline mode"},
-       { "tether", "<technology> on|off\n"
-                   "            wifi [on|off] <ssid> <passphrase> ",
-                                         NULL,            cmd_tether,
-         "Enable, disable tethering, set SSID and passphrase for wifi" },
-       { "services",     "[<service>]",  service_options, cmd_services,
-         "Display services" },
-       { "scan",         "<technology>", NULL,            cmd_scan,
-         "Scans for new services for given technology" },
-       { "connect",      "<service>",    NULL,            cmd_connect,
-         "Connect a given service" },
-       { "disconnect",   "<service>",    NULL,            cmd_disconnect,
-         "Disconnect a given service" },
-       { "config",       "<service>",    config_options,  cmd_config,
-         "Set service configuration options" },
-       { "monitor",      "[off]",        monitor_options, cmd_monitor,
-         "Monitor signals from interfaces" },
-       { "agent", "on|off",              NULL,            cmd_agent,
-         "Agent mode" },
-       {"vpnconnections", "[<connection>]", NULL,         cmd_vpnconnections,
-        "Display VPN connections" },
-       { "vpnagent",     "on|off",     NULL,            cmd_vpnagent,
-         "VPN Agent mode" },
-       { "help",         NULL,           NULL,            cmd_help,
-         "Show help" },
-       { "exit",         NULL,           NULL,            cmd_exit,
-         "Exit" },
-       { "quit",         NULL,           NULL,            cmd_exit,
-         "Quit" },
-       {  NULL, },
-};
+       return g_dbus_create_reply(message, DBUS_TYPE_INVALID);
+}
 
-static int cmd_help(char *args[], int num, struct connman_option *options)
+static DBusMessage *session_update(DBusConnection *connection,
+               DBusMessage *message, void *user_data)
 {
-       bool interactive = __connmanctl_is_interactive();
-       int i, j;
+       DBusMessageIter iter, dict;
 
-       if (interactive == false)
-               fprintf(stdout, "Usage: connmanctl [[command] [args]]\n");
+       __connmanctl_save_rl();
 
-       for (i = 0; cmd_table[i].cmd != NULL; i++) {
-               const char *cmd = cmd_table[i].cmd;
-               const char *argument = cmd_table[i].argument;
-               const char *desc = cmd_table[i].desc;
+       fprintf(stdout, "Session      Update               = {\n");
 
-               printf("%-16s%-22s%s\n", cmd != NULL? cmd: "",
-                               argument != NULL? argument: "",
-                               desc != NULL? desc: "");
+       dbus_message_iter_init(message, &iter);
+       dbus_message_iter_recurse(&iter, &dict);
 
-               if (cmd_table[i].options != NULL) {
-                       for (j = 0; cmd_table[i].options[j].name != NULL;
-                            j++) {
-                               const char *options_desc =
-                                       cmd_table[i].options[j].desc != NULL ?
-                                       cmd_table[i].options[j].desc: "";
+       __connmanctl_dbus_print(&dict, "", " = ", "\n");
+       fprintf(stdout, "\n}\n");
 
-                               printf("   --%-16s%s\n",
-                                               cmd_table[i].options[j].name,
-                                               options_desc);
+       dbus_message_iter_recurse(&iter, &dict);
+
+       while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+               DBusMessageIter entry, variant;
+               char *field, *state;
+
+               dbus_message_iter_recurse(&dict, &entry);
+
+               dbus_message_iter_get_basic(&entry, &field);
+
+               if (dbus_message_iter_get_arg_type(&entry)
+                               == DBUS_TYPE_STRING
+                               && !strcmp(field, "State")) {
+
+                       dbus_message_iter_next(&entry);
+                       dbus_message_iter_recurse(&entry, &variant);
+                       if (dbus_message_iter_get_arg_type(&variant)
+                                       != DBUS_TYPE_STRING)
+                               break;
+
+                       dbus_message_iter_get_basic(&variant, &state);
+
+                       if (!session_connected && (!strcmp(state, "connected")
+                                       || !strcmp(state, "online"))) {
+
+                               fprintf(stdout, "Session %s connected\n",
+                                       session_path);
+                               session_connected = true;
+
+                               break;
+                       }
+
+                       if (!strcmp(state, "disconnected") &&
+                                       session_connected) {
+
+                               fprintf(stdout, "Session %s disconnected\n",
+                                       session_path);
+                               session_connected = false;
                        }
+                       break;
                }
+
+               dbus_message_iter_next(&dict);
        }
 
-       if (interactive == false)
-               fprintf(stdout, "\nNote: arguments and output are considered "
-                               "EXPERIMENTAL for now.\n");
+       __connmanctl_redraw_rl();
+
+       return g_dbus_create_reply(message, DBUS_TYPE_INVALID);
+}
+
+static const GDBusMethodTable notification_methods[] = {
+       { GDBUS_METHOD("Release", NULL, NULL, session_release) },
+       { GDBUS_METHOD("Update", GDBUS_ARGS({"settings", "a{sv}"}),
+                               NULL, session_update) },
+       { },
+};
+
+static int session_notify_add(const char *path)
+{
+       if (session_notify_path)
+               return 0;
+
+       if (!g_dbus_register_interface(connection, path,
+                                       "net.connman.Notification",
+                                       notification_methods, NULL, NULL,
+                                       NULL, NULL)) {
+               fprintf(stderr, "Error: Failed to register VPN Agent "
+                               "callbacks\n");
+               return -EIO;
+       }
+
+       session_notify_path = g_strdup(path);
 
        return 0;
 }
 
-int __connmanctl_commands(DBusConnection *dbus_conn, char *argv[], int argc)
+static void session_notify_remove(void)
 {
-       int i, result;
+       if (!session_notify_path)
+               return;
 
-       connection = dbus_conn;
+       g_dbus_unregister_interface(connection, session_notify_path,
+                       "net.connman.Notification");
 
-       for (i = 0; cmd_table[i].cmd != NULL; i++) {
-               if (g_strcmp0(cmd_table[i].cmd, argv[0]) == 0 &&
-                               cmd_table[i].func != NULL) {
-                       result = cmd_table[i].func(argv, argc,
-                                       cmd_table[i].options);
-                       if (result < 0 && result != -EINPROGRESS)
-                               fprintf(stderr, "Error '%s': %s\n", argv[0],
-                                               strerror(-result));
-                       return result;
-               }
+       g_free(session_notify_path);
+       session_notify_path = NULL;
+}
+
+static int session_connect_cb(DBusMessageIter *iter, const char *error,
+               void *user_data)
+{
+       if (error) {
+               fprintf(stderr, "Error: %s", error);
+               return 0;
        }
 
-       fprintf(stderr, "Error '%s': Unknown command\n", argv[0]);
-       return -EINVAL;
+       return -EINPROGRESS;
 }
 
-char *__connmanctl_lookup_command(const char *text, int state)
+
+static int session_connect(void)
 {
-       static int i = 0;
-       static int len = 0;
+       return __connmanctl_dbus_method_call(connection, "net.connman",
+                       session_path, "net.connman.Session", "Connect",
+                       session_connect_cb, NULL, NULL, NULL);
+}
 
-       if (state == 0) {
-               i = 0;
-               len = strlen(text);
+static int session_disconnect_cb(DBusMessageIter *iter, const char *error,
+               void *user_data)
+{
+       if (error)
+               fprintf(stderr, "Error: %s", error);
+
+       return 0;
+}
+
+static int session_disconnect(void)
+{
+       return __connmanctl_dbus_method_call(connection, "net.connman",
+                       session_path, "net.connman.Session", "Disconnect",
+                       session_disconnect_cb, NULL, NULL, NULL);
+}
+
+static int session_create_cb(DBusMessageIter *iter, const char *error,
+               void *user_data)
+{
+       gboolean connect = GPOINTER_TO_INT(user_data);
+       char *str;
+
+       if (error) {
+               fprintf(stderr, "Error creating session: %s", error);
+               session_notify_remove();
+               return 0;
        }
 
-       while (cmd_table[i].cmd != NULL) {
-               const char *command = cmd_table[i].cmd;
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH) {
+               fprintf(stderr, "Error creating session: No session path\n");
+               return -EINVAL;
+       }
 
-               i++;
+       g_free(session_path);
 
-               if (strncmp(text, command, len) == 0)
-                       return strdup(command);
+       dbus_message_iter_get_basic(iter, &str);
+       session_path = g_strdup(str);
+
+       fprintf(stdout, "Session %s created\n", session_path);
+
+       if (connect)
+               return session_connect();
+
+       return -EINPROGRESS;
+}
+
+static void session_create_append(DBusMessageIter *iter, void *user_data)
+{
+       const char *notify_path = user_data;
+
+       __connmanctl_dbus_append_dict(iter, NULL, NULL);
+
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH,
+                       &notify_path);
+}
+
+static int session_create(gboolean connect)
+{
+       int res;
+       char *notify_path;
+
+       notify_path = g_strdup_printf("/net/connman/connmanctl%d", getpid());
+       session_notify_add(notify_path);
+
+       res = __connmanctl_dbus_method_call(connection, "net.connman", "/",
+                       "net.connman.Manager", "CreateSession",
+                       session_create_cb, GINT_TO_POINTER(connect),
+                       session_create_append, notify_path);
+
+       g_free(notify_path);
+
+       if (res < 0 && res != -EINPROGRESS)
+               session_notify_remove();
+
+       return res;
+}
+
+static int session_destroy_cb(DBusMessageIter *iter, const char *error,
+               void *user_data)
+{
+       if (error) {
+               fprintf(stderr, "Error destroying session: %s", error);
+               return 0;
        }
 
-       return NULL;
+       fprintf(stdout, "Session %s ended\n", session_path);
+
+       g_free(session_path);
+       session_path = NULL;
+       session_connected = false;
+
+       return 0;
+}
+
+static void session_destroy_append(DBusMessageIter *iter, void *user_data)
+{
+       const char *path = user_data;
+
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
+}
+
+static int session_destroy(void)
+{
+       return __connmanctl_dbus_method_call(connection, "net.connman", "/",
+                       "net.connman.Manager", "DestroySession",
+                       session_destroy_cb, NULL,
+                       session_destroy_append, session_path);
+}
+
+static int session_config_return(DBusMessageIter *iter, const char *error,
+               void *user_data)
+{
+       char *property_name = user_data;
+
+       if (error)
+               fprintf(stderr, "Error setting session %s: %s\n",
+                               property_name, error);
+
+       return 0;
+}
+
+static void session_config_append_array(DBusMessageIter *iter,
+               void *user_data)
+{
+       struct config_append *append = user_data;
+       char **opts = append->opts;
+       int i = 1;
+
+       if (!opts)
+               return;
+
+       while (opts[i] && strncmp(opts[i], "--", 2) != 0) {
+               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
+                               &opts[i]);
+               i++;
+       }
+
+       append->values = i;
+}
+
+static int session_config(char *args[], int num,
+               struct connman_option *options)
+{
+       int index = 0, res = 0;
+       struct config_append append;
+       char c;
+
+       while (index < num && args[index]) {
+               append.opts = &args[index];
+               append.values = 0;
+
+               c = parse_args(args[index], options);
+
+               switch (c) {
+               case 'b':
+                       res = __connmanctl_dbus_session_change_array(connection,
+                                       session_path, session_config_return,
+                                       "AllowedBearers", "AllowedBearers",
+                                       session_config_append_array, &append);
+                       break;
+               case 't':
+                       if (!args[index + 1]) {
+                               res = -EINVAL;
+                               break;
+                       }
+
+                       res = __connmanctl_dbus_session_change(connection,
+                                       session_path, session_config_return,
+                                       "ConnectionType", "ConnectionType",
+                                       DBUS_TYPE_STRING, &args[index + 1]);
+                       append.values = 2;
+                       break;
+
+               default:
+                       res = -EINVAL;
+               }
+
+               if (res < 0 && res != -EINPROGRESS) {
+                       printf("Error '%s': %s\n", args[index],
+                                       strerror(-res));
+                       return 0;
+               }
+
+               index += append.values;
+       }
+
+       return 0;
+}
+
+static int cmd_session(char *args[], int num, struct connman_option *options)
+{
+       char *command;
+
+       if (num < 2)
+               return -EINVAL;
+
+       command = args[1];
+
+       switch(parse_boolean(command)) {
+       case 0:
+               if (!session_path)
+                       return -EALREADY;
+               return session_destroy();
+
+       case 1:
+               if (session_path)
+                       return -EALREADY;
+               return session_create(FALSE);
+
+       default:
+               if (!strcmp(command, "connect")) {
+                       if (!session_path)
+                               return session_create(TRUE);
+
+                       return session_connect();
+
+               } else if (!strcmp(command, "disconnect")) {
+
+                       if (!session_path) {
+                               fprintf(stdout, "Session does not exist\n");
+                               return 0;
+                       }
+
+                       return session_disconnect();
+               } else if (!strcmp(command, "config")) {
+                       if (!session_path) {
+                               fprintf(stdout, "Session does not exist\n");
+                               return 0;
+                       }
+
+                       if (num == 2)
+                               return -EINVAL;
+
+                       return session_config(&args[2], num - 2, options);
+               }
+
+       }
+
+       return -EINVAL;
+}
+
+static int cmd_exit(char *args[], int num, struct connman_option *options)
+{
+       return 1;
+}
+
+static char *lookup_service(const char *text, int state)
+{
+       static int len = 0;
+       static GHashTableIter iter;
+       gpointer key, value;
+
+       if (state == 0) {
+               g_hash_table_iter_init(&iter, service_hash);
+               len = strlen(text);
+       }
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               const char *service = key;
+               if (strncmp(text, service, len) == 0)
+                       return strdup(service);
+       }
+
+       return NULL;
+}
+
+static char *lookup_service_arg(const char *text, int state)
+{
+       if (__connmanctl_input_calc_level() > 1) {
+               __connmanctl_input_lookup_end();
+               return NULL;
+       }
+
+       return lookup_service(text, state);
+}
+
+static char *lookup_peer(const char *text, int state)
+{
+       static GHashTableIter iter;
+       gpointer key, value;
+       static int len = 0;
+
+       if (state == 0) {
+               g_hash_table_iter_init(&iter, peer_hash);
+               len = strlen(text);
+       }
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               const char *peer = key;
+               if (strncmp(text, peer, len) == 0)
+                       return strdup(peer);
+       }
+
+       return NULL;
+}
+
+static char *lookup_peer_arg(const char *text, int state)
+{
+       if (__connmanctl_input_calc_level() > 1) {
+               __connmanctl_input_lookup_end();
+               return NULL;
+       }
+
+       return lookup_peer(text, state);
+}
+
+static char *lookup_technology(const char *text, int state)
+{
+       static int len = 0;
+       static GHashTableIter iter;
+       gpointer key, value;
+
+       if (state == 0) {
+               g_hash_table_iter_init(&iter, technology_hash);
+               len = strlen(text);
+       }
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               const char *technology = key;
+               if (strncmp(text, technology, len) == 0)
+                       return strdup(technology);
+       }
+
+       return NULL;
+}
+
+static char *lookup_technology_arg(const char *text, int state)
+{
+       if (__connmanctl_input_calc_level() > 1) {
+               __connmanctl_input_lookup_end();
+               return NULL;
+       }
+
+       return lookup_technology(text, state);
+}
+
+static char *lookup_technology_offline(const char *text, int state)
+{
+       static int len = 0;
+       static bool end = false;
+       char *str;
+
+       if (__connmanctl_input_calc_level() > 1) {
+               __connmanctl_input_lookup_end();
+               return NULL;
+       }
+
+       if (state == 0) {
+               len = strlen(text);
+               end = false;
+       }
+
+       if (end)
+               return NULL;
+
+       str = lookup_technology(text, state);
+       if (str)
+               return str;
+
+       end = true;
+
+       if (strncmp(text, "offline", len) == 0)
+               return strdup("offline");
+
+       return NULL;
+}
+
+static char *lookup_on_off(const char *text, int state)
+{
+       char *onoff[] = { "on", "off", NULL };
+       static int idx = 0;
+       static int len = 0;
+
+       char *str;
+
+       if (!state) {
+               idx = 0;
+               len = strlen(text);
+       }
+
+       while (onoff[idx]) {
+               str = onoff[idx];
+               idx++;
+
+               if (!strncmp(text, str, len))
+                       return strdup(str);
+       }
+
+       return NULL;
+}
+
+static char *lookup_tether(const char *text, int state)
+{
+       int level;
+
+       level = __connmanctl_input_calc_level();
+       if (level < 2)
+               return lookup_technology(text, state);
+
+       if (level == 2)
+               return lookup_on_off(text, state);
+
+       __connmanctl_input_lookup_end();
+
+       return NULL;
+}
+
+static char *lookup_agent(const char *text, int state)
+{
+       if (__connmanctl_input_calc_level() > 1) {
+               __connmanctl_input_lookup_end();
+               return NULL;
+       }
+
+       return lookup_on_off(text, state);
+}
+
+static struct connman_option service_options[] = {
+       {"properties", 'p', "[<service>]      (obsolete)"},
+       { NULL, }
+};
+
+static struct connman_option config_options[] = {
+       {"nameservers", 'n', "<dns1> [<dns2>] [<dns3>]"},
+       {"timeservers", 't', "<ntp1> [<ntp2>] [...]"},
+       {"domains", 'd', "<domain1> [<domain2>] [...]"},
+       {"ipv6", 'v', "off|auto [enable|disable|preferred]|\n"
+                     "\t\t\tmanual <address> <prefixlength> <gateway>"},
+       {"proxy", 'x', "direct|auto <URL>|manual <URL1> [<URL2>] [...]\n"
+                      "\t\t\t[exclude <exclude1> [<exclude2>] [...]]"},
+       {"autoconnect", 'a', "yes|no"},
+       {"ipv4", 'i', "off|dhcp|manual <address> <netmask> <gateway>"},
+       {"remove", 'r', "                 Remove service"},
+       { NULL, }
+};
+
+static struct connman_option monitor_options[] = {
+       {"services", 's', "[off]            Monitor only services"},
+       {"tech", 'c', "[off]            Monitor only technologies"},
+       {"manager", 'm', "[off]            Monitor only manager interface"},
+       {"vpnmanager", 'M', "[off]            Monitor only VPN manager "
+        "interface"},
+       {"vpnconnection", 'C', "[off]            Monitor only VPN "
+        "connections" },
+       { NULL, }
+};
+
+static struct connman_option session_options[] = {
+       {"bearers", 'b', "<technology1> [<technology2> [...]]"},
+       {"type", 't', "local|internet|any"},
+       { NULL, }
+};
+
+static char *lookup_options(struct connman_option *options, const char *text,
+               int state)
+{
+       static int idx = 0;
+       static int len = 0;
+       const char *str;
+
+       if (state == 0) {
+               idx = 0;
+               len = strlen(text);
+       }
+
+       while (options[idx].name) {
+               str = options[idx].name;
+               idx++;
+
+               if (str && strncmp(text, str, len) == 0)
+                       return strdup(str);
+       }
+
+       return NULL;
+}
+
+static char *lookup_monitor(const char *text, int state)
+{
+       int level;
+
+       level = __connmanctl_input_calc_level();
+
+       if (level < 2)
+               return lookup_options(monitor_options, text, state);
+
+       if (level == 2)
+               return lookup_on_off(text, state);
+
+       __connmanctl_input_lookup_end();
+       return NULL;
+}
+
+static char *lookup_config(const char *text, int state)
+{
+       if (__connmanctl_input_calc_level() < 2)
+               return lookup_service(text, state);
+
+       return lookup_options(config_options, text, state);
+}
+
+static char *lookup_session(const char *text, int state)
+{
+       return lookup_options(session_options, text, state);
+}
+
+static const struct {
+        const char *cmd;
+       const char *argument;
+        struct connman_option *options;
+        int (*func) (char *args[], int num, struct connman_option *options);
+        const char *desc;
+       __connmanctl_lookup_cb cb;
+} cmd_table[] = {
+       { "state",        NULL,           NULL,            cmd_state,
+         "Shows if the system is online or offline", NULL },
+       { "technologies", NULL,           NULL,            cmd_technologies,
+         "Display technologies", NULL },
+       { "enable",       "<technology>|offline", NULL,    cmd_enable,
+         "Enables given technology or offline mode",
+         lookup_technology_offline },
+       { "disable",      "<technology>|offline", NULL,    cmd_disable,
+         "Disables given technology or offline mode",
+         lookup_technology_offline },
+       { "tether", "<technology> on|off\n"
+                   "            wifi [on|off] <ssid> <passphrase> ",
+                                         NULL,            cmd_tether,
+         "Enable, disable tethering, set SSID and passphrase for wifi",
+         lookup_tether },
+       { "services",     "[<service>]",  service_options, cmd_services,
+         "Display services", lookup_service_arg },
+       { "peers",        "[peer]",       NULL,            cmd_peers,
+         "Display peers", lookup_peer_arg },
+       { "scan",         "<technology>", NULL,            cmd_scan,
+         "Scans for new services for given technology",
+         lookup_technology_arg },
+       { "connect",      "<service>",    NULL,            cmd_connect,
+         "Connect a given service", lookup_service_arg },
+       { "disconnect",   "<service>",    NULL,            cmd_disconnect,
+         "Disconnect a given service", lookup_service_arg },
+       { "config",       "<service>",    config_options,  cmd_config,
+         "Set service configuration options", lookup_config },
+       { "monitor",      "[off]",        monitor_options, cmd_monitor,
+         "Monitor signals from interfaces", lookup_monitor },
+       { "agent", "on|off",              NULL,            cmd_agent,
+         "Agent mode", lookup_agent },
+       {"vpnconnections", "[<connection>]", NULL,         cmd_vpnconnections,
+        "Display VPN connections", NULL },
+       { "vpnagent",     "on|off",     NULL,            cmd_vpnagent,
+         "VPN Agent mode", lookup_agent },
+       { "session",      "on|off|connect|disconnect|config", session_options,
+         cmd_session, "Enable or disable a session", lookup_session },
+       { "help",         NULL,           NULL,            cmd_help,
+         "Show help", NULL },
+       { "exit",         NULL,           NULL,            cmd_exit,
+         "Exit", NULL },
+       { "quit",         NULL,           NULL,            cmd_exit,
+         "Quit", NULL },
+       {  NULL, },
+};
+
+static int cmd_help(char *args[], int num, struct connman_option *options)
+{
+       bool interactive = __connmanctl_is_interactive();
+       int i, j;
+
+       if (interactive == false)
+               fprintf(stdout, "Usage: connmanctl [[command] [args]]\n");
+
+       for (i = 0; cmd_table[i].cmd; i++) {
+               const char *cmd = cmd_table[i].cmd;
+               const char *argument = cmd_table[i].argument;
+               const char *desc = cmd_table[i].desc;
+
+               printf("%-16s%-22s%s\n", cmd? cmd: "",
+                               argument? argument: "",
+                               desc? desc: "");
+
+               if (cmd_table[i].options) {
+                       for (j = 0; cmd_table[i].options[j].name;
+                            j++) {
+                               const char *options_desc =
+                                       cmd_table[i].options[j].desc ?
+                                       cmd_table[i].options[j].desc: "";
+
+                               printf("   --%-16s%s\n",
+                                               cmd_table[i].options[j].name,
+                                               options_desc);
+                       }
+               }
+       }
+
+       if (interactive == false)
+               fprintf(stdout, "\nNote: arguments and output are considered "
+                               "EXPERIMENTAL for now.\n");
+
+       return 0;
+}
+
+__connmanctl_lookup_cb __connmanctl_get_lookup_func(const char *text)
+{
+       int i, cmdlen, textlen;
+
+       if (!text)
+               return NULL;
+
+       textlen = strlen(text);
+
+       for (i = 0; cmd_table[i].cmd; i++) {
+               cmdlen = strlen(cmd_table[i].cmd);
+
+               if (textlen > cmdlen && text[cmdlen] != ' ')
+                       continue;
+
+               if (strncmp(cmd_table[i].cmd, text, cmdlen) == 0)
+                       return cmd_table[i].cb;
+       }
+
+       return NULL;
+}
+
+int __connmanctl_commands(DBusConnection *dbus_conn, char *argv[], int argc)
+{
+       int i, result;
+
+       connection = dbus_conn;
+
+       for (i = 0; cmd_table[i].cmd; i++) {
+               if (g_strcmp0(cmd_table[i].cmd, argv[0]) == 0 &&
+                               cmd_table[i].func) {
+                       result = cmd_table[i].func(argv, argc,
+                                       cmd_table[i].options);
+                       if (result < 0 && result != -EINPROGRESS)
+                               fprintf(stderr, "Error '%s': %s\n", argv[0],
+                                               strerror(-result));
+                       return result;
+               }
+       }
+
+       fprintf(stderr, "Error '%s': Unknown command\n", argv[0]);
+       return -EINVAL;
+}
+
+char *__connmanctl_lookup_command(const char *text, int state)
+{
+       static int i = 0;
+       static int len = 0;
+
+       if (state == 0) {
+               i = 0;
+               len = strlen(text);
+       }
+
+       while (cmd_table[i].cmd) {
+               const char *command = cmd_table[i].cmd;
+
+               i++;
+
+               if (strncmp(text, command, len) == 0)
+                       return strdup(command);
+       }
+
+       return NULL;
+}
+
+static char *get_path(char *full_path)
+{
+       char *path;
+
+       path = strrchr(full_path, '/');
+       if (path && *path != '\0')
+               path++;
+       else
+               path = full_path;
+
+       return path;
+}
+
+static void add_service_id(const char *path)
+{
+       g_hash_table_replace(service_hash, g_strdup(path),
+                       GINT_TO_POINTER(TRUE));
+}
+
+static void remove_service_id(const char *path)
+{
+       g_hash_table_remove(service_hash, path);
+}
+
+static void services_added(DBusMessageIter *iter)
+{
+       DBusMessageIter array;
+       char *path = NULL;
+
+       while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
+
+               dbus_message_iter_recurse(iter, &array);
+               if (dbus_message_iter_get_arg_type(&array) !=
+                                               DBUS_TYPE_OBJECT_PATH)
+                       return;
+
+               dbus_message_iter_get_basic(&array, &path);
+               add_service_id(get_path(path));
+
+               dbus_message_iter_next(iter);
+       }
+}
+
+static void update_services(DBusMessageIter *iter)
+{
+       DBusMessageIter array;
+       char *path;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       dbus_message_iter_recurse(iter, &array);
+       services_added(&array);
+
+       dbus_message_iter_next(iter);
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       dbus_message_iter_recurse(iter, &array);
+       while (dbus_message_iter_get_arg_type(&array) ==
+                                               DBUS_TYPE_OBJECT_PATH) {
+               dbus_message_iter_get_basic(&array, &path);
+               remove_service_id(get_path(path));
+
+               dbus_message_iter_next(&array);
+       }
+}
+
+static int populate_service_hash(DBusMessageIter *iter, const char *error,
+                               void *user_data)
+{
+       update_services(iter);
+       return 0;
+}
+
+static void add_peer_id(const char *path)
+{
+       g_hash_table_replace(peer_hash, g_strdup(path), GINT_TO_POINTER(TRUE));
+}
+
+static void remove_peer_id(const char *path)
+{
+       g_hash_table_remove(peer_hash, path);
+}
+
+static void peers_added(DBusMessageIter *iter)
+{
+       DBusMessageIter array;
+       char *path = NULL;
+
+       while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
+
+               dbus_message_iter_recurse(iter, &array);
+               if (dbus_message_iter_get_arg_type(&array) !=
+                                               DBUS_TYPE_OBJECT_PATH)
+                       return;
+
+               dbus_message_iter_get_basic(&array, &path);
+               add_peer_id(get_path(path));
+
+               dbus_message_iter_next(iter);
+       }
+}
+
+static void update_peers(DBusMessageIter *iter)
+{
+       DBusMessageIter array;
+       char *path;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       dbus_message_iter_recurse(iter, &array);
+       peers_added(&array);
+
+       dbus_message_iter_next(iter);
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       dbus_message_iter_recurse(iter, &array);
+       while (dbus_message_iter_get_arg_type(&array) ==
+                                               DBUS_TYPE_OBJECT_PATH) {
+               dbus_message_iter_get_basic(&array, &path);
+               remove_peer_id(get_path(path));
+
+               dbus_message_iter_next(&array);
+       }
+}
+
+static int populate_peer_hash(DBusMessageIter *iter,
+                                       const char *error, void *user_data)
+{
+       update_peers(iter);
+       return 0;
+}
+
+static void add_technology_id(const char *path)
+{
+       g_hash_table_replace(technology_hash, g_strdup(path),
+                       GINT_TO_POINTER(TRUE));
+}
+
+static void remove_technology_id(const char *path)
+{
+       g_hash_table_remove(technology_hash, path);
+}
+
+static void remove_technology(DBusMessageIter *iter)
+{
+       char *path = NULL;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH)
+               return;
+
+       dbus_message_iter_get_basic(iter, &path);
+       remove_technology_id(get_path(path));
+}
+
+static void add_technology(DBusMessageIter *iter)
+{
+       char *path = NULL;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH)
+               return;
+
+       dbus_message_iter_get_basic(iter, &path);
+       add_technology_id(get_path(path));
+}
+
+static void update_technologies(DBusMessageIter *iter)
+{
+       DBusMessageIter array;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       dbus_message_iter_recurse(iter, &array);
+
+       while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRUCT) {
+               DBusMessageIter object_path;
+
+               dbus_message_iter_recurse(&array, &object_path);
+
+               add_technology(&object_path);
+
+               dbus_message_iter_next(&array);
+       }
+}
+
+static int populate_technology_hash(DBusMessageIter *iter, const char *error,
+                               void *user_data)
+{
+       update_technologies(iter);
+
+       return 0;
+}
+
+static DBusHandlerResult monitor_completions_changed(
+               DBusConnection *connection,
+               DBusMessage *message, void *user_data)
+{
+       bool *enabled = user_data;
+       DBusMessageIter iter;
+       DBusHandlerResult handled;
+
+       if (*enabled)
+               handled = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       else
+               handled = DBUS_HANDLER_RESULT_HANDLED;
+
+       if (dbus_message_is_signal(message, "net.connman.Manager",
+                                       "ServicesChanged")) {
+               dbus_message_iter_init(message, &iter);
+               update_services(&iter);
+               return handled;
+       }
+
+       if (dbus_message_is_signal(message, "net.connman.Manager",
+                                               "PeersChanged")) {
+               dbus_message_iter_init(message, &iter);
+               update_peers(&iter);
+               return handled;
+       }
+
+       if (dbus_message_is_signal(message, "net.connman.Manager",
+                                       "TechnologyAdded")) {
+               dbus_message_iter_init(message, &iter);
+               add_technology(&iter);
+               return handled;
+       }
+
+       if (dbus_message_is_signal(message, "net.connman.Manager",
+                                       "TechnologyRemoved")) {
+               dbus_message_iter_init(message, &iter);
+               remove_technology(&iter);
+               return handled;
+       }
+
+       if (!g_strcmp0(dbus_message_get_interface(message),
+                                       "net.connman.Manager"))
+               return handled;
+
+       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+void __connmanctl_monitor_completions(DBusConnection *dbus_conn)
+{
+       bool *manager_enabled = NULL;
+       DBusError err;
+       int i;
+
+       for (i = 0; monitor[i].interface; i++) {
+               if (!strcmp(monitor[i].interface, "Manager")) {
+                       manager_enabled = &monitor[i].enabled;
+                       break;
+               }
+       }
+
+       if (!dbus_conn) {
+               g_hash_table_destroy(service_hash);
+               g_hash_table_destroy(technology_hash);
+
+               dbus_bus_remove_match(connection,
+                       "type='signal',interface='net.connman.Manager'", NULL);
+               dbus_connection_remove_filter(connection,
+                                       monitor_completions_changed,
+                                       manager_enabled);
+               return;
+       }
+
+       connection = dbus_conn;
+
+       service_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                                               g_free, NULL);
+
+       peer_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                                               g_free, NULL);
+
+       technology_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                                               g_free, NULL);
+
+       __connmanctl_dbus_method_call(connection,
+                               CONNMAN_SERVICE, CONNMAN_PATH,
+                               "net.connman.Manager", "GetServices",
+                               populate_service_hash, NULL, NULL, NULL);
+
+       __connmanctl_dbus_method_call(connection,
+                               CONNMAN_SERVICE, CONNMAN_PATH,
+                               "net.connman.Manager", "GetPeers",
+                               populate_peer_hash, NULL, NULL, NULL);
+
+       __connmanctl_dbus_method_call(connection,
+                               CONNMAN_SERVICE, CONNMAN_PATH,
+                               "net.connman.Manager", "GetTechnologies",
+                               populate_technology_hash, NULL, NULL, NULL);
+
+       dbus_connection_add_filter(connection,
+                               monitor_completions_changed, manager_enabled,
+                       NULL);
+
+       dbus_error_init(&err);
+       dbus_bus_add_match(connection,
+                       "type='signal',interface='net.connman.Manager'", &err);
+
+       if (dbus_error_is_set(&err))
+               fprintf(stderr, "Error: %s\n", err.message);
 }
index b2d606c..d5d1bec 100644 (file)
 extern "C" {
 #endif
 
+typedef char *(*__connmanctl_lookup_cb)(const char *text, int state);
+
 int __connmanctl_commands(DBusConnection *connection, char *argv[], int argc);
 char *__connmanctl_lookup_command(const char *text, int state);
+void __connmanctl_monitor_completions(DBusConnection *dbus_conn);
+__connmanctl_lookup_cb __connmanctl_get_lookup_func(const char *text);
 
 #ifdef __cplusplus
 }
index 0d79f97..826111f 100644 (file)
@@ -43,7 +43,7 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
        char *str;
        DBusMessageIter entry;
 
-       if (pre == NULL)
+       if (!pre)
                pre = "";
 
        while ((arg_type = dbus_message_iter_get_arg_type(iter))
@@ -87,7 +87,7 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
 
                case DBUS_TYPE_BOOLEAN:
                        dbus_message_iter_get_basic(iter, &b);
-                       if (b == FALSE)
+                       if (!b)
                                fprintf(stdout, "False");
                        else
                                fprintf(stdout, "True");
@@ -123,7 +123,7 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
                        break;
                }
 
-               if (dbus_message_iter_has_next(iter) == TRUE)
+               if (dbus_message_iter_has_next(iter))
                        fprintf(stdout, "%s", sep);
 
                dbus_message_iter_next(iter);
@@ -177,14 +177,13 @@ static int send_method_call(DBusConnection *connection,
        DBusPendingCall *call;
        struct dbus_callback *callback;
 
-       if (dbus_connection_send_with_reply(connection, message, &call,
-                                       TIMEOUT) == FALSE)
+       if (!dbus_connection_send_with_reply(connection, message, &call, TIMEOUT))
                goto end;
 
-        if (call == NULL)
-                goto end;
+       if (!call)
+               goto end;
 
-       if (cb != NULL) {
+       if (cb) {
                callback = g_new0(struct dbus_callback, 1);
                callback->cb = cb;
                callback->user_data = user_data;
@@ -230,20 +229,22 @@ static int append_variant(DBusMessageIter *iter, const char *property,
 int __connmanctl_dbus_method_call(DBusConnection *connection,
                const char *service, const char *path, const char *interface,
                const char *method, connmanctl_dbus_method_return_func_t cb,
-               void *user_data, int arg1, ...)
+               void *user_data, connmanctl_dbus_append_func_t append_func,
+               void *append_data)
 {
        DBusMessage *message;
-       va_list args;
+       DBusMessageIter iter;
 
        message = dbus_message_new_method_call(service, path, interface,
                        method);
 
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       va_start(args, arg1);
-       dbus_message_append_args_valist(message, arg1, args);
-       va_end(args);
+       if (append_func) {
+               dbus_message_iter_init_append(message, &iter);
+               append_func(&iter, append_data);
+       }
 
        return send_method_call(connection, message, cb, user_data);
 }
@@ -259,7 +260,7 @@ int __connmanctl_dbus_set_property(DBusConnection *connection,
        message = dbus_message_new_method_call("net.connman", path,
                        interface, "SetProperty");
 
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -272,6 +273,22 @@ int __connmanctl_dbus_set_property(DBusConnection *connection,
        return send_method_call(connection, message, cb, user_data);
 }
 
+void __connmanctl_dbus_append_dict(DBusMessageIter *iter,
+               connmanctl_dbus_append_func_t append_fn, void *append_data)
+{
+       DBusMessageIter dict;
+
+       dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+                        DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+                        DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
+                        DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
+
+       if (append_fn)
+               append_fn(&dict, append_data);
+
+       dbus_message_iter_close_container(iter, &dict);
+}
+
 void __connmanctl_dbus_append_dict_entry(DBusMessageIter *iter,
                const char *property, int type, void *value)
 {
@@ -298,7 +315,7 @@ int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
        message = dbus_message_new_method_call("net.connman", path,
                        interface, "SetProperty");
 
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -378,7 +395,54 @@ int __connmanctl_dbus_set_property_array(DBusConnection *connection,
        message = dbus_message_new_method_call("net.connman", path,
                        interface, "SetProperty");
 
-       if (message == NULL)
+       if (!message)
+               return -ENOMEM;
+
+       dbus_message_iter_init_append(message, &iter);
+
+       append_variant_array(&iter, property, append_fn, append_user_data);
+
+       return send_method_call(connection, message, cb, user_data);
+}
+
+int __connmanctl_dbus_session_change(DBusConnection *connection,
+               const char *session_path,
+               connmanctl_dbus_method_return_func_t cb, void * user_data,
+               const char *property, int type, void *value)
+{
+       DBusMessage *message;
+       DBusMessageIter iter;
+
+       message = dbus_message_new_method_call("net.connman", session_path,
+                       "net.connman.Session", "Change");
+
+       if (!message)
+               return -ENOMEM;
+
+       dbus_message_iter_init_append(message, &iter);
+
+       if (append_variant(&iter, property, type, value) < 0) {
+               dbus_message_unref(message);
+               return -EINVAL;
+       }
+
+       return send_method_call(connection, message, cb, user_data);
+}
+
+int __connmanctl_dbus_session_change_array(DBusConnection *connection,
+               const char *session_path,
+               connmanctl_dbus_method_return_func_t cb, void *user_data,
+               const char *property,
+               connmanctl_dbus_append_func_t append_fn,
+               void *append_user_data)
+{
+       DBusMessage *message;
+       DBusMessageIter iter;
+
+       message = dbus_message_new_method_call("net.connman", session_path,
+                       "net.connman.Session", "Change");
+
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
index 9fc2164..395808a 100644 (file)
@@ -39,21 +39,27 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
 
 typedef int (*connmanctl_dbus_method_return_func_t)(DBusMessageIter *iter,
                const char *error, void *user_data);
+
+typedef void (*connmanctl_dbus_append_func_t)(DBusMessageIter *iter,
+               void *user_data);
+
 int __connmanctl_dbus_method_call(DBusConnection *connection,
                const char *service, const char *path, const char *interface,
                const char *method, connmanctl_dbus_method_return_func_t cb,
-               void * user_data, int arg1, ...);
+               void * user_data, connmanctl_dbus_append_func_t append_fn,
+               void *append_data);
 
 int __connmanctl_dbus_set_property(DBusConnection *connection,
                const char *path, const char *interface,
                connmanctl_dbus_method_return_func_t cb, void * user_data,
                const char *property, int type, void *value);
 
-typedef void (*connmanctl_dbus_append_func_t)(DBusMessageIter *iter,
-               void *user_data);
+void __connmanctl_dbus_append_dict(DBusMessageIter *iter,
+               connmanctl_dbus_append_func_t append_fn, void *append_data);
 
 void __connmanctl_dbus_append_dict_entry(DBusMessageIter *iter,
                const char *property, int type, void *value);
+
 int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
                const char *path, const char *interface,
                connmanctl_dbus_method_return_func_t cb, void * user_data,
@@ -71,6 +77,18 @@ int __connmanctl_dbus_set_property_array(DBusConnection *connection,
                connmanctl_dbus_append_func_t append_fn,
                void *append_user_data);
 
+int __connmanctl_dbus_session_change(DBusConnection *connection,
+               const char *session_path,
+               connmanctl_dbus_method_return_func_t cb, void * user_data,
+               const char *property, int type, void *value);
+
+int __connmanctl_dbus_session_change_array(DBusConnection *connection,
+               const char *session_path,
+               connmanctl_dbus_method_return_func_t cb, void *user_data,
+               const char *property,
+               connmanctl_dbus_append_func_t append_fn,
+               void *append_user_data);
+
 #ifdef __cplusplus
 }
 #endif
index 8d6ecca..9705871 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -45,7 +45,7 @@ static int saved_point;
 
 void __connmanctl_quit(void)
 {
-       if (main_loop != NULL)
+       if (main_loop)
                g_main_loop_quit(main_loop);
 }
 
@@ -85,7 +85,7 @@ static void rl_handler(char *input)
        char **args, **trim_args;
        int num, len, err, i;
 
-       if (input == NULL) {
+       if (!input) {
                rl_newline(1, '\n');
                g_main_loop_quit(main_loop);
                return;
@@ -135,17 +135,51 @@ static char **complete_agent(const char *text, int start, int end)
        return NULL;
 }
 
-static char **complete_command(const char *text, int start, int end)
+/* Return how many parameters we have typed */
+int __connmanctl_input_calc_level(void)
 {
-       char **command = NULL;
+       int count = 0;
+       char *ptr;
+
+       ptr = rl_line_buffer;
+
+       while (*ptr) {
+               if (*ptr == ' ') {
+                       if (*(ptr + 1) == ' ') {
+                               ptr++;
+                               continue;
+                       } else
+                               count++;
+               }
+               ptr++;
+       }
+
+       return count;
+}
 
+void __connmanctl_input_lookup_end(void)
+{
        rl_attempted_completion_over = 1;
+}
 
-       if (start == 0)
-               command = rl_completion_matches(text,
+static char **complete_command(const char *text, int start, int end)
+{
+       if (start == 0) {
+               return rl_completion_matches(text,
                                __connmanctl_lookup_command);
 
-       return command;
+       } else {
+               __connmanctl_lookup_cb cb;
+               char **str = NULL;
+
+               cb = __connmanctl_get_lookup_func(rl_line_buffer);
+               if (cb)
+                       str = rl_completion_matches(text, cb);
+               else
+                       rl_attempted_completion_over = 1;
+
+               return str;
+       }
 }
 
 static struct {
@@ -164,7 +198,7 @@ void __connmanctl_agent_mode(const char *prompt,
        agent_handler.cb = input_handler;
        agent_handler.user_data = user_data;
 
-       if (input_handler != NULL)
+       if (input_handler)
                rl_callback_handler_install(prompt, rl_agent_handler);
        else {
                rl_set_prompt(prompt);
@@ -200,17 +234,20 @@ int __connmanctl_input_init(int argc, char *argv[])
                return 1;
        }
 
-       channel = g_io_channel_unix_new(fileno(stdin));
-       source = g_io_add_watch(channel, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
-                       input_handler, NULL);
-       g_io_channel_unref(channel);
-
        if (argc < 2) {
                interactive = true;
 
+               channel = g_io_channel_unix_new(fileno(stdin));
+               source = g_io_add_watch(channel,
+                               G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
+                               input_handler, NULL);
+               g_io_channel_unref(channel);
+
+               __connmanctl_monitor_completions(connection);
+
                __connmanctl_command_mode();
-               err = -EINPROGRESS;
 
+               err = -EINPROGRESS;
        } else {
                interactive = false;
 
@@ -219,7 +256,7 @@ int __connmanctl_input_init(int argc, char *argv[])
                        err = __connmanctl_commands(connection, help, 1);
                else
                        err = __connmanctl_commands(connection, argv + 1,
-                                       argc -1);
+                                       argc - 1);
        }
 
        if (err == -EINPROGRESS) {
@@ -229,15 +266,16 @@ int __connmanctl_input_init(int argc, char *argv[])
                err = 0;
        }
 
-       g_source_remove(source);
+       if (interactive) {
+               g_source_remove(source);
+               __connmanctl_monitor_completions(NULL);
 
-       if (interactive == true) {
                rl_callback_handler_remove();
                rl_message("");
        }
 
        dbus_connection_unref(connection);
-       if (main_loop != NULL)
+       if (main_loop)
                g_main_loop_unref(main_loop);
 
        if (err < 0)
index fb80077..c7256a4 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -33,6 +33,8 @@ void __connmanctl_quit(void);
 bool __connmanctl_is_interactive(void);
 void __connmanctl_save_rl(void);
 void __connmanctl_redraw_rl(void);
+int __connmanctl_input_calc_level(void);
+void __connmanctl_input_lookup_end(void);
 typedef void (* connmanctl_input_func_t) (char *input, void *user_data);
 void __connmanctl_agent_mode(const char *prompt,
                connmanctl_input_func_t input_handler, void *user_data);
diff --git a/client/peers.c b/client/peers.c
new file mode 100644 (file)
index 0000000..bf1aa0e
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2014  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include "peers.h"
+
+static void print_peer(char *path, DBusMessageIter *iter)
+{
+       char *name = "", *state = "";
+       char *str, *property;
+       DBusMessageIter entry, val;
+       int count = 0;
+
+       while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
+               dbus_message_iter_recurse(iter, &entry);
+               dbus_message_iter_get_basic(&entry, &property);
+
+               if (strcmp(property, "Name") == 0) {
+                       dbus_message_iter_next(&entry);
+                       dbus_message_iter_recurse(&entry, &val);
+                       dbus_message_iter_get_basic(&val, &name);
+               } else if (strcmp(property, "State") == 0) {
+                       dbus_message_iter_next(&entry);
+                       dbus_message_iter_recurse(&entry, &val);
+                       dbus_message_iter_get_basic(&val, &state);
+               }
+
+               dbus_message_iter_next(iter);
+               count++;
+       }
+
+       str = strrchr(path, '/');
+       if (str)
+               str++;
+       else
+               str = path;
+
+       if (count > 0)
+               fprintf(stdout, "%s %s %s", name, state, str);
+       else
+               fprintf(stdout, "%s %s", "unchanged", str);
+}
+
+static void list_peer_array(DBusMessageIter *iter)
+{
+       DBusMessageIter array, dict;
+       char *path = NULL;
+
+       while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) {
+               dbus_message_iter_recurse(iter, &array);
+               if (dbus_message_iter_get_arg_type(&array)
+                               != DBUS_TYPE_OBJECT_PATH)
+                       return;
+
+               dbus_message_iter_get_basic(&array, &path);
+
+               dbus_message_iter_next(&array);
+               if (dbus_message_iter_get_arg_type(&array)
+                                               == DBUS_TYPE_ARRAY) {
+                       dbus_message_iter_recurse(&array, &dict);
+                       print_peer(path, &dict);
+               }
+
+               if (dbus_message_iter_has_next(iter))
+                       fprintf(stdout, "\n");
+
+               dbus_message_iter_next(iter);
+       }
+}
+
+void __connmanctl_peers_list(DBusMessageIter *iter)
+{
+       DBusMessageIter array;
+       char *path;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       dbus_message_iter_recurse(iter, &array);
+       list_peer_array(&array);
+
+       dbus_message_iter_next(iter);
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+               return;
+
+       fprintf(stdout, "\n}, {");
+
+       dbus_message_iter_recurse(iter, &array);
+       while (dbus_message_iter_get_arg_type(&array)
+                                       == DBUS_TYPE_OBJECT_PATH) {
+               dbus_message_iter_get_basic(&array, &path);
+               fprintf(stdout, "\n%s %s", "removed", path);
+
+               dbus_message_iter_next(&array);
+       }
+
+}
similarity index 61%
rename from include/types.h
rename to client/peers.h
index 022563c..fdf7ce7 100644 (file)
@@ -2,11 +2,12 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2 as
- *  published by the Free Software Foundation.
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *
  */
 
-#ifndef __CONNMAN_TYPES_H
-#define __CONNMAN_TYPES_H
+#ifndef __CONNMANCTL_PEERS_H
+#define __CONNMANCTL_PEERS_H
+
+#include <dbus/dbus.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#ifndef        FALSE
-#define        FALSE   (0)
-#endif
-
-#ifndef        TRUE
-#define        TRUE    (!FALSE)
-#endif
-
-typedef int            connman_bool_t;
+void __connmanctl_peers_list(DBusMessageIter *iter);
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* __CONNMAN_TYPES_H */
+#endif /* __CONNMANCTL_PEERS_H */
index 045947c..0c18669 100644 (file)
@@ -57,11 +57,17 @@ static void print_service(char *path, DBusMessageIter *iter)
                        dbus_message_iter_recurse(&entry, &val);
                        dbus_message_iter_get_basic(&val, &str);
 
-                       if (str != NULL) {
+                       if (str) {
                                if (strcmp(str, "online") == 0)
                                        state = 'O';
                                else if (strcmp(str, "ready") == 0)
                                        state = 'R';
+                               else if (!strcmp(str, "association"))
+                                       state = 'a';
+                               else if (!strcmp(str, "configuration"))
+                                       state = 'c';
+                               else if (!strcmp(str, "disconnect"))
+                                       state = 'd';
                        }
 
                } else if (strcmp(property, "AutoConnect") == 0) {
@@ -80,18 +86,15 @@ static void print_service(char *path, DBusMessageIter *iter)
        }
 
        str = strrchr(path, '/');
-       if (str != NULL)
+       if (str)
                str++;
        else
                str = path;
 
-       if (count > 0) {
-               if (*name == '\0')
-                       name = "<hidden>";
-
+       if (count > 0)
                fprintf(stdout, "%c%c%c %-20s %s", favorite != 0 ? '*' : ' ',
                                autoconn != 0 ? 'A' : ' ', state, name, str);
-       else
+       else
                fprintf(stdout, "%-24s %s", "unchanged", str);
 
 }
@@ -117,7 +120,7 @@ static void list_service_array(DBusMessageIter *iter)
                        print_service(path, &dict);
                }
 
-               if (dbus_message_iter_has_next(iter) == TRUE)
+               if (dbus_message_iter_has_next(iter))
                        fprintf(stdout, "\n");
 
                dbus_message_iter_next(iter);
index f4b8d3c..d7bcbfe 100644 (file)
@@ -53,7 +53,7 @@ static void print_connection(char *path, DBusMessageIter *iter)
                        dbus_message_iter_recurse(&entry, &val);
                        dbus_message_iter_get_basic(&val, &str);
 
-                       if (str != NULL) {
+                       if (str) {
                                if (strcmp(str, "ready") == 0)
                                        state = 'R';
                                else if (strcmp(str, "configuration") == 0)
@@ -67,7 +67,7 @@ static void print_connection(char *path, DBusMessageIter *iter)
        }
 
        str = strrchr(path, '/');
-       if (str != NULL)
+       if (str)
                str++;
        else
                str = path;
@@ -101,7 +101,7 @@ void __connmanctl_vpnconnections_list(DBusMessageIter *iter)
                        print_connection(path, &dict);
                }
 
-               if (dbus_message_iter_has_next(&array) == TRUE)
+               if (dbus_message_iter_has_next(&array))
                        fprintf(stdout, "\n");
 
                dbus_message_iter_next(&array);
diff --git a/compile b/compile
new file mode 100755 (executable)
index 0000000..862a14e
--- /dev/null
+++ b/compile
@@ -0,0 +1,343 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-03-05.13; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
+# Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..d622a44
--- /dev/null
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep -q __ELF__
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+       exit ;;
+    *:SolidBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    *:MirBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE="alpha" ;;
+           "EV5 (21164)")
+               UNAME_MACHINE="alphaev5" ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE="alphaev56" ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE="alphapca56" ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE="alphapca57" ;;
+           "EV6 (21264)")
+               UNAME_MACHINE="alphaev6" ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE="alphaev67" ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE="alphaev69" ;;
+           "EV7 (21364)")
+               UNAME_MACHINE="alphaev7" ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE="alphaev79" ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+       echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    s390x:SunOS:*:*)
+       echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux${UNAME_RELEASE}
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       eval $set_cc_for_build
+       SUN_ARCH="i386"
+       # If there is a compiler, see if it is configured for 64-bit objects.
+       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+       # This test works for both compilers.
+       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+               SUN_ARCH="x86_64"
+           fi
+       fi
+       echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+       echo m68k-milan-mint${UNAME_RELEASE}
+       exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+       echo m68k-hades-mint${UNAME_RELEASE}
+       exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+       echo m68k-unknown-mint${UNAME_RELEASE}
+       exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten${UNAME_RELEASE}
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c &&
+         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`$dummy $dummyarg` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[4567])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                   case "${sc_cpu_version}" in
+                     523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "${sc_kernel_bits}" in
+                         32) HP_ARCH="hppa2.0n" ;;
+                         64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                       esac ;;
+                   esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^            //' << EOF >$dummy.c
+
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
+
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
+
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           eval $set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep -q __LP64__
+           then
+               HP_ARCH="hppa2.0w"
+           else
+               HP_ARCH="hppa64"
+           fi
+       fi
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+       exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+       exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+       exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+       exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    5000:UNIX_System_V:4.*:*)
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:FreeBSD:*:*)
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       case ${UNAME_PROCESSOR} in
+           amd64)
+               echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+           *)
+               echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       esac
+       exit ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit ;;
+    *:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit ;;
+    i*:MSYS*:*)
+       echo ${UNAME_MACHINE}-pc-msys
+       exit ;;
+    i*:windows32*:*)
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
+       exit ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit ;;
+    *:Interix*:*)
+       case ${UNAME_MACHINE} in
+           x86)
+               echo i586-pc-interix${UNAME_RELEASE}
+               exit ;;
+           authenticamd | genuineintel | EM64T)
+               echo x86_64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+           IA64)
+               echo ia64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+       esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit ;;
+    8664:Windows_NT:*)
+       echo x86_64-pc-mks
+       exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-unknown-cygwin
+       exit ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       exit ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit ;;
+    aarch64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+       esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit ;;
+    arm*:Linux:*:*)
+       eval $set_cc_for_build
+       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_EABI__
+       then
+           echo ${UNAME_MACHINE}-unknown-linux-gnu
+       else
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+           else
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+           fi
+       fi
+       exit ;;
+    avr32*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    cris:Linux:*:*)
+       echo ${UNAME_MACHINE}-axis-linux-gnu
+       exit ;;
+    crisv32:Linux:*:*)
+       echo ${UNAME_MACHINE}-axis-linux-gnu
+       exit ;;
+    frv:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    hexagon:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    i*86:Linux:*:*)
+       LIBC=gnu
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #ifdef __dietlibc__
+       LIBC=dietlibc
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+       echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+       exit ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m32r*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef ${UNAME_MACHINE}
+       #undef ${UNAME_MACHINE}el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=${UNAME_MACHINE}el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=${UNAME_MACHINE}
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       ;;
+    or32:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    padre:Linux:*:*)
+       echo sparc-unknown-linux-gnu
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit ;;
+    sh64*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    tile*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    vax:Linux:*:*)
+       echo ${UNAME_MACHINE}-dec-linux-gnu
+       exit ;;
+    x86_64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    xtensa*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+       # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo ${UNAME_MACHINE}-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
+       # Note: whatever this is, it MUST be the same as what config.sub
+       # prints for the "djgpp" host, or else GDB configury will decide that
+       # this is a cross-build.
+       echo i586-pc-msdosdjgpp
+       exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+       OS_REL='.3'
+       test -r /etc/.relid \
+           && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+           && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo ${UNAME_MACHINE}-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+       exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
+       echo i586-pc-haiku
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-7:SUPER-UX:*:*)
+       echo sx7-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8:SUPER-UX:*:*)
+       echo sx8-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8R:SUPER-UX:*:*)
+       echo sx8r-nec-superux${UNAME_RELEASE}
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+       case $UNAME_PROCESSOR in
+           i386)
+               eval $set_cc_for_build
+               if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+                 if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                     (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                     grep IS_64BIT_ARCH >/dev/null
+                 then
+                     UNAME_PROCESSOR="x86_64"
+                 fi
+               fi ;;
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+       echo mips-sei-seiux${UNAME_RELEASE}
+       exit ;;
+    *:DragonFly:*:*)
+       echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       case "${UNAME_MACHINE}" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+       exit ;;
+    i*86:rdos:*:*)
+       echo ${UNAME_MACHINE}-pc-rdos
+       exit ;;
+    i*86:AROS:*:*)
+       echo ${UNAME_MACHINE}-pc-aros
+       exit ;;
+    x86_64:VMkernel:*:*)
+       echo ${UNAME_MACHINE}-unknown-esx
+       exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+       "4"
+#else
+       ""
+#endif
+       ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    c34*)
+       echo c34-convex-bsd
+       exit ;;
+    c38*)
+       echo c38-convex-bsd
+       exit ;;
+    c4*)
+       echo c4-convex-bsd
+       exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..b45bbe4
--- /dev/null
@@ -0,0 +1,80 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <pppd/pppd.h> header file. */
+#undef HAVE_PPPD_PPPD_H
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+#undef HAVE_READLINE_READLINE_H
+
+/* Define to 1 if you have the <resolv.h> header file. */
+#undef HAVE_RESOLV_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/inotify.h> header file. */
+#undef HAVE_SYS_INOTIFY_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Maximal size of a statistics round robin file */
+#undef STATS_MAX_FILE_SIZE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..6205f84
--- /dev/null
@@ -0,0 +1,1782 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-04-18'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis | -knuth | -cray | -microblaze)
+               os=
+               basic_machine=$1
+               ;;
+       -bluegene*)
+               os=-cnk
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco6)
+               os=-sco5v6
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | aarch64 | aarch64_be \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | am33_2.0 \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+       | bfin \
+       | c4x | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | epiphany \
+       | fido | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | hexagon \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k | iq2000 \
+       | le32 | le64 \
+       | lm32 \
+       | m32c | m32r | m32rle | m68000 | m68k | m88k \
+       | maxq | mb | microblaze | mcore | mep | metag \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64octeon | mips64octeonel \
+       | mips64orion | mips64orionel \
+       | mips64r5900 | mips64r5900el \
+       | mips64vr | mips64vrel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mips64vr5900 | mips64vr5900el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | moxie \
+       | mt \
+       | msp430 \
+       | nds32 | nds32le | nds32be \
+       | nios | nios2 \
+       | ns16k | ns32k \
+       | open8 \
+       | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle \
+       | pyramid \
+       | rl78 | rx \
+       | score \
+       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+       | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+       | spu \
+       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+       | ubicom32 \
+       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+       | we32k \
+       | x86 | xc16x | xstormy16 | xtensa \
+       | z8k | z80)
+               basic_machine=$basic_machine-unknown
+               ;;
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+       ms1)
+               basic_machine=mt-unknown
+               ;;
+
+       strongarm | thumb | xscale)
+               basic_machine=arm-unknown
+               ;;
+       xgate)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       xscaleeb)
+               basic_machine=armeb-unknown
+               ;;
+
+       xscaleel)
+               basic_machine=armel-unknown
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | aarch64-* | aarch64_be-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* | avr32-* \
+       | be32-* | be64-* \
+       | bfin-* | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
+       | clipper-* | craynv-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | hexagon-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* | iq2000-* \
+       | le32-* | le64-* \
+       | lm32-* \
+       | m32c-* | m32r-* | m32rle-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64octeon-* | mips64octeonel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64r5900-* | mips64r5900el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mips64vr5900-* | mips64vr5900el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | mmix-* \
+       | mt-* \
+       | msp430-* \
+       | nds32-* | nds32le-* | nds32be-* \
+       | nios-* | nios2-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | open8-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+       | pyramid-* \
+       | rl78-* | romp-* | rs6000-* | rx-* \
+       | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+       | sparclite-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+       | tahoe-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile*-* \
+       | tron-* \
+       | ubicom32-* \
+       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+       | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* \
+       | xstormy16-* | xtensa*-* \
+       | ymp-* \
+       | z8k-* | z80-*)
+               ;;
+       # Recognize the basic CPU types without company name, with glob match.
+       xtensa*)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       abacus)
+               basic_machine=abacus-unknown
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amd64)
+               basic_machine=x86_64-pc
+               ;;
+       amd64-*)
+               basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aros)
+               basic_machine=i386-pc
+               os=-aros
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       blackfin)
+               basic_machine=bfin-unknown
+               os=-linux
+               ;;
+       blackfin-*)
+               basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       bluegene*)
+               basic_machine=powerpc-ibm
+               os=-cnk
+               ;;
+       c54x-*)
+               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       cegcc)
+               basic_machine=arm-unknown
+               os=-cegcc
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       craynv)
+               basic_machine=craynv-cray
+               os=-unicosmp
+               ;;
+       cr16 | cr16-*)
+               basic_machine=cr16-unknown
+               os=-elf
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       crisv32 | crisv32-* | etraxfs*)
+               basic_machine=crisv32-axis
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       crx)
+               basic_machine=crx-unknown
+               os=-elf
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dicos)
+               basic_machine=i686-pc
+               os=-dicos
+               ;;
+       djgpp)
+               basic_machine=i586-pc
+               os=-msdosdjgpp
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m68knommu)
+               basic_machine=m68k-unknown
+               os=-linux
+               ;;
+       m68knommu-*)
+               basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       microblaze)
+               basic_machine=microblaze-xilinx
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       mingw32ce)
+               basic_machine=arm-unknown
+               os=-mingw32ce
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       ms1-*)
+               basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+               ;;
+       msys)
+               basic_machine=i386-pc
+               os=-msys
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       nacl)
+               basic_machine=le32-unknown
+               os=-nacl
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+       nse-tandem)
+               basic_machine=nse-tandem
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       openrisc | openrisc-*)
+               basic_machine=or32-unknown
+               ;;
+       os400)
+               basic_machine=powerpc-ibm
+               os=-os400
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       parisc)
+               basic_machine=hppa-unknown
+               os=-linux
+               ;;
+       parisc-*)
+               basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pc98)
+               basic_machine=i386-pc
+               ;;
+       pc98-*)
+               basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2 | pentiumiii | pentium3)
+               basic_machine=i686-pc
+               ;;
+       pentium4)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium4-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc | ppcbe)    basic_machine=powerpc-unknown
+               ;;
+       ppc-* | ppcbe-*)
+               basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rdos)
+               basic_machine=i386-pc
+               os=-rdos
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sde)
+               basic_machine=mipsisa32-sde
+               os=-elf
+               ;;
+       sei)
+               basic_machine=mips-sei
+               os=-seiux
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sh5el)
+               basic_machine=sh5le-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       strongarm-* | thumb-*)
+               basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+       tile*)
+               basic_machine=$basic_machine-unknown
+               os=-linux-gnu
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       tpf)
+               basic_machine=s390x-ibm
+               os=-tpf
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xbox)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       xscale-* | xscalee[bl]-*)
+               basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       z80-*-coff)
+               basic_machine=z80-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       mmix)
+               basic_machine=mmix-knuth
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+       # First match some system type aliases
+       # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -auroraux)
+               os=-auroraux
+               ;;
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+             | -sym* | -kopensolaris* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* | -aros* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+             | -openbsd* | -solidbsd* \
+             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* | -cegcc* \
+             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux-dietlibc)
+               os=-linux-dietlibc
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -os400*)
+               os=-os400
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -syllable*)
+               os=-syllable
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -tpf*)
+               os=-tpf
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -aros*)
+               os=-aros
+               ;;
+       -kaos*)
+               os=-kaos
+               ;;
+       -zvmoe)
+               os=-zvmoe
+               ;;
+       -dicos*)
+               os=-dicos
+               ;;
+       -nacl*)
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       score-*)
+               os=-elf
+               ;;
+       spu-*)
+               os=-elf
+               ;;
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       c4x-* | tic4x-*)
+               os=-coff
+               ;;
+       hexagon-*)
+               os=-elf
+               ;;
+       tic54x-*)
+               os=-coff
+               ;;
+       tic55x-*)
+               os=-coff
+               ;;
+       tic6x-*)
+               os=-coff
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+       pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mep-*)
+               os=-elf
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-haiku)
+               os=-haiku
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-knuth)
+               os=-mmixware
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-gould)
+               os=-sysv
+               ;;
+       *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+       *-sgi)
+               os=-irix
+               ;;
+       *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -cnk*|-aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -os400*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -tpf*)
+                               vendor=ibm
+                               ;;
+                       -vxsim* | -vxworks* | -windiss*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..ca5ddf6
--- /dev/null
+++ b/configure
@@ -0,0 +1,15944 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for connman 1.24.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='connman'
+PACKAGE_TARNAME='connman'
+PACKAGE_VERSION='1.24'
+PACKAGE_STRING='connman 1.24'
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+ac_default_prefix=/usr/local
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+VPN_FALSE
+VPN_TRUE
+DATAFILES_FALSE
+DATAFILES_TRUE
+WPASUPPLICANT
+GNUTLS_LIBS
+GNUTLS_CFLAGS
+CLIENT_FALSE
+CLIENT_TRUE
+IPTABLES_SAVE
+TOOLS_FALSE
+TOOLS_TRUE
+WISPR_FALSE
+WISPR_TRUE
+NEARD_FALSE
+NEARD_TRUE
+PACRUNNER_FALSE
+PACRUNNER_TRUE
+DUNDEE_FALSE
+DUNDEE_TRUE
+OFONO_FALSE
+OFONO_TRUE
+BLUETOOTH_FALSE
+BLUETOOTH_TRUE
+WIFI_FALSE
+WIFI_TRUE
+GADGET_FALSE
+GADGET_TRUE
+ETHERNET_FALSE
+ETHERNET_TRUE
+LOOPBACK_FALSE
+LOOPBACK_TRUE
+SELINUX_FALSE
+SELINUX_TRUE
+POLKIT_FALSE
+POLKIT_TRUE
+POLKIT_DATADIR
+NMCOMPAT_FALSE
+NMCOMPAT_TRUE
+TEST_FALSE
+TEST_TRUE
+XTABLES_LIBS
+XTABLES_CFLAGS
+SYSTEMD_FALSE
+SYSTEMD_TRUE
+SYSTEMD_UNITDIR
+DBUS_DATADIR
+DBUS_CONFDIR
+DBUS_LIBS
+DBUS_CFLAGS
+GLIB_LIBS
+GLIB_CFLAGS
+SESSION_POLICY_LOCAL_BUILTIN_FALSE
+SESSION_POLICY_LOCAL_BUILTIN_TRUE
+SESSION_POLICY_LOCAL_FALSE
+SESSION_POLICY_LOCAL_TRUE
+TIST_BUILTIN_FALSE
+TIST_BUILTIN_TRUE
+TIST_FALSE
+TIST_TRUE
+IOSPM_FALSE
+IOSPM_TRUE
+PPTP_BUILTIN_FALSE
+PPTP_BUILTIN_TRUE
+PPTP_FALSE
+PPTP_TRUE
+PPTP
+L2TP_BUILTIN_FALSE
+L2TP_BUILTIN_TRUE
+L2TP_FALSE
+L2TP_TRUE
+L2TP
+PPPD
+VPNC_BUILTIN_FALSE
+VPNC_BUILTIN_TRUE
+VPNC_FALSE
+VPNC_TRUE
+VPNC
+OPENVPN_BUILTIN_FALSE
+OPENVPN_BUILTIN_TRUE
+OPENVPN_FALSE
+OPENVPN_TRUE
+OPENVPN
+OPENCONNECT_BUILTIN_FALSE
+OPENCONNECT_BUILTIN_TRUE
+OPENCONNECT_FALSE
+OPENCONNECT_TRUE
+OPENCONNECT
+HH2SERIAL_GPS_BUILTIN_FALSE
+HH2SERIAL_GPS_BUILTIN_TRUE
+HH2SERIAL_GPS_FALSE
+HH2SERIAL_GPS_TRUE
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+abs_top_builddir
+abs_top_srcdir
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_optimization
+enable_debug
+enable_pie
+enable_hh2serial_gps
+with_openconnect
+enable_openconnect
+with_openvpn
+enable_openvpn
+with_vpnc
+enable_vpnc
+enable_l2tp
+enable_pptp
+enable_iospm
+enable_tist
+enable_session_policy_local
+with_stats_max_file_size
+with_dbusconfdir
+with_dbusdatadir
+with_systemdunitdir
+enable_test
+enable_nmcompat
+enable_polkit
+enable_selinux
+enable_loopback
+enable_ethernet
+enable_gadget
+enable_wifi
+enable_bluetooth
+enable_ofono
+enable_dundee
+enable_pacrunner
+enable_neard
+enable_wispr
+enable_tools
+enable_client
+enable_datafiles
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+GLIB_CFLAGS
+GLIB_LIBS
+DBUS_CFLAGS
+DBUS_LIBS
+XTABLES_CFLAGS
+XTABLES_LIBS
+GNUTLS_CFLAGS
+GNUTLS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures connman 1.24 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/connman]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of connman 1.24:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-static[=PKGS]  build static libraries [default=no]
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --disable-optimization  disable code optimization through compiler
+  --enable-debug          enable compiling with debugging information
+  --enable-pie            enable position independent executables flag
+  --enable-hh2serial-gps  enable hh2serial GPS support
+  --enable-openconnect    enable openconnect support
+  --enable-openvpn        enable openvpn support
+  --enable-vpnc           enable vpnc support
+  --enable-l2tp           enable l2tp support
+  --enable-pptp           enable pptp support
+  --enable-iospm          enable Intel OSPM support
+  --enable-tist           enable TI Shared Transport support
+  --enable-session-policy-local
+                          enable local file Session policy configuration
+                          support
+  --enable-test           enable test/example scripts
+  --enable-nmcompat       enable Network Manager support
+  --enable-polkit         enable PolicyKit support
+  --enable-selinux        enable selinux support
+  --disable-loopback      disable loopback support
+  --disable-ethernet      disable Ethernet support
+  --disable-gadget        disable USB Gadget support
+  --disable-wifi          disable WiFi support
+  --disable-bluetooth     disable Bluetooth support
+  --disable-ofono         disable oFono support
+  --disable-dundee        disable dundee support (Bluetooth DUN)
+  --disable-pacrunner     disable PACrunner support
+  --disable-neard         disable Neard support
+  --disable-wispr         disable WISPr support
+  --disable-tools         disable testing tools
+  --disable-client        disable command line client
+  --disable-datafiles     don't install configuration and data files
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-openconnect=PROGRAM
+                          specify location of openconnect binary
+  --with-openvpn=PROGRAM  specify location of openvpn binary
+  --with-vpnc=PROGRAM     specify location of vpnc binary
+  --with-stats-max-file-size=SIZE
+                          Maximal size of a statistics round robin file
+  --with-dbusconfdir=PATH path to D-Bus config directory
+  --with-dbusdatadir=PATH path to D-Bus data directory
+  --with-systemdunitdir=DIR
+                          path to systemd service directory
+
+Some influential environment variables:
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config
+  GLIB_LIBS   linker flags for GLIB, overriding pkg-config
+  DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
+  DBUS_LIBS   linker flags for DBUS, overriding pkg-config
+  XTABLES_CFLAGS
+              C compiler flags for XTABLES, overriding pkg-config
+  XTABLES_LIBS
+              linker flags for XTABLES, overriding pkg-config
+  GNUTLS_CFLAGS
+              C compiler flags for GNUTLS, overriding pkg-config
+  GNUTLS_LIBS linker flags for GNUTLS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+connman configure 1.24
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by connman $as_me 1.24, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+        for ac_exec_ext in '' $ac_executable_extensions; do
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+          case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+            'mkdir (GNU coreutils) '* | \
+            'mkdir (coreutils) '* | \
+            'mkdir (fileutils) '4.1*)
+              ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+              break 3;;
+          esac
+        done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='connman'
+ VERSION='1.24'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+fi
+
+
+       if (test "${CFLAGS}" = ""); then
+               CFLAGS="-Wall -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
+       fi
+       if (test "$USE_MAINTAINER_MODE" = "yes"); then
+               CFLAGS+=" -Werror -Wextra"
+               CFLAGS+=" -Wno-unused-parameter"
+               CFLAGS+=" -Wno-missing-field-initializers"
+               CFLAGS+=" -Wdeclaration-after-statement"
+               CFLAGS+=" -Wmissing-declarations"
+               CFLAGS+=" -Wredundant-decls"
+               CFLAGS+=" -Wcast-align"
+               CFLAGS="$CFLAGS -DG_DISABLE_DEPRECATED"
+       fi
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+if test "x$CC" != xcc; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
+$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
+$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
+fi
+set dummy $CC; ac_cc=`$as_echo "$2" |
+                     sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+# Make sure it works both with $CC and with simple cc.
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+rm -f conftest2.*
+if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+   test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+then
+  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
+  if test "x$CC" != xcc; then
+    # Test first that cc exists at all.
+    if { ac_try='cc -c conftest.$ac_ext >&5'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+      rm -f conftest2.*
+      if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+        test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+      then
+       # cc works too.
+       :
+      else
+       # cc exists but doesn't like -o.
+       eval ac_cv_prog_cc_${ac_cc}_c_o=no
+      fi
+    fi
+  fi
+else
+  eval ac_cv_prog_cc_${ac_cc}_c_o=no
+fi
+rm -f core conftest*
+
+fi
+if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
+
+fi
+
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+
+
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC-cc} accepts -fPIE" >&5
+$as_echo_n "checking whether ${CC-cc} accepts -fPIE... " >&6; }
+if ${ac_cv_prog_cc_pie+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+               echo 'void f(){}' > conftest.c
+               if test -z "`${CC-cc} -fPIE -pie -c conftest.c 2>&1`"; then
+                       ac_cv_prog_cc_pie=yes
+               else
+                       ac_cv_prog_cc_pie=no
+               fi
+               rm -rf conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_pie" >&5
+$as_echo "$ac_cv_prog_cc_pie" >&6; }
+
+
+
+
+
+
+
+# Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_static=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+case `pwd` in
+  *\ * | *\    *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+       # Check to see if the nm accepts a BSD-compat flag.
+       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       #   nm: unknown option "B" ignored
+       # Tru64's nm complains that /dev/null is an invalid object file
+       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+       */dev/null* | *'Invalid file or object type'*)
+         lt_cv_path_NM="$tmp_nm -B"
+         break
+         ;;
+       *)
+         case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+         */dev/null*)
+           lt_cv_path_NM="$tmp_nm -p"
+           break
+           ;;
+         *)
+           lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+           continue # so that we can try to find one that supports BSD flags
+           ;;
+         esac
+         ;;
+       esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536      # usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[         ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+             test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+       # Ensure the archiver fails upon bogus file names.
+       rm -f conftest.$ac_objext libconftest.a
+       { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+       if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[     ]\($symcode$symcode*\)[         ][      ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+       if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+         cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         lt_globsym_save_LIBS=$LIBS
+         lt_globsym_save_CFLAGS=$CFLAGS
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+           pipe_works=yes
+         fi
+         LIBS=$lt_globsym_save_LIBS
+         CFLAGS=$lt_globsym_save_CFLAGS
+       else
+         echo "cannot find nm_test_func in $nlist" >&5
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+       HPUX_IA64_MODE="32"
+       ;;
+      *ELF-64*)
+       HPUX_IA64_MODE="64"
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -melf32bsmip"
+         ;;
+       *N32*)
+         LD="${LD-ld} -melf32bmipn32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -melf64bmip"
+       ;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -32"
+         ;;
+       *N32*)
+         LD="${LD-ld} -n32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -64"
+         ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_i386_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_i386"
+           ;;
+         ppc64-*linux*|powerpc64-*linux*)
+           LD="${LD-ld} -m elf32ppclinux"
+           ;;
+         s390x-*linux*)
+           LD="${LD-ld} -m elf_s390"
+           ;;
+         sparc64-*linux*)
+           LD="${LD-ld} -m elf32_sparc"
+           ;;
+       esac
+       ;;
+      *64-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_x86_64_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_x86_64"
+           ;;
+         ppc*-*linux*|powerpc*-*linux*)
+           LD="${LD-ld} -m elf64ppc"
+           ;;
+         s390*-*linux*|s390*-*tpf*)
+           LD="${LD-ld} -m elf64_s390"
+           ;;
+         sparc*-*linux*)
+           LD="${LD-ld} -m elf64_sparc"
+           ;;
+       esac
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+       if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+         LD="${LD-ld} -64"
+       fi
+       ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+       # By default we will add the -single_module flag. You can override
+       # by either setting the environment variable LT_MULTI_MODULE
+       # non-empty at configure time, or by adding -multi_module to the
+       # link flags.
+       rm -rf libconftest.dylib*
+       echo "int foo(void){return 1;}" > conftest.c
+       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&5
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+         lt_cv_apple_cc_single_mod=yes
+       else
+         cat conftest.err >&5
+       fi
+       rm -rf libconftest.dylib*
+       rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+       10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+       10.[012]*)
+         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+       10.*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_shared=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_fast_install=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       # +Z the default
+       ;;
+      *)
+       lt_prog_compiler_pic='-fPIC'
+       ;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static='-Bstatic'
+      else
+       lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+       # +Z the default
+       ;;
+      *)
+       lt_prog_compiler_pic='+Z'
+       ;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-KPIC'
+       lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fPIC'
+       lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='--shared'
+       lt_prog_compiler_static='--static'
+       ;;
+      nagfor*)
+       # NAG Fortran compiler
+       lt_prog_compiler_wl='-Wl,-Wl,,'
+       lt_prog_compiler_pic='-PIC'
+       lt_prog_compiler_static='-Bstatic'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+       # which looks to be a dead project)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fpic'
+       lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-qpic'
+       lt_prog_compiler_static='-qstaticlink'
+       ;;
+      *)
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl=''
+         ;;
+       *Sun\ F* | *Sun*Fortran*)
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Qoption ld '
+         ;;
+       *Sun\ C*)
+         # Sun C 5.9
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Wl,'
+         ;;
+        *Intel*\ [CF]*Compiler*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fPIC'
+         lt_prog_compiler_static='-static'
+         ;;
+       *Portland\ Group*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fpic'
+         lt_prog_compiler_static='-Bstatic'
+         ;;
+       esac
+       ;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+       lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+       lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       lt_prog_compiler_pic='-Kconform_pic'
+       lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+         *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       allow_undefined_flag=unsupported
+       # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+       # support --undefined.  This deserves some investigation.  FIXME
+       archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file (1st line
+       # is EXPORTS), use it as is; otherwise, prepend...
+       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+         cp $export_symbols $output_objdir/$soname.def;
+       else
+         echo EXPORTS > $output_objdir/$soname.def;
+         cat $export_symbols >> $output_objdir/$soname.def;
+       fi~
+       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+       case $cc_basename in
+         diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
+       esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+        && test "$tmp_diet" = no
+      then
+       tmp_addflag=' $pic_flag'
+       tmp_sharedflag='-shared'
+       case $cc_basename,$host_cpu in
+        pgcc*)                         # Portland Group C compiler
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag'
+         ;;
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag -Mnomain' ;;
+       ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
+         tmp_addflag=' -i_dynamic' ;;
+       efc*,ia64* | ifort*,ia64*)      # Intel Fortran compiler on ia64
+         tmp_addflag=' -i_dynamic -nofor_main' ;;
+       ifc* | ifort*)                  # Intel Fortran compiler
+         tmp_addflag=' -nofor_main' ;;
+       lf95*)                          # Lahey Fortran 8.1
+         whole_archive_flag_spec=
+         tmp_sharedflag='--shared' ;;
+       xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+         tmp_sharedflag='-qmkshrobj'
+         tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         ;;
+       esac
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ C*)                       # Sun C 5.9
+         whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         tmp_sharedflag='-G' ;;
+       *Sun\ F*)                       # Sun Fortran 8.3
+         tmp_sharedflag='-G' ;;
+       esac
+       archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+           echo "local: *; };" >> $output_objdir/$libname.ver~
+           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+       case $cc_basename in
+       xlf* | bgf* | bgxlf* | mpixlf*)
+         # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+         whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+         hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+         archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+         if test "x$supports_anon_versioning" = xyes; then
+           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+             echo "local: *; };" >> $output_objdir/$libname.ver~
+             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+         fi
+         ;;
+       esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+       wlarc=
+      else
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+       ;;
+       *)
+         # For security reasons, it is highly recommended that you always
+         # use absolute paths for naming shared libraries, and exclude the
+         # DT_RUNPATH tag from executables and libraries.  But doing so
+         # requires that you compile everything twice, which is a pain.
+         if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+           hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+           archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+         else
+           ld_shlibs=no
+         fi
+       ;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+       # Neither direct hardcoding nor static linking is supported with a
+       # broken collect2.
+       hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+       # On IA64, the linker does run time linking by default, so we don't
+       # have to do anything special.
+       aix_use_runtimelinking=no
+       exp_sym_flag='-Bexport'
+       no_entry_flag=""
+      else
+       # If we're using GNU nm, then we don't want the "-C" option.
+       # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
+       if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+         export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       else
+         export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       fi
+       aix_use_runtimelinking=no
+
+       # Test if we are trying to use run time linking or normal
+       # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+       # need to do runtime linking.
+       case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+         for ld_flag in $LDFLAGS; do
+         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+           aix_use_runtimelinking=yes
+           break
+         fi
+         done
+         ;;
+       esac
+
+       exp_sym_flag='-bexport'
+       no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+       case $host_os in aix4.[012]|aix4.[012].*)
+       # We only want to do this on AIX 4.2 and lower, the check
+       # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+          strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+         # We have reworked collect2
+         :
+         else
+         # We have old collect2
+         hardcode_direct=unsupported
+         # It fails to find uninstalled libraries when the uninstalled
+         # path is not listed in the libpath.  Setting hardcode_minus_L
+         # to unsupported forces relinking
+         hardcode_minus_L=yes
+         hardcode_libdir_flag_spec='-L$libdir'
+         hardcode_libdir_separator=
+         fi
+         ;;
+       esac
+       shared_flag='-shared'
+       if test "$aix_use_runtimelinking" = yes; then
+         shared_flag="$shared_flag "'${wl}-G'
+       fi
+       link_all_deplibs=no
+      else
+       # not using gcc
+       if test "$host_cpu" = ia64; then
+       # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+       # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+       else
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag='${wl}-G'
+         else
+           shared_flag='${wl}-bM:SRE'
+         fi
+       fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+       # Warning - without using the other runtime loading flags (-brtl),
+       # -berok will link without error, but may produce a broken library.
+       allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+       if test "$host_cpu" = ia64; then
+         hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+         allow_undefined_flag="-z nodefs"
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+       else
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+         # Warning - without using the other run time loading flags,
+         # -berok will link without error, but may produce a broken library.
+         no_undefined_flag=' ${wl}-bernotok'
+         allow_undefined_flag=' ${wl}-berok'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           whole_archive_flag_spec='$convenience'
+         fi
+         archive_cmds_need_lc=yes
+         # This is similar to how AIX traditionally builds its shared libraries.
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+       fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+       # Native MSVC
+       hardcode_libdir_flag_spec=' '
+       allow_undefined_flag=unsupported
+       always_export_symbols=yes
+       file_list_spec='@'
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+         else
+           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+         fi~
+         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+         linknames='
+       # The linker will not automatically build a static lib if we build a DLL.
+       # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+       enable_shared_with_static_runtimes=yes
+       exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+       export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+       # Don't use ranlib
+       old_postinstall_cmds='chmod 644 $oldlib'
+       postlink_cmds='lt_outputfile="@OUTPUT@"~
+         lt_tool_outputfile="@TOOL_OUTPUT@"~
+         case $lt_outputfile in
+           *.exe|*.EXE) ;;
+           *)
+             lt_outputfile="$lt_outputfile.exe"
+             lt_tool_outputfile="$lt_tool_outputfile.exe"
+             ;;
+         esac~
+         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+           $RM "$lt_outputfile.manifest";
+         fi'
+       ;;
+      *)
+       # Assume MSVC wrapper
+       hardcode_libdir_flag_spec=' '
+       allow_undefined_flag=unsupported
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+       # The linker will automatically build a .lib file if we build a DLL.
+       old_archive_from_new_cmds='true'
+       # FIXME: Should let the user specify the lib program.
+       old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+       enable_shared_with_static_runtimes=yes
+       ;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+       archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+       archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+       hardcode_libdir_separator=:
+       hardcode_direct=yes
+       hardcode_direct_absolute=yes
+       export_dynamic_flag_spec='${wl}-E'
+       # hardcode_minus_L: Not really in the search PATH,
+       # but as the default location of the library.
+       hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       case $host_cpu in
+       hppa*64*)
+         archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       esac
+      else
+       case $host_cpu in
+       hppa*64*)
+         archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+         ;;
+       esac
+      fi
+      if test "$with_gnu_ld" = no; then
+       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+       hardcode_libdir_separator=:
+
+       case $host_cpu in
+       hppa*64*|ia64*)
+         hardcode_direct=no
+         hardcode_shlibpath_var=no
+         ;;
+       *)
+         hardcode_direct=yes
+         hardcode_direct_absolute=yes
+         export_dynamic_flag_spec='${wl}-E'
+
+         # hardcode_minus_L: Not really in the search PATH,
+         # but as the default location of the library.
+         hardcode_minus_L=yes
+         ;;
+       esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       # Try to use the -exported_symbol ld option, if it does not
+       # work, assume that -exports_file does not work either and
+       # implicitly export all symbols.
+       # This should be the same for all languages, so no per-tag cache variable.
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+       if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       fi
+      else
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+       archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+       hardcode_direct=yes
+       hardcode_shlibpath_var=no
+       hardcode_direct_absolute=yes
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+         archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+         hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+         export_dynamic_flag_spec='${wl}-E'
+       else
+         case $host_os in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+         esac
+       fi
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+       allow_undefined_flag=' -expect_unresolved \*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)     # as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+       allow_undefined_flag=' -expect_unresolved \*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+       # Both c and cxx compiler support -rpath directly
+       hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+       wlarc='${wl}'
+       archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+       case `$CC -V 2>&1` in
+       *"Compilers 5.0"*)
+         wlarc=''
+         archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+         ;;
+       *)
+         wlarc='${wl}'
+         archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         ;;
+       esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+       # The compiler driver will combine and reorder linker options,
+       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but is careful enough not to reorder.
+       # Supported since Solaris 2.6 (maybe 2.5.1?)
+       if test "$GCC" = yes; then
+         whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       else
+         whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+       fi
+       ;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+       # Use $CC to link under sequent, because it throws in some extra .o
+       # files that make .init and .fini sections work.
+       archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+       sni)
+         archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         hardcode_direct=yes # is this really true???
+       ;;
+       siemens)
+         ## LD is ld it makes a PLAMLIB
+         ## CC just makes a GrossModule.
+         archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+         reload_cmds='$CC -r -o $output$reload_objs'
+         hardcode_direct=no
+        ;;
+       motorola)
+         archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+       ;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+       hardcode_shlibpath_var=no
+       runpath_var=LD_RUN_PATH
+       hardcode_runpath_var=yes
+       ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+       export_dynamic_flag_spec='${wl}-Blargedynsym'
+       ;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$lt_prog_compiler_wl
+         pic_flag=$lt_prog_compiler_pic
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$allow_undefined_flag
+         allow_undefined_flag=
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+         then
+           lt_cv_archive_cmds_need_lc=no
+         else
+           lt_cv_archive_cmds_need_lc=yes
+         fi
+         allow_undefined_flag=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+       lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux # correct to gnu/linux during the next big refactor
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+        LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# Check whether --enable-optimization was given.
+if test "${enable_optimization+set}" = set; then :
+  enableval=$enable_optimization;
+       if (test "${enableval}" = "no"); then
+               CFLAGS="$CFLAGS -O0 -U_FORTIFY_SOURCE"
+       fi
+
+fi
+
+
+# Check whether --enable-debug was given.
+if test "${enable_debug+set}" = set; then :
+  enableval=$enable_debug;
+       if (test "${enableval}" = "yes" &&
+                               test "${ac_cv_prog_cc_g}" = "yes"); then
+               CFLAGS="$CFLAGS -g"
+       fi
+
+fi
+
+
+# Check whether --enable-pie was given.
+if test "${enable_pie+set}" = set; then :
+  enableval=$enable_pie;
+       if (test "${enableval}" = "yes" &&
+                               test "${ac_cv_prog_cc_pie}" = "yes"); then
+               CFLAGS="$CFLAGS -fPIE"
+               LDFLAGS="$LDFLAGS -pie"
+       fi
+
+fi
+
+
+# Check whether --enable-hh2serial-gps was given.
+if test "${enable_hh2serial_gps+set}" = set; then :
+  enableval=$enable_hh2serial_gps; enable_hh2serial_gps=${enableval}
+else
+  enable_hh2serial_gps="no"
+fi
+
+ if test "${enable_hh2serial_gps}" != "no"; then
+  HH2SERIAL_GPS_TRUE=
+  HH2SERIAL_GPS_FALSE='#'
+else
+  HH2SERIAL_GPS_TRUE='#'
+  HH2SERIAL_GPS_FALSE=
+fi
+
+ if test "${enable_hh2serial_gps}" = "builtin"; then
+  HH2SERIAL_GPS_BUILTIN_TRUE=
+  HH2SERIAL_GPS_BUILTIN_FALSE='#'
+else
+  HH2SERIAL_GPS_BUILTIN_TRUE='#'
+  HH2SERIAL_GPS_BUILTIN_FALSE=
+fi
+
+
+
+# Check whether --with-openconnect was given.
+if test "${with_openconnect+set}" = set; then :
+  withval=$with_openconnect; path_openconnect=${withval}
+fi
+
+
+# Check whether --enable-openconnect was given.
+if test "${enable_openconnect+set}" = set; then :
+  enableval=$enable_openconnect; enable_openconnect=${enableval}
+else
+  enable_openconnect="no"
+fi
+
+if (test "${enable_openconnect}" != "no"); then
+       if (test -z "${path_openconnect}"); then
+               # Extract the first word of "openconnect", so it can be a program name with args.
+set dummy openconnect; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_OPENCONNECT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $OPENCONNECT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_OPENCONNECT="$OPENCONNECT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_OPENCONNECT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+OPENCONNECT=$ac_cv_path_OPENCONNECT
+if test -n "$OPENCONNECT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENCONNECT" >&5
+$as_echo "$OPENCONNECT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+               if (test -z "${OPENCONNECT}"); then
+                       as_fn_error $? "openconnect binary not found" "$LINENO" 5
+               fi
+       else
+               OPENCONNECT="${path_openconnect}"
+
+       fi
+fi
+ if test "${enable_openconnect}" != "no"; then
+  OPENCONNECT_TRUE=
+  OPENCONNECT_FALSE='#'
+else
+  OPENCONNECT_TRUE='#'
+  OPENCONNECT_FALSE=
+fi
+
+ if test "${enable_openconnect}" = "builtin"; then
+  OPENCONNECT_BUILTIN_TRUE=
+  OPENCONNECT_BUILTIN_FALSE='#'
+else
+  OPENCONNECT_BUILTIN_TRUE='#'
+  OPENCONNECT_BUILTIN_FALSE=
+fi
+
+
+
+# Check whether --with-openvpn was given.
+if test "${with_openvpn+set}" = set; then :
+  withval=$with_openvpn; path_openvpn=${withval}
+fi
+
+
+# Check whether --enable-openvpn was given.
+if test "${enable_openvpn+set}" = set; then :
+  enableval=$enable_openvpn; enable_openvpn=${enableval}
+else
+  enable_openvpn="no"
+fi
+
+if (test "${enable_openvpn}" != "no"); then
+       if (test -z "${path_openvpn}"); then
+               # Extract the first word of "openvpn", so it can be a program name with args.
+set dummy openvpn; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_OPENVPN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $OPENVPN in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_OPENVPN="$OPENVPN" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_OPENVPN="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+OPENVPN=$ac_cv_path_OPENVPN
+if test -n "$OPENVPN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENVPN" >&5
+$as_echo "$OPENVPN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+               if (test -z "${OPENVPN}"); then
+                       as_fn_error $? "openvpn binary not found" "$LINENO" 5
+               fi
+       else
+               OPENVPN="${path_openvpn}"
+
+       fi
+fi
+ if test "${enable_openvpn}" != "no"; then
+  OPENVPN_TRUE=
+  OPENVPN_FALSE='#'
+else
+  OPENVPN_TRUE='#'
+  OPENVPN_FALSE=
+fi
+
+ if test "${enable_openvpn}" = "builtin"; then
+  OPENVPN_BUILTIN_TRUE=
+  OPENVPN_BUILTIN_FALSE='#'
+else
+  OPENVPN_BUILTIN_TRUE='#'
+  OPENVPN_BUILTIN_FALSE=
+fi
+
+
+
+# Check whether --with-vpnc was given.
+if test "${with_vpnc+set}" = set; then :
+  withval=$with_vpnc; path_vpnc=${withval}
+fi
+
+
+# Check whether --enable-vpnc was given.
+if test "${enable_vpnc+set}" = set; then :
+  enableval=$enable_vpnc; enable_vpnc=${enableval}
+else
+  enable_vpnc="no"
+fi
+
+if (test "${enable_vpnc}" != "no"); then
+       if (test -z "${path_vpnc}"); then
+               # Extract the first word of "vpnc", so it can be a program name with args.
+set dummy vpnc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_VPNC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $VPNC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_VPNC="$VPNC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_VPNC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+VPNC=$ac_cv_path_VPNC
+if test -n "$VPNC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VPNC" >&5
+$as_echo "$VPNC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+               if (test -z "${VPNC}"); then
+                       as_fn_error $? "vpnc binary not found" "$LINENO" 5
+               fi
+       else
+               VPNC="${path_vpnc}"
+
+       fi
+fi
+ if test "${enable_vpnc}" != "no"; then
+  VPNC_TRUE=
+  VPNC_FALSE='#'
+else
+  VPNC_TRUE='#'
+  VPNC_FALSE=
+fi
+
+ if test "${enable_vpnc}" = "builtin"; then
+  VPNC_BUILTIN_TRUE=
+  VPNC_BUILTIN_FALSE='#'
+else
+  VPNC_BUILTIN_TRUE='#'
+  VPNC_BUILTIN_FALSE=
+fi
+
+
+# Check whether --enable-l2tp was given.
+if test "${enable_l2tp+set}" = set; then :
+  enableval=$enable_l2tp; enable_l2tp=${enableval}
+else
+  enable_l2tp="no"
+fi
+
+if (test "${enable_l2tp}" != "no"); then
+       if (test -z "${path_pppd}"); then
+               # Extract the first word of "pppd", so it can be a program name with args.
+set dummy pppd; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PPPD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PPPD in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PPPD="$PPPD" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PPPD="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PPPD" && ac_cv_path_PPPD="/usr/sbin/pppd"
+  ;;
+esac
+fi
+PPPD=$ac_cv_path_PPPD
+if test -n "$PPPD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PPPD" >&5
+$as_echo "$PPPD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+       else
+               PPPD="${path_pppd}"
+
+       fi
+       for ac_header in pppd/pppd.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "pppd/pppd.h" "ac_cv_header_pppd_pppd_h" "$ac_includes_default"
+if test "x$ac_cv_header_pppd_pppd_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PPPD_PPPD_H 1
+_ACEOF
+ dummy=yes
+else
+  as_fn_error $? "ppp header files are required" "$LINENO" 5
+fi
+
+done
+
+       if (test -z "${path_l2tp}"); then
+               # Extract the first word of "xl2tpd", so it can be a program name with args.
+set dummy xl2tpd; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_L2TP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $L2TP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_L2TP="$L2TP" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_L2TP="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_L2TP" && ac_cv_path_L2TP="/usr/sbin/xl2tpd"
+  ;;
+esac
+fi
+L2TP=$ac_cv_path_L2TP
+if test -n "$L2TP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $L2TP" >&5
+$as_echo "$L2TP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+       else
+               L2TP="${path_l2tp}"
+
+       fi
+fi
+ if test "${enable_l2tp}" != "no"; then
+  L2TP_TRUE=
+  L2TP_FALSE='#'
+else
+  L2TP_TRUE='#'
+  L2TP_FALSE=
+fi
+
+ if test "${enable_l2tp}" = "builtin"; then
+  L2TP_BUILTIN_TRUE=
+  L2TP_BUILTIN_FALSE='#'
+else
+  L2TP_BUILTIN_TRUE='#'
+  L2TP_BUILTIN_FALSE=
+fi
+
+
+# Check whether --enable-pptp was given.
+if test "${enable_pptp+set}" = set; then :
+  enableval=$enable_pptp; enable_pptp=${enableval}
+else
+  enable_pptp="no"
+fi
+
+if (test "${enable_pptp}" != "no"); then
+       if (test -z "${path_pppd}"); then
+               # Extract the first word of "pppd", so it can be a program name with args.
+set dummy pppd; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PPPD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PPPD in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PPPD="$PPPD" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PPPD="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PPPD" && ac_cv_path_PPPD="/usr/sbin/pppd"
+  ;;
+esac
+fi
+PPPD=$ac_cv_path_PPPD
+if test -n "$PPPD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PPPD" >&5
+$as_echo "$PPPD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+       else
+               PPPD="${path_pppd}"
+
+       fi
+       for ac_header in pppd/pppd.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "pppd/pppd.h" "ac_cv_header_pppd_pppd_h" "$ac_includes_default"
+if test "x$ac_cv_header_pppd_pppd_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PPPD_PPPD_H 1
+_ACEOF
+ dummy=yes
+else
+  as_fn_error $? "ppp header files are required" "$LINENO" 5
+fi
+
+done
+
+       if (test -z "${path_pptp}"); then
+               # Extract the first word of "pptp", so it can be a program name with args.
+set dummy pptp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PPTP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PPTP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PPTP="$PPTP" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PPTP="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PPTP" && ac_cv_path_PPTP="/usr/sbin/pptp"
+  ;;
+esac
+fi
+PPTP=$ac_cv_path_PPTP
+if test -n "$PPTP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PPTP" >&5
+$as_echo "$PPTP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+       else
+               PPTP="${path_pptp}"
+
+       fi
+fi
+ if test "${enable_pptp}" != "no"; then
+  PPTP_TRUE=
+  PPTP_FALSE='#'
+else
+  PPTP_TRUE='#'
+  PPTP_FALSE=
+fi
+
+ if test "${enable_pptp}" = "builtin"; then
+  PPTP_BUILTIN_TRUE=
+  PPTP_BUILTIN_FALSE='#'
+else
+  PPTP_BUILTIN_TRUE='#'
+  PPTP_BUILTIN_FALSE=
+fi
+
+
+for ac_header in resolv.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "$ac_includes_default"
+if test "x$ac_cv_header_resolv_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_RESOLV_H 1
+_ACEOF
+ dummy=yes
+else
+  as_fn_error $? "resolver header files are required" "$LINENO" 5
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ns_initparse in -lresolv" >&5
+$as_echo_n "checking for ns_initparse in -lresolv... " >&6; }
+if ${ac_cv_lib_resolv_ns_initparse+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ns_initparse ();
+int
+main ()
+{
+return ns_initparse ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_resolv_ns_initparse=yes
+else
+  ac_cv_lib_resolv_ns_initparse=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_ns_initparse" >&5
+$as_echo "$ac_cv_lib_resolv_ns_initparse" >&6; }
+if test "x$ac_cv_lib_resolv_ns_initparse" = xyes; then :
+  dummy=yes
+else
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __ns_initparse in -lresolv" >&5
+$as_echo_n "checking for __ns_initparse in -lresolv... " >&6; }
+if ${ac_cv_lib_resolv___ns_initparse+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __ns_initparse ();
+int
+main ()
+{
+return __ns_initparse ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_resolv___ns_initparse=yes
+else
+  ac_cv_lib_resolv___ns_initparse=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv___ns_initparse" >&5
+$as_echo "$ac_cv_lib_resolv___ns_initparse" >&6; }
+if test "x$ac_cv_lib_resolv___ns_initparse" = xyes; then :
+  dummy=yes
+else
+  as_fn_error $? "resolver library support is required" "$LINENO" 5
+fi
+
+
+fi
+
+
+ac_fn_c_check_func "$LINENO" "signalfd" "ac_cv_func_signalfd"
+if test "x$ac_cv_func_signalfd" = xyes; then :
+  dummy=yes
+else
+  as_fn_error $? "signalfd support is required" "$LINENO" 5
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  dummy=yes
+else
+  as_fn_error $? "dynamic linking loader is required" "$LINENO" 5
+fi
+
+
+# Check whether --enable-iospm was given.
+if test "${enable_iospm+set}" = set; then :
+  enableval=$enable_iospm; enable_iospm=${enableval}
+fi
+
+ if test "${enable_iospm}" = "yes"; then
+  IOSPM_TRUE=
+  IOSPM_FALSE='#'
+else
+  IOSPM_TRUE='#'
+  IOSPM_FALSE=
+fi
+
+
+# Check whether --enable-tist was given.
+if test "${enable_tist+set}" = set; then :
+  enableval=$enable_tist; enable_tist=${enableval}
+else
+  enable_tist="no"
+fi
+
+ if test "${enable_tist}" != "no"; then
+  TIST_TRUE=
+  TIST_FALSE='#'
+else
+  TIST_TRUE='#'
+  TIST_FALSE=
+fi
+
+ if test "${enable_tist}" = "builtin"; then
+  TIST_BUILTIN_TRUE=
+  TIST_BUILTIN_FALSE='#'
+else
+  TIST_BUILTIN_TRUE='#'
+  TIST_BUILTIN_FALSE=
+fi
+
+
+# Check whether --enable-session-policy-local was given.
+if test "${enable_session_policy_local+set}" = set; then :
+  enableval=$enable_session_policy_local; enable_session_policy_local=${enableval}
+else
+  enable_session_policy_local="no"
+fi
+
+ if test "${enable_session_policy_local}" != "no"; then
+  SESSION_POLICY_LOCAL_TRUE=
+  SESSION_POLICY_LOCAL_FALSE='#'
+else
+  SESSION_POLICY_LOCAL_TRUE='#'
+  SESSION_POLICY_LOCAL_FALSE=
+fi
+
+ if test "${enable_session_policy_local}" = "builtin"; then
+  SESSION_POLICY_LOCAL_BUILTIN_TRUE=
+  SESSION_POLICY_LOCAL_BUILTIN_FALSE='#'
+else
+  SESSION_POLICY_LOCAL_BUILTIN_TRUE='#'
+  SESSION_POLICY_LOCAL_BUILTIN_FALSE=
+fi
+
+
+
+# Check whether --with-stats-max-file-size was given.
+if test "${with_stats_max_file_size+set}" = set; then :
+  withval=$with_stats_max_file_size; stats_max_file_size=${withval}
+fi
+
+
+if (test -z "${stats_max_file_size}"); then
+   # default size is 16 kByte
+   stats_max_file_size="16 * 8 * 128"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define STATS_MAX_FILE_SIZE (${stats_max_file_size})
+_ACEOF
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
+$as_echo_n "checking for GLIB... " >&6; }
+
+if test -n "$GLIB_CFLAGS"; then
+    pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.28\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.28") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.28" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GLIB_LIBS"; then
+    pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.28\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.28") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.28" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.28" 2>&1`
+        else
+               GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.28" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GLIB_PKG_ERRORS" >&5
+
+       as_fn_error $? "GLib >= 2.28 is required" "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       as_fn_error $? "GLib >= 2.28 is required" "$LINENO" 5
+else
+       GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+       GLIB_LIBS=$pkg_cv_GLIB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       dummy=yes
+fi
+
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5
+$as_echo_n "checking for DBUS... " >&6; }
+
+if test -n "$DBUS_CFLAGS"; then
+    pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-1 >= 1.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1 >= 1.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1 >= 1.4" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$DBUS_LIBS"; then
+    pkg_cv_DBUS_LIBS="$DBUS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-1 >= 1.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-1 >= 1.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1 >= 1.4" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dbus-1 >= 1.4" 2>&1`
+        else
+               DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dbus-1 >= 1.4" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$DBUS_PKG_ERRORS" >&5
+
+       as_fn_error $? "D-Bus >= 1.4 is required" "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       as_fn_error $? "D-Bus >= 1.4 is required" "$LINENO" 5
+else
+       DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS
+       DBUS_LIBS=$pkg_cv_DBUS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       dummy=yes
+fi
+
+
+
+
+# Check whether --with-dbusconfdir was given.
+if test "${with_dbusconfdir+set}" = set; then :
+  withval=$with_dbusconfdir; path_dbusconf=${withval}
+else
+  path_dbusconf="`$PKG_CONFIG --variable=sysconfdir dbus-1`"
+fi
+
+if (test -z "${path_dbusconf}"); then
+       DBUS_CONFDIR="${sysconfdir}/dbus-1/system.d"
+else
+       DBUS_CONFDIR="${path_dbusconf}/dbus-1/system.d"
+fi
+
+
+
+# Check whether --with-dbusdatadir was given.
+if test "${with_dbusdatadir+set}" = set; then :
+  withval=$with_dbusdatadir; path_dbusdata=${withval}
+else
+  path_dbusdata="`$PKG_CONFIG --variable=datadir dbus-1`"
+fi
+
+if (test -z "${path_dbusdata}"); then
+       DBUS_DATADIR="${datadir}/dbus-1/system-services"
+else
+       DBUS_DATADIR="${path_dbusdata}/dbus-1/system-services"
+fi
+
+
+
+# Check whether --with-systemdunitdir was given.
+if test "${with_systemdunitdir+set}" = set; then :
+  withval=$with_systemdunitdir; path_systemdunit=${withval}
+else
+  path_systemdunit="`$PKG_CONFIG --variable=systemdsystemunitdir systemd`"
+fi
+
+if (test -n "${path_systemdunit}"); then
+       SYSTEMD_UNITDIR="${path_systemdunit}"
+
+fi
+ if test -n "${path_systemdunit}"; then
+  SYSTEMD_TRUE=
+  SYSTEMD_FALSE='#'
+else
+  SYSTEMD_TRUE='#'
+  SYSTEMD_FALSE=
+fi
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XTABLES" >&5
+$as_echo_n "checking for XTABLES... " >&6; }
+
+if test -n "$XTABLES_CFLAGS"; then
+    pkg_cv_XTABLES_CFLAGS="$XTABLES_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xtables >= 1.4.11\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "xtables >= 1.4.11") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_XTABLES_CFLAGS=`$PKG_CONFIG --cflags "xtables >= 1.4.11" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$XTABLES_LIBS"; then
+    pkg_cv_XTABLES_LIBS="$XTABLES_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xtables >= 1.4.11\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "xtables >= 1.4.11") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_XTABLES_LIBS=`$PKG_CONFIG --libs "xtables >= 1.4.11" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               XTABLES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "xtables >= 1.4.11" 2>&1`
+        else
+               XTABLES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "xtables >= 1.4.11" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$XTABLES_PKG_ERRORS" >&5
+
+       as_fn_error $? "Xtables library is required" "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       as_fn_error $? "Xtables library is required" "$LINENO" 5
+else
+       XTABLES_CFLAGS=$pkg_cv_XTABLES_CFLAGS
+       XTABLES_LIBS=$pkg_cv_XTABLES_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       dummy=yes
+fi
+
+
+
+# Check whether --enable-test was given.
+if test "${enable_test+set}" = set; then :
+  enableval=$enable_test; enable_test=${enableval}
+fi
+
+ if test "${enable_test}" = "yes"; then
+  TEST_TRUE=
+  TEST_FALSE='#'
+else
+  TEST_TRUE='#'
+  TEST_FALSE=
+fi
+
+
+# Check whether --enable-nmcompat was given.
+if test "${enable_nmcompat+set}" = set; then :
+  enableval=$enable_nmcompat; enable_nmcompat=${enableval}
+else
+  enable_nmcompat="no"
+fi
+
+ if test "${enable_nmcompat}" != "no"; then
+  NMCOMPAT_TRUE=
+  NMCOMPAT_FALSE='#'
+else
+  NMCOMPAT_TRUE='#'
+  NMCOMPAT_FALSE=
+fi
+
+
+# Check whether --enable-polkit was given.
+if test "${enable_polkit+set}" = set; then :
+  enableval=$enable_polkit; enable_polkit=${enableval}
+else
+  enable_polkit="no"
+fi
+
+if (test "${enable_polkit}" != "no"); then
+       POLKIT_DATADIR="`$PKG_CONFIG --variable=actiondir polkit`"
+       POLKIT_DATADIR=""
+       if (test -z "${POLKIT_DATADIR}"); then
+               POLKIT_DATADIR="${datadir}/polkit-1/actions"
+       fi
+
+fi
+ if test "${enable_polkit}" != "no"; then
+  POLKIT_TRUE=
+  POLKIT_FALSE='#'
+else
+  POLKIT_TRUE='#'
+  POLKIT_FALSE=
+fi
+
+
+# Check whether --enable-selinux was given.
+if test "${enable_selinux+set}" = set; then :
+  enableval=$enable_selinux; enable_selinux=${enableval}
+else
+  enable_selinux="no"
+fi
+
+ if test "${enable_selinux}" != "no"; then
+  SELINUX_TRUE=
+  SELINUX_FALSE='#'
+else
+  SELINUX_TRUE='#'
+  SELINUX_FALSE=
+fi
+
+
+# Check whether --enable-loopback was given.
+if test "${enable_loopback+set}" = set; then :
+  enableval=$enable_loopback; enable_loopback=${enableval}
+fi
+
+ if test "${enable_loopback}" != "no"; then
+  LOOPBACK_TRUE=
+  LOOPBACK_FALSE='#'
+else
+  LOOPBACK_TRUE='#'
+  LOOPBACK_FALSE=
+fi
+
+
+# Check whether --enable-ethernet was given.
+if test "${enable_ethernet+set}" = set; then :
+  enableval=$enable_ethernet; enable_ethernet=${enableval}
+fi
+
+ if test "${enable_ethernet}" != "no"; then
+  ETHERNET_TRUE=
+  ETHERNET_FALSE='#'
+else
+  ETHERNET_TRUE='#'
+  ETHERNET_FALSE=
+fi
+
+
+# Check whether --enable-gadget was given.
+if test "${enable_gadget+set}" = set; then :
+  enableval=$enable_gadget; enable_gadget=${enableval}
+fi
+
+ if test "${enable_gadget}" != "no"; then
+  GADGET_TRUE=
+  GADGET_FALSE='#'
+else
+  GADGET_TRUE='#'
+  GADGET_FALSE=
+fi
+
+
+# Check whether --enable-wifi was given.
+if test "${enable_wifi+set}" = set; then :
+  enableval=$enable_wifi; enable_wifi=${enableval}
+fi
+
+ if test "${enable_wifi}" != "no"; then
+  WIFI_TRUE=
+  WIFI_FALSE='#'
+else
+  WIFI_TRUE='#'
+  WIFI_FALSE=
+fi
+
+
+# Check whether --enable-bluetooth was given.
+if test "${enable_bluetooth+set}" = set; then :
+  enableval=$enable_bluetooth; enable_bluetooth=${enableval}
+fi
+
+ if test "${enable_bluetooth}" != "no"; then
+  BLUETOOTH_TRUE=
+  BLUETOOTH_FALSE='#'
+else
+  BLUETOOTH_TRUE='#'
+  BLUETOOTH_FALSE=
+fi
+
+
+# Check whether --enable-ofono was given.
+if test "${enable_ofono+set}" = set; then :
+  enableval=$enable_ofono; enable_ofono=${enableval}
+fi
+
+ if test "${enable_ofono}" != "no"; then
+  OFONO_TRUE=
+  OFONO_FALSE='#'
+else
+  OFONO_TRUE='#'
+  OFONO_FALSE=
+fi
+
+
+# Check whether --enable-dundee was given.
+if test "${enable_dundee+set}" = set; then :
+  enableval=$enable_dundee; enable_dundee=${enableval}
+fi
+
+ if test "${enable_dundee}" != "no"; then
+  DUNDEE_TRUE=
+  DUNDEE_FALSE='#'
+else
+  DUNDEE_TRUE='#'
+  DUNDEE_FALSE=
+fi
+
+
+# Check whether --enable-pacrunner was given.
+if test "${enable_pacrunner+set}" = set; then :
+  enableval=$enable_pacrunner; enable_pacrunner=${enableval}
+fi
+
+ if test "${enable_pacrunner}" != "no"; then
+  PACRUNNER_TRUE=
+  PACRUNNER_FALSE='#'
+else
+  PACRUNNER_TRUE='#'
+  PACRUNNER_FALSE=
+fi
+
+
+# Check whether --enable-neard was given.
+if test "${enable_neard+set}" = set; then :
+  enableval=$enable_neard; enable_neard=${enableval}
+fi
+
+ if test "${enable_neard}" != "no"; then
+  NEARD_TRUE=
+  NEARD_FALSE='#'
+else
+  NEARD_TRUE='#'
+  NEARD_FALSE=
+fi
+
+
+# Check whether --enable-wispr was given.
+if test "${enable_wispr+set}" = set; then :
+  enableval=$enable_wispr; enable_wispr=${enableval}
+fi
+
+ if test "${enable_wispr}" != "no"; then
+  WISPR_TRUE=
+  WISPR_FALSE='#'
+else
+  WISPR_TRUE='#'
+  WISPR_FALSE=
+fi
+
+
+# Check whether --enable-tools was given.
+if test "${enable_tools+set}" = set; then :
+  enableval=$enable_tools; enable_tools=${enableval}
+fi
+
+ if test "${enable_tools}" != "no"; then
+  TOOLS_TRUE=
+  TOOLS_FALSE='#'
+else
+  TOOLS_TRUE='#'
+  TOOLS_FALSE=
+fi
+
+
+if (test "${enable_tools}" != "no"); then
+       for ac_prog in iptables-save
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_IPTABLES_SAVE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $IPTABLES_SAVE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_IPTABLES_SAVE="$IPTABLES_SAVE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_IPTABLES_SAVE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+IPTABLES_SAVE=$ac_cv_path_IPTABLES_SAVE
+if test -n "$IPTABLES_SAVE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IPTABLES_SAVE" >&5
+$as_echo "$IPTABLES_SAVE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$IPTABLES_SAVE" && break
+done
+
+       IPTABLES_SAVE=$ac_cv_path_IPTABLES_SAVE
+else
+       IPTABLES_SAVE=""
+fi
+
+
+# Check whether --enable-client was given.
+if test "${enable_client+set}" = set; then :
+  enableval=$enable_client; enable_client=${enableval}
+fi
+
+ if test "${enable_client}" != "no"; then
+  CLIENT_TRUE=
+  CLIENT_FALSE='#'
+else
+  CLIENT_TRUE='#'
+  CLIENT_FALSE=
+fi
+
+
+if (test "${enable_wispr}" != "no"); then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUTLS" >&5
+$as_echo_n "checking for GNUTLS... " >&6; }
+
+if test -n "$GNUTLS_CFLAGS"; then
+    pkg_cv_GNUTLS_CFLAGS="$GNUTLS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GNUTLS_CFLAGS=`$PKG_CONFIG --cflags "gnutls" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GNUTLS_LIBS"; then
+    pkg_cv_GNUTLS_LIBS="$GNUTLS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GNUTLS_LIBS=`$PKG_CONFIG --libs "gnutls" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnutls" 2>&1`
+        else
+               GNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnutls" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GNUTLS_PKG_ERRORS" >&5
+
+       as_fn_error $? "GnuTLS library is required" "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       as_fn_error $? "GnuTLS library is required" "$LINENO" 5
+else
+       GNUTLS_CFLAGS=$pkg_cv_GNUTLS_CFLAGS
+       GNUTLS_LIBS=$pkg_cv_GNUTLS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       dummy=yes
+fi
+else
+       GNUTLS_CFLAGS=""
+       GNUTLS_LIBS=""
+fi
+
+
+
+if (test "${enable_loopback}" != "no"); then
+       for ac_header in sys/inotify.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/inotify.h" "ac_cv_header_sys_inotify_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_inotify_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_INOTIFY_H 1
+_ACEOF
+ dummy=yes
+else
+  as_fn_error $? "inotify header files are required" "$LINENO" 5
+fi
+
+done
+
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inotify_init in -lc" >&5
+$as_echo_n "checking for inotify_init in -lc... " >&6; }
+if ${ac_cv_lib_c_inotify_init+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inotify_init ();
+int
+main ()
+{
+return inotify_init ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_c_inotify_init=yes
+else
+  ac_cv_lib_c_inotify_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inotify_init" >&5
+$as_echo "$ac_cv_lib_c_inotify_init" >&6; }
+if test "x$ac_cv_lib_c_inotify_init" = xyes; then :
+  dummy=yes
+else
+  as_fn_error $? "inotify library support is required" "$LINENO" 5
+fi
+
+fi
+
+if (test "${enable_wifi}" != "no"); then
+       # Extract the first word of "wpa_supplicant", so it can be a program name with args.
+set dummy wpa_supplicant; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_WPASUPPLICANT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $WPASUPPLICANT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_WPASUPPLICANT="$WPASUPPLICANT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/sbin:/usr/sbin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_WPASUPPLICANT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+WPASUPPLICANT=$ac_cv_path_WPASUPPLICANT
+if test -n "$WPASUPPLICANT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WPASUPPLICANT" >&5
+$as_echo "$WPASUPPLICANT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+
+# Check whether --enable-datafiles was given.
+if test "${enable_datafiles+set}" = set; then :
+  enableval=$enable_datafiles; enable_datafiles=${enableval}
+fi
+
+ if test "${enable_datafiles}" != "no"; then
+  DATAFILES_TRUE=
+  DATAFILES_FALSE='#'
+else
+  DATAFILES_TRUE='#'
+  DATAFILES_FALSE=
+fi
+
+
+if (test "${enable_client}" != "no"); then
+       for ac_header in readline/readline.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default"
+if test "x$ac_cv_header_readline_readline_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_READLINE_READLINE_H 1
+_ACEOF
+ dummy=yes
+else
+  as_fn_error $? "readline header files are required" "$LINENO" 5
+fi
+
+done
+
+fi
+
+ if test "${enable_openconnect}" != "no" -o \
+                       "${enable_openvpn}" != "no" -o \
+                       "${enable_vpnc}" != "no" -o \
+                       "${enable_l2tp}" != "no" -o \
+                       "${enable_pptp}" != "no"; then
+  VPN_TRUE=
+  VPN_FALSE='#'
+else
+  VPN_TRUE='#'
+  VPN_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files Makefile include/version.h src/connman.service vpn/connman-vpn.service vpn/net.connman.vpn.service scripts/connman connman.pc src/net.connman.service"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+       cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+         mv -f confcache "$cache_file"$$ &&
+         mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+         mv -f confcache "$cache_file" ;;
+       esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HH2SERIAL_GPS_TRUE}" && test -z "${HH2SERIAL_GPS_FALSE}"; then
+  as_fn_error $? "conditional \"HH2SERIAL_GPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HH2SERIAL_GPS_BUILTIN_TRUE}" && test -z "${HH2SERIAL_GPS_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"HH2SERIAL_GPS_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OPENCONNECT_TRUE}" && test -z "${OPENCONNECT_FALSE}"; then
+  as_fn_error $? "conditional \"OPENCONNECT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OPENCONNECT_BUILTIN_TRUE}" && test -z "${OPENCONNECT_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"OPENCONNECT_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OPENVPN_TRUE}" && test -z "${OPENVPN_FALSE}"; then
+  as_fn_error $? "conditional \"OPENVPN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OPENVPN_BUILTIN_TRUE}" && test -z "${OPENVPN_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"OPENVPN_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${VPNC_TRUE}" && test -z "${VPNC_FALSE}"; then
+  as_fn_error $? "conditional \"VPNC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${VPNC_BUILTIN_TRUE}" && test -z "${VPNC_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"VPNC_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${L2TP_TRUE}" && test -z "${L2TP_FALSE}"; then
+  as_fn_error $? "conditional \"L2TP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${L2TP_BUILTIN_TRUE}" && test -z "${L2TP_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"L2TP_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PPTP_TRUE}" && test -z "${PPTP_FALSE}"; then
+  as_fn_error $? "conditional \"PPTP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PPTP_BUILTIN_TRUE}" && test -z "${PPTP_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"PPTP_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${IOSPM_TRUE}" && test -z "${IOSPM_FALSE}"; then
+  as_fn_error $? "conditional \"IOSPM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TIST_TRUE}" && test -z "${TIST_FALSE}"; then
+  as_fn_error $? "conditional \"TIST\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TIST_BUILTIN_TRUE}" && test -z "${TIST_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"TIST_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SESSION_POLICY_LOCAL_TRUE}" && test -z "${SESSION_POLICY_LOCAL_FALSE}"; then
+  as_fn_error $? "conditional \"SESSION_POLICY_LOCAL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SESSION_POLICY_LOCAL_BUILTIN_TRUE}" && test -z "${SESSION_POLICY_LOCAL_BUILTIN_FALSE}"; then
+  as_fn_error $? "conditional \"SESSION_POLICY_LOCAL_BUILTIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SYSTEMD_TRUE}" && test -z "${SYSTEMD_FALSE}"; then
+  as_fn_error $? "conditional \"SYSTEMD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TEST_TRUE}" && test -z "${TEST_FALSE}"; then
+  as_fn_error $? "conditional \"TEST\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NMCOMPAT_TRUE}" && test -z "${NMCOMPAT_FALSE}"; then
+  as_fn_error $? "conditional \"NMCOMPAT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${POLKIT_TRUE}" && test -z "${POLKIT_FALSE}"; then
+  as_fn_error $? "conditional \"POLKIT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SELINUX_TRUE}" && test -z "${SELINUX_FALSE}"; then
+  as_fn_error $? "conditional \"SELINUX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LOOPBACK_TRUE}" && test -z "${LOOPBACK_FALSE}"; then
+  as_fn_error $? "conditional \"LOOPBACK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ETHERNET_TRUE}" && test -z "${ETHERNET_FALSE}"; then
+  as_fn_error $? "conditional \"ETHERNET\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GADGET_TRUE}" && test -z "${GADGET_FALSE}"; then
+  as_fn_error $? "conditional \"GADGET\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIFI_TRUE}" && test -z "${WIFI_FALSE}"; then
+  as_fn_error $? "conditional \"WIFI\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BLUETOOTH_TRUE}" && test -z "${BLUETOOTH_FALSE}"; then
+  as_fn_error $? "conditional \"BLUETOOTH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OFONO_TRUE}" && test -z "${OFONO_FALSE}"; then
+  as_fn_error $? "conditional \"OFONO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DUNDEE_TRUE}" && test -z "${DUNDEE_FALSE}"; then
+  as_fn_error $? "conditional \"DUNDEE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PACRUNNER_TRUE}" && test -z "${PACRUNNER_FALSE}"; then
+  as_fn_error $? "conditional \"PACRUNNER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NEARD_TRUE}" && test -z "${NEARD_FALSE}"; then
+  as_fn_error $? "conditional \"NEARD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WISPR_TRUE}" && test -z "${WISPR_FALSE}"; then
+  as_fn_error $? "conditional \"WISPR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TOOLS_TRUE}" && test -z "${TOOLS_FALSE}"; then
+  as_fn_error $? "conditional \"TOOLS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CLIENT_TRUE}" && test -z "${CLIENT_FALSE}"; then
+  as_fn_error $? "conditional \"CLIENT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DATAFILES_TRUE}" && test -z "${DATAFILES_FALSE}"; then
+  as_fn_error $? "conditional \"DATAFILES\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${VPN_TRUE}" && test -z "${VPN_FALSE}"; then
+  as_fn_error $? "conditional \"VPN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by connman $as_me 1.24, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+connman config.status 1.24
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "include/version.h") CONFIG_FILES="$CONFIG_FILES include/version.h" ;;
+    "src/connman.service") CONFIG_FILES="$CONFIG_FILES src/connman.service" ;;
+    "vpn/connman-vpn.service") CONFIG_FILES="$CONFIG_FILES vpn/connman-vpn.service" ;;
+    "vpn/net.connman.vpn.service") CONFIG_FILES="$CONFIG_FILES vpn/net.connman.vpn.service" ;;
+    "scripts/connman") CONFIG_FILES="$CONFIG_FILES scripts/connman" ;;
+    "connman.pc") CONFIG_FILES="$CONFIG_FILES connman.pc" ;;
+    "src/net.connman.service") CONFIG_FILES="$CONFIG_FILES src/net.connman.service" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$_am_arg" : 'X\(//\)[^/]' \| \
+        X"$_am_arg" : 'X\(//\)$' \| \
+        X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
index ebc8170..805f02b 100644 (file)
@@ -1,5 +1,5 @@
 AC_PREREQ(2.60)
-AC_INIT(connman, 1.15)
+AC_INIT(connman, 1.24)
 
 AM_INIT_AUTOMAKE([foreign subdir-objects color-tests])
 AC_CONFIG_HEADERS([config.h])
@@ -38,8 +38,6 @@ AC_ARG_ENABLE(optimization, AC_HELP_STRING([--disable-optimization],
        fi
 ])
 
-GTK_DOC_CHECK
-
 AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],
                        [enable compiling with debugging information]), [
        if (test "${enableval}" = "yes" &&
@@ -57,10 +55,6 @@ AC_ARG_ENABLE(pie, AC_HELP_STRING([--enable-pie],
        fi
 ])
 
-AC_ARG_ENABLE(threads,
-       AC_HELP_STRING([--enable-threads], [enable threading support]),
-                       [enable_threads=${enableval}], [enable_threads="no"])
-
 AC_ARG_ENABLE(hh2serial-gps,
        AC_HELP_STRING([--enable-hh2serial-gps], [enable hh2serial GPS support]),
                        [enable_hh2serial_gps=${enableval}], [enable_hh2serial_gps="no"])
@@ -216,14 +210,6 @@ PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.28, dummy=yes,
 AC_SUBST(GLIB_CFLAGS)
 AC_SUBST(GLIB_LIBS)
 
-if (test "${enable_threads}" = "yes"); then
-       AC_DEFINE(NEED_THREADS, 1, [Define if threading support is required])
-       PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
-                               AC_MSG_ERROR(GThread >= 2.16 is required))
-       GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
-       GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
-fi
-
 PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.4, dummy=yes,
                                AC_MSG_ERROR(D-Bus >= 1.4 is required))
 AC_SUBST(DBUS_CFLAGS)
@@ -300,6 +286,11 @@ AC_ARG_ENABLE(ethernet, AC_HELP_STRING([--disable-ethernet],
                                        [enable_ethernet=${enableval}])
 AM_CONDITIONAL(ETHERNET, test "${enable_ethernet}" != "no")
 
+AC_ARG_ENABLE(gadget, AC_HELP_STRING([--disable-gadget],
+                               [disable USB Gadget support]),
+                                       [enable_gadget=${enableval}])
+AM_CONDITIONAL(GADGET, test "${enable_gadget}" != "no")
+
 AC_ARG_ENABLE(wifi, AC_HELP_STRING([--disable-wifi],
                                [disable WiFi support]),
                                        [enable_wifi=${enableval}])
@@ -395,4 +386,4 @@ AM_CONDITIONAL(VPN, test "${enable_openconnect}" != "no" -o \
 
 AC_OUTPUT(Makefile include/version.h src/connman.service
                vpn/connman-vpn.service vpn/net.connman.vpn.service
-               scripts/connman doc/version.xml connman.pc)
+               scripts/connman connman.pc src/net.connman.service)
diff --git a/depcomp b/depcomp
new file mode 100755 (executable)
index 0000000..25a39e6
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,708 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2012-03-27.16; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011, 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+   # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
+   gccflag=-qmakedep=gcc,-MF
+   depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' "$nl" < "$tmpdepfile" |
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+      | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # '$object: dependent.h' and one to simply 'dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
+  # However on
+  #    $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\':
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  # tcc 0.9.26 (FIXME still under development at the moment of writing)
+  # will emit a similar output, but also prepend the continuation lines
+  # with horizontal tabulation characters.
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form 'foo.o: dependent.h',
+  # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # '$object: dependent.h' and one to simply 'dependent.h:'.
+  sed -e "s/^[ $tab][ $tab]*/  /" -e "s,^[^:]*:,$object :," \
+    < "$tmpdepfile" > "$depfile"
+  sed '
+    s/[ '"$tab"'][ '"$tab"']*/ /g
+    s/^ *//
+    s/ *\\*$//
+    s/^[^:]*: *//
+    /^$/d
+    /:$/d
+    s/$/ :/
+  ' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+              s/^ *//
+              s/ \\*$//
+              s/$/:/
+              p
+            }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in 'foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' "$nl" < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+       set fnord "$@"
+       shift
+       shift
+       ;;
+    *)
+       set fnord "$@" "$arg"
+       shift
+       shift
+       ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/doc/Makefile.am b/doc/Makefile.am
deleted file mode 100644 (file)
index ce3e433..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-
-DOC_MODULE = connman
-
-DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.xml
-
-DOC_SOURCE_DIR = ../src
-
-SCAN_OPTIONS = --rebuild-sections --source-dir=../include
-
-MKDB_OPTIONS = --sgml-mode --output-format=xml --tmpl-dir=. \
-                                               --ignore-files=connman \
-                                               --source-dir=../include \
-                                               --source-suffixes=c,h
-
-MKTMPL_OPTIONS = --output-dir=.
-
-HFILE_GLOB = $(top_srcdir)/include/*.h
-CFILE_GLOB = $(top_srcdir)/src/*.c $(top_srcdir)/src/*.h
-
-IGNORE_HFILES = connman connman.h
-
-HTML_IMAGES =
-
-content_files = connman-introduction.xml
-
-INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/gdbus \
-       $(GTHREAD_CFLAGS) $(GMODULE_CFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS)
-
-GTKDOC_LIBS = $(DBUS_LIBS) $(GLIB_LIBS) $(GMODULE_LIBS) $(GTHREAD_LIBS)
-
-MAINTAINERCLEANFILES = Makefile.in \
-       $(DOC_MODULE).types $(DOC_MODULE)-*.txt *.sgml *.bak
-
-if ENABLE_GTK_DOC
-include $(top_srcdir)/doc/gtk-doc.make
-else
-EXTRA_DIST = $(DOC_MAIN_SGML_FILE) connman-introduction.xml
-endif
index 3c08c8f..12c2250 100644 (file)
@@ -5,7 +5,7 @@ Advanced configuration interface
 Configuration basics
 ====================
 
-The default configuration method for all servers is automatic or something
+The default configuration method for all services is automatic or something
 like DHCP. In almost every case that should be just good enough, but if it
 is not, Connection Manager supports manual configuration for Ethernet and
 IP settings.
@@ -44,12 +44,12 @@ configuration this call could be used:
                                                "Netmask": "255.255.255.0" })
 
 The configuration itself is a dictionary with various fields. Not all of
-them need to present. A lot of combinations are valid.
+them need to be present. A lot of combinations are valid.
 
 For example the "Method" field has valid settings of "off", "fixed", "manual"
 and "dhcp". The "fixed" value however can not be set by any user program. It
 is an internal value that some 3G cards require. Switching to "off" will
-remove and IP configuration from the interface. The "manual" method allows
+remove any IP configuration from the interface. The "manual" method allows
 for static address configuration. And "dhcp" will use DHCP to retrieve all
 required information automatically.
 
diff --git a/doc/coding-style.txt b/doc/coding-style.txt
deleted file mode 100644 (file)
index 30690b7..0000000
+++ /dev/null
@@ -1,344 +0,0 @@
-Every project has its coding style, and ConnMan is not an exception. This
-document describes the preferred coding style for ConnMan code, in order to keep
-some level of consistency among developers so that code can be easily
-understood and maintained, and also to help your code survive under
-maintainer's fastidious eyes so that you can get a passport for your patch
-ASAP.
-
-First of all, ConnMan coding style must follow every rule for Linux kernel
-(http://www.kernel.org/doc/Documentation/CodingStyle). There also exists a tool
-named checkpatch.pl to help you check the compliance with it. Just type
-"checkpatch.pl --no-tree patch_name" to check your patch. In theory, you need
-to clean up all the warnings and errors except this one: "ERROR: Missing
-Signed-off-by: line(s)". ConnMan does not used Signed-Off lines, so including
-them is actually an error.  In certain circumstances one can ignore the 80
-character per line limit.  This is generally only allowed if the alternative
-would make the code even less readable.
-
-Besides the kernel coding style above, ConnMan has special flavors for its own.
-Some of them are mandatory (marked as 'M'), while some others are optional
-(marked as 'O'), but generally preferred.
-
-M1: Blank line before and after an if/while/do/for statement
-============================================================
-There should be a blank line before if statement unless the if is nested and
-not preceded by an expression or variable declaration.
-
-Example:
-1)
-a = 1;
-if (b) {  // wrong
-
-2)
-a = 1
-
-if (b) {
-}
-a = 2; // wrong
-
-3)
-if (a) {
-       if (b)  // correct
-
-4)
-b = 2;
-
-if (a) {       // correct
-
-}
-
-b = 3;
-
-The only exception to this rule applies when a variable is being allocated:
-array = g_try_new0(int, 20);
-if (array == NULL)     // Correct
-       return;
-
-
-M2: Multiple line comment
-=========================
-If your comments have more then one line, please start it from the second line.
-
-Example:
-/*
- * first line comment  // correct
- * ...
- * last line comment
- */
-
-
-M3: Space before and after operator
-===================================
-There should be a space before and after each operator.
-
-Example:
-a + b;  // correct
-
-
-M4: Wrap long lines
-===================
-If your condition in if, while, for statement or a function declaration is too
-long to fit in one line, the new line needs to be indented not aligned with the
-body.
-
-Example:
-1)
-if (call->status == CALL_STATUS_ACTIVE ||
-       call->status == CALL_STATUS_HELD) {  // wrong
-       connman_dbus_dict_append();
-
-2)
-if (call->status == CALL_STATUS_ACTIVE ||
-               call->status == CALL_STATUS_HELD) {  // correct
-       connman_dbus_dict_append();
-
-3)
-gboolean sim_ust_is_available(unsigned char *service_ust, unsigned char len,
-       num sim_ust_service index) // wrong
-{
-       int a;
-       ...
-}
-
-4)
-gboolean sim_ust_is_available(unsigned char *service_ust, unsigned char len,
-                                       enum sim_ust_service index) // correct
-{
-       int a;
-       ...
-}
-
-If the line being wrapped is a function call or function declaration, the
-preferred style is to indent at least past the opening parenthesis. Indenting
-further is acceptable as well (as long as you don't hit the 80 character
-limit).
-
-If this is not possible due to hitting the 80 character limit, then indenting
-as far as possible to the right without hitting the limit is preferred.
-
-Example:
-
-1)
-gboolean sim_ust_is_available(unsigned char *service_ust, unsigned char len,
-               enum sim_ust_service index); // worse
-
-2)
-gboolean sim_ust_is_available(unsigned char *service_ust, unsigned char len,
-                                               enum sim_ust_service index);
-                                               // better
-
-M5: Git commit message 50/72 formatting
-=======================================
-The commit message header should be within 50 characters. And if you have
-detailed explanatory text, wrap it to 72 character.
-
-
-M6: Space when doing type casting
-=================================
-There should be a space between new type and variable.
-
-Example:
-1)
-a = (int *)b;  // wrong
-2)
-a = (int *) b;  // correct
-
-
-M7: Don't initialize variable unnecessarily
-===========================================
-When declaring a variable, try not to initialize it unless necessary.
-
-Example:
-int i = 1;  // wrong
-
-for (i = 0; i < 3; i++) {
-}
-
-
-M8: Use g_try_malloc instead of g_malloc
-========================================
-When g_malloc fails, the whole program would exit. Most of time, this is not
-the expected behavior, and you may want to use g_try_malloc instead.
-
-Example:
-additional = g_try_malloc(len - 1);  // correct
-if (additional == NULL)
-       return FALSE;
-
-
-M9: Follow the order of include header elements
-===============================================
-When writing an include header the various elements should be in the following
-order:
-       - #includes
-       - forward declarations
-       - #defines
-       - enums
-       - typedefs
-       - function declarations and inline function definitions
-
-
-M10: Internal headers must not use include guards
-=================================================
-Any time when creating a new header file with non-public API, that header
-must not contain include guards.
-
-
-M11: Naming of enums
-====================
-
-Enums must have a descriptive name.  The enum type should be small caps and
-it should not be typedef-ed.  Enum contents should be in CAPITAL letters and
-prefixed by the enum type name.
-
-Example:
-
-enum animal_type {
-       ANIMAL_TYPE_FOUR_LEGS,
-       ANIMAL_TYPE_EIGHT_LEGS,
-       ANIMAL_TYPE_TWO_LEGS,
-};
-
-If the enum contents have values (e.g. from specification) the formatting
-should be as follows:
-
-enum animal_type {
-       ANIMAL_TYPE_FOUR_LEGS =         4,
-       ANIMAL_TYPE_EIGHT_LEGS =        8,
-       ANIMAL_TYPE_TWO_LEGS =          2,
-};
-
-M12: Enum as switch variable
-====================
-
-If the variable of a switch is an enum, you must not include a default in
-switch body. The reason for this is: If later on you modify the enum by adding
-a new type, and forget to change the switch accordingly, the compiler will
-complain the new added type hasn't been handled.
-
-Example:
-
-enum animal_type {
-       ANIMAL_TYPE_FOUR_LEGS =         4,
-       ANIMAL_TYPE_EIGHT_LEGS =        8,
-       ANIMAL_TYPE_TWO_LEGS =          2,
-};
-
-enum animal_type t;
-
-switch (t) {
-case ANIMAL_TYPE_FOUR_LEGS:
-       ...
-       break;
-case ANIMAL_TYPE_EIGHT_LEGS:
-       ...
-       break;
-case ANIMAL_TYPE_TWO_LEGS:
-       ...
-       break;
-default:  // wrong
-       break;
-}
-
-However if the enum comes from an external header file outside ConnMan
-we cannot make any assumption of how the enum is defined and this
-rule might not apply.
-
-M13: Check for pointer being NULL
-=================================
-
-When checking if a pointer or a return value is NULL, explicitly compare to
-NULL rather than use the shorter check with "!" operator.
-
-Example:
-1)
-array = g_try_new0(int, 20);
-if (!array)    // Wrong
-       return;
-
-2)
-if (!g_at_chat_get_slave(chat))        // Wrong
-       return -EINVAL;
-
-3)
-array = g_try_new0(int, 20);
-if (array == NULL)     // Correct
-       return;
-
-
-M14: Always use parenthesis with sizeof
-=======================================
-The expression argument to the sizeof operator should always be in
-parenthesis, too.
-
-Example:
-1)
-memset(stuff, 0, sizeof(*stuff));
-
-2)
-memset(stuff, 0, sizeof *stuff); // Wrong
-
-
-M15: Use void if function has no parameters
-===========================================================
-A function with no parameters must use void in the parameter list.
-
-Example:
-1)
-void foo(void)
-{
-}
-
-2)
-void foo()     // Wrong
-{
-}
-
-M16: Don't use hex value with shift operators
-==============================================
-The expression argument to the shift operators should not be in hex.
-
-Example:
-
-1)
-1 << y
-
-2)
-0x1 << y       // Wrong
-
-O1: Shorten the name
-====================
-Better to use abbreviation, rather than full name, to name a variable,
-function, struct, etc.
-
-Example:
-supplementary_service  // too long
-ss  // better
-
-O2: Try to avoid complex if body
-================================
-It's better not to have a complicated statement for if. You may judge its
-contrary condition and return | break | continue | goto ASAP.
-
-Example:
-1)
-if (a) {  // worse
-       struct voicecall *v;
-       call = synthesize_outgoing_call(vc, vc->pending);
-       v = voicecall_create(vc, call);
-       v->detect_time = time(NULL);
-       DBG("Registering new call: %d", call->id);
-       voicecall_dbus_register(v);
-} else
-       return;
-
-2)
-if (!a)
-       return;
-
-struct voicecall *v;
-call = synthesize_outgoing_call(vc, vc->pending);
-v = voicecall_create(vc, call);
-v->detect_time = time(NULL);
-DBG("Registering new call: %d", call->id);
-voicecall_dbus_register(v);
index 2429927..d825070 100644 (file)
@@ -5,27 +5,28 @@ Connman uses configuration files to provision existing services. Connman will
 be looking for its configuration files at STORAGEDIR which by default points
 to /var/lib/connman/. Configuration file names must not include other
 characters than letters or numbers and must have a .config suffix.
-Those configuration files are text files with a simple format and we typically
-have one file per provisioned network.
+Those configuration files are text files with a simple key-value pair format,
+organized into sections. Values do not comprise leading or trailing whitespace.
+We typically have one file per provisioned network.
 
 If the config file is removed, then Connman tries to remove the
-provisioned service. If individual service entry inside config is removed,
-then the corresponding provisioned service is removed. If service
-entry is changed, then corresponding service is removed and then
-immediately re-provisioned.
+provisioned services. If an individual service inside a config is removed,
+then the corresponding provisioned service is removed. If a service section
+is changed, then the corresponding service is removed and immediately
+re-provisioned.
 
 
-Global entry [global]
-=====================
+Global section [global]
+=======================
 
-These files can have an optional global entry describing the actual file.
-The 2 allowed fields for that entry are:
+These files can have an optional global section describing the actual file.
+The two allowed fields for this section are:
 - Name: Name of the network.
 - Description: Description of the network.
 
 
-Service entry [service_*]
-=========================
+Service sections [service_*]
+============================
 
 Each provisioned service must start with the [service_*] tag. Replace * with
 an identifier unique to the config file.
@@ -34,20 +35,25 @@ Allowed fields:
 - Type: Service type. We currently only support wifi and ethernet.
 - IPv4: The IPv4 address, netmask and gateway. Format of the entry
   is network/netmask/gateway. The mask length can be used instead
-  of netmask. The field can also contain the string "off" or "dhcp".
+  of netmask. The gateway can be omitted if necessary.
+  The IPv4 field can also contain the string "off" or "dhcp".
   If the setting is "off", then no IPv4 address is set to the interface.
   If the setting is "dhcp", then DHCPv4 address resolution is activated.
   Example: 192.168.1.2/24/192.168.1.1
            192.168.200.100/255.255.255.0/192.168.200.1
+           10.0.0.2/24
 - IPv6: The IPv6 address, prefix length and gateway. Format of the entry
   is network/prefixlen/gateway. For IPv6 addresses only prefix length is
-  accepted. The field can also contain the string "off" or "auto".
+  accepted. The gateway can be omitted if necessary.
+  The IPv6 field can also contain the string "off" or "auto".
   If the setting is "off", then no IPv6 address is set to the interface.
   If the setting is "auto", then SLAAC or DHCPv6 is used.
   Example: 2001:db8::2/64/2001:db8::1
+           2001:db8::1:2:3:4/64
 - IPv6.Privacy: IPv6 privacy option. Value can be either "disabled",
-  "enabled" or "prefered". See use_tempaddr variable description in Linux
-  kernel Documentation/networking/ip-sysctl.txt file.
+  "enabled" or "preferred" (or the misspelled "prefered"). See use_tempaddr
+  variable description in Linux kernel Documentation/networking/ip-sysctl.txt
+  file.
 - MAC: MAC address of the interface where this setting should be applied.
   The MAC address is optional and if it is missing, then the first found
   interface is used. The byte values must have prefix 0 added,
@@ -64,8 +70,9 @@ then SLAAC or DHCPv6 is used.
 The following options are valid if Type is "wifi"
 - Name: A string representation of an 802.11 SSID. If the SSID field is
   present, the Name field is ignored.
-- SSID: A hexadecimal representation of an 802.11 SSID. If the SSID field is
-  omitted, the Name field is used instead.
+- SSID: A hexadecimal representation of an 802.11 SSID. Use this format to
+  encode special characters including starting or ending spaces. If the SSID
+  field is omitted, the Name field is used instead.
 - EAP: EAP type. We currently only support tls, ttls or peap.
 - CACertFile: File path to CA certificate file (PEM/DER).
 - ClientCertFile: File path to client certificate file (PEM/DER).
@@ -84,18 +91,17 @@ The following options are valid if Type is "wifi"
   then AP is not hidden.
 
 
-Example
-=======
+Examples
+========
 
 This is a configuration file for a network providing EAP-TLS, EAP-TTLS and
-EAP-PEAP services.
-The respective SSIDs are tls_ssid, ttls_ssid and peap_ssid and the file name
-is example.config.
+EAP-PEAP services. The respective SSIDs are tls_ssid, ttls_ssid and peap_ssid
+and the file name is example.config.
+
 Please note that the SSID entry is for hexadecimal encoded SSID (e.g. "SSID =
 746c735f73736964"). If your SSID does not contain any exotic character then
 you should use the Name entry instead (e.g. "Name = tls_ssid").
 
-
 example@example:[~]$ cat /var/lib/connman/example.config
 [global]
 Name = Example
diff --git a/doc/connman-docs.xml b/doc/connman-docs.xml
deleted file mode 100644 (file)
index d4059a4..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-<!ENTITY version SYSTEM "version.xml">
-]>
-<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
-  <bookinfo>
-    <title>Connection Manager Reference Manual</title>
-    <releaseinfo>Version &version;</releaseinfo>
-    <authorgroup>
-      <author>
-       <firstname>Marcel</firstname>
-       <surname>Holtmann</surname>
-       <affiliation>
-         <address>
-           <email>marcel@holtmann.org</email>
-         </address>
-       </affiliation>
-      </author>
-    </authorgroup>
-
-    <copyright>
-      <year>2007-2008</year>
-      <holder>Intel Corporation. All rights reserved.</holder>
-    </copyright>
-
-    <legalnotice>
-      <para>
-       Permission is granted to copy, distribute and/or modify this
-       document under the terms of the <citetitle>GNU Free
-       Documentation License</citetitle>, Version 1.1 or any later
-       version published by the Free Software Foundation with no
-       Invariant Sections, no Front-Cover Texts, and no Back-Cover
-       Texts. You may obtain a copy of the <citetitle>GNU Free
-       Documentation License</citetitle> from the Free Software
-       Foundation by visiting <ulink type="http"
-       url="http://www.fsf.org">their Web site</ulink> or by writing
-       to:
-
-       <address>
-         The Free Software Foundation, Inc.,
-         <street>59 Temple Place</street> - Suite 330,
-         <city>Boston</city>, <state>MA</state> <postcode>02111-1307</postcode>,
-         <country>USA</country>
-       </address>
-      </para>
-    </legalnotice>
-  </bookinfo>
-
-  <reference id="design">
-    <title>Design Overview</title>
-    <partintro>
-      <para>
-       This part presents the design documentation for Connection Manager.
-      </para>
-    </partintro>
-    <xi:include href="connman-introduction.xml" />
-  </reference>
-
-  <reference id="manager">
-    <title>Manager interface</title>
-    <para>
-<programlisting><xi:include href="manager-api.txt" parse="text" /></programlisting>
-    </para>
-  </reference>
-
-  <reference id="device">
-    <title>Device interface</title>
-    <para>
-<programlisting><xi:include href="device-api.txt" parse="text" /></programlisting>
-    </para>
-  </reference>
-
-  <reference id="network">
-    <title>Network interface</title>
-    <para>
-<programlisting><xi:include href="network-api.txt" parse="text" /></programlisting>
-    </para>
-  </reference>
-
-  <reference id="service">
-    <title>Service interface</title>
-    <para>
-<programlisting><xi:include href="service-api.txt" parse="text" /></programlisting>
-    </para>
-  </reference>
-
-  <reference id="connection">
-    <title>Connection interface</title>
-    <para>
-<programlisting><xi:include href="connection-api.txt" parse="text" /></programlisting>
-    </para>
-  </reference>
-
-  <reference id="reference">
-    <title>Plugin API Reference</title>
-    <partintro>
-      <para>
-       This part presents the function reference for Connection Manager.
-      </para>
-    </partintro>
-    <xi:include href="xml/log.xml" />
-    <xi:include href="xml/plugin.xml" />
-    <xi:include href="xml/storage.xml" />
-    <xi:include href="xml/security.xml" />
-    <xi:include href="xml/resolver.xml" />
-    <!-- <xi:include href="xml/device.xml" /> -->
-    <!-- <xi:include href="xml/network.xml" /> -->
-  </reference>
-
-  <appendix id="license">
-    <title>License</title>
-    <para>
-<programlisting><xi:include href="../COPYING" parse="text" /></programlisting>
-    </para>
-  </appendix>
-
-  <index>
-    <title>Index</title>
-  </index>
-</book>
diff --git a/doc/connman-introduction.xml b/doc/connman-introduction.xml
deleted file mode 100644 (file)
index 4672c2c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
-
-<chapter id="introduction">
-  <title>Introduction</title>
-  
-  <sect1 id="intro-about">
-    <title>About</title>
-    
-    <para>
-    </para>
-  </sect1>
-
-</chapter>
index 1a24467..626edfd 100644 (file)
@@ -91,7 +91,7 @@ List of blacklisted network interfaces separated by ",".
 Found interfaces will be compared to the list and will
 not be handled by connman, if their first characters
 match any of the list entries. Default value is
-vmnet,vboxnet,virbr.
+vmnet,vboxnet,virbr,ifb.
 .TP
 .B AllowHostnameUpdates=\fPtrue|false\fP
 Allow connman to change the system hostname. This can
diff --git a/doc/connmanctl.1 b/doc/connmanctl.1
deleted file mode 100644 (file)
index b71c6e6..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-.TH connmanctl 1 07/31/2012 "" "User Commands for Connman CLI"
-.SH
-NAME
-connmanctl \- Connman CLI
-.SH
-SYNOPSIS
-.BR connmanctl " ["
-.BR enable " <technology> | "
-.BR offlinemode "] ["
-.BR disable " <technology> | "
-.BR offlinemode "] ["
-.BR technologies "] ["
-.BR state "] ["
-.BR services " [\-\-properties <service>]] ["
-.BR scan " <technology>] ["
-.BR connect " <service>] ["
-.BR config " <service> \-\-<option> ARGS...] ["
-.BR help " | \-\-help]"
-.PP
-.SH
-DESCRIPTION
-Connmanctl is a Connman command line interface which can be run in two modes:
-a plain synchronous command input, and an asynchronous interactive shell.
-To run a specific command the user may enter connmanctl <command> [options]
-[args], or enter connmanctl; in this case, the program will drop into the
-interactive shell.
-.PP
-Connmantl can handle most simple network connections. It is able to enable/
-disable any technology that exists on the system, display a list of
-services available, connect to/disconnect from any unsecured networks,
-show properties of the system, the technologies, and any individual
-service, and configure all of the properties. It is also able to monitor
-changes in the properties of the services, technologies, and the system.
-.PP
-In the interactive shell, all of the same commands can be used. It
-provides quicker usage when needing to use connmanctl more extensively.
-.SH
-COMMANDS AND OPTIONS
-.TP
-.BR "help | \-\-help | " "(no arguments)"
-Shows the abbreviated help menu in the terminal.
-.PP
-.TP
-.BR enable " <technology>"
-Enables the given technology type (e.g. ethernet, wifi, 3g, etc.)
-Turns power on to the technology, but doesn't connect unless
-there is a service with autoconnect set to True.
-.PP
-.TP
-.BR disable " <technology>"
-Disables the given technology type. Turns power off to the
-technology and disconnects if it is already connected.
-.PP
-.TP
-.B enable offlinemode
-Enables offline mode. Disconnects and powers down all
-technologies system-wide, however each technology can be powered
-back on individually.
-.PP
-.TP
-.B disable offlinemode
-Disables offline mode. Technologies are powered back on according
-to their individual policies.
-.PP
-.TP
-.B technologies
-Shows a list of all technology types existing on the system and
-their properties. See the properties section of the Technology
-API for explanations of each property.
-.PP
-.TP
-.B state
-Shows the system properties. Includes ths online state of the
-system, offline mode, and session mode.
-.PP
-.TP
-.BR scan " <technology>"
-Scans for new services on the given technology.
-.PP
-.TP
-.B services
-Shows a list of all available service names. This includes the
-names of wifi networks, the wired ethernet connection, names of
-bluetooth devices, etc. These are the names used when a
-<service> command is called for. The service name
-(e.g. Joes-wifi), the service path (e.g.
-wifi_6834534139723_managed_none), or the full service path (e.g.
-/net/connman/Service/wifi_5467631...) are all accepted as valid
-input. An asterisk in front of the service indicates that the
-service is favorited, and a "C" indicates a service that is
-already connected.
-.PP
-.TP
-.BR "services \-\-properties" " <service>"
-Shows a list of all properties for that service. See the
-properties section of the Service API for explanations of each
-property.
-.PP
-.TP
-.BR connect " <service>"
-Connects to the given service if it is unsecured.
-.PP
-.TP
-.BR disconnect " <service>"
-Disconnects from the given service.
-.PP
-.TP
-.BR config " <service> " \-\-<option>
-Configures a writable property of the given service to the
-value(s) entered after --<option>.
-.PP
-.TP
-.BR monitor " [\-\-<option>]"
-Listens for and displays DBus signals sent by Connman. The option indicates
-which signals you want to subscribe to. If no option is entered, it displays
-all signals from all interfaces.
-.PP
-.SS
-Config Options:
-.PP
-.TP
-.B \-\-autoconnect=y/n
-Sets the autoconnect property of the service.
-.PP
-.TP
-.B \-\-ipv4
-Configures the IPv4 settings for the service. Enter the settings
-in the order "Method", "Address", "Netmask", then "Gateway"
-after the argument. See the properties section of the Service
-API for more information on these settings and the values
-accepted for them. It also displays a list of changes to both the
-IPv4 settings, and incidental changes to other values related to
-it.
-.PP
-.TP
-.B \-\-ipv6
-Configures the IPv6 settings for the service. Enter the settings
-in the order "Method", "Address", "PrefixLength", "Gateway", then
-"Privacy". See the properties section of the Service API for more
-information on these settings and the values accepted for them.
-It also displays a list of entered changes to the IPv6 settings,
-and incidental changes to other values related to it.
-.PP
-.TP
-.B \-\-nameservers
-Adds to the list of manually configured domain name servers.
-Enter the name servers after the argument separated by spaces.
-.PP
-.TP
-.B \-\-timeservers
-Adds to the list of manually configured time servers. Enter the
-time servers after the argument separated by spaces.
-.PP
-.TP
-.B \-\-domains
-Adds to the list of manually configured search domains. Enter
-the domains after the argument, separated by spaces.
-.PP
-.TP
-.B \-\-proxy
-Configures the IPv6 settings for the service. Enter the settings in the
-order "Method", "URL". If the Method is set to "direct", no other arguments
-are taken. If the Method is set to "auto", the URL is optional. To set the
-Servers and Excludes manually, enter "manual" followed by "servers" with a
-list of servers separated by spaces. Then, optionally, the word "excludes"
-followed by a list of excludes separated by spaces. e.g. "./connmanctl config
-joes-wifi \-\-proxy manual servers serv1 serv2 serv3 excludes excl1 excl2"
-.PP
-.SS
-Monitor Options:
-.PP
-.TP
-.B \-\-services
-Listens for and displays the PropertyChanged signal from the Service interface.
-Also displays the service name (e.g. Joes-wifi) that the property is part of.
-More information, including a list of possible properties can be found in the
-Service API.
-.PP
-.TP
-.B \-\-tech
-Listens for and displays the PropertyChanged signal from the Technology
-interface. More information, including a list of possible properties can be
-found in the Technology API.
-.PP
-.TP
-.B \-\-manager
-Listens for and displays the PropertyChanged, ServicesChanged, TechnologyAdded,
-and TechnologyRemoved signals from the Manager interface. More information on
-these signals and a list of possible properties can be found in the Manager API.
-.PP
diff --git a/doc/gtk-doc.make b/doc/gtk-doc.make
deleted file mode 100644 (file)
index 354ffb7..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-# -*- mode: makefile -*-
-
-####################################
-# Everything below here is generic #
-####################################
-
-if GTK_DOC_USE_LIBTOOL
-GTKDOC_CC = $(LIBTOOL) --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-GTKDOC_LD = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
-else
-GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
-endif
-
-# We set GPATH here; this gives us semantics for GNU make
-# which are more like other make's VPATH, when it comes to
-# whether a source that is a target of one rule is then
-# searched for in VPATH/GPATH.
-#
-GPATH = $(srcdir)
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-EXTRA_DIST =                           \
-       $(content_files)                \
-       $(HTML_IMAGES)                  \
-       $(DOC_MAIN_SGML_FILE)           \
-       $(DOC_MODULE)-sections.txt      \
-       $(DOC_MODULE)-overrides.txt
-
-DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \
-          $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp
-
-SCANOBJ_FILES =                 \
-       $(DOC_MODULE).args       \
-       $(DOC_MODULE).hierarchy  \
-       $(DOC_MODULE).interfaces \
-       $(DOC_MODULE).prerequisites \
-       $(DOC_MODULE).signals
-
-REPORT_FILES = \
-       $(DOC_MODULE)-undocumented.txt \
-       $(DOC_MODULE)-undeclared.txt \
-       $(DOC_MODULE)-unused.txt
-
-CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
-
-if ENABLE_GTK_DOC
-all-local: html-build.stamp
-else
-all-local:
-endif
-
-docs: html-build.stamp
-
-#### scan ####
-
-scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
-       @echo 'gtk-doc: Scanning header files'
-       @-chmod -R u+w $(srcdir)
-       cd $(srcdir) && \
-         gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES)
-       if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \
-           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \
-       else \
-           cd $(srcdir) ; \
-           for i in $(SCANOBJ_FILES) ; do \
-               test -f $$i || touch $$i ; \
-           done \
-       fi
-       touch scan-build.stamp
-
-$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
-       @true
-
-#### templates ####
-
-tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
-       @echo 'gtk-doc: Rebuilding template files'
-       @-chmod -R u+w $(srcdir)
-       cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
-       touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
-       @true
-
-tmpl/*.sgml:
-       @true
-
-
-#### xml ####
-
-sgml-build.stamp: tmpl.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
-       @echo 'gtk-doc: Building XML'
-       @-chmod -R u+w $(srcdir)
-       cd $(srcdir) && \
-       gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS)
-       touch sgml-build.stamp
-
-sgml.stamp: sgml-build.stamp
-       @true
-
-#### html ####
-
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
-       @echo 'gtk-doc: Building HTML'
-       @-chmod -R u+w $(srcdir)
-       rm -rf $(srcdir)/html
-       mkdir $(srcdir)/html
-       cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
-       test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
-       @echo 'gtk-doc: Fixing cross-references'
-       cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
-       touch html-build.stamp
-
-##############
-
-clean-local:
-       rm -f *~ *.bak
-       rm -rf .libs
-
-distclean-local:
-       cd $(srcdir) && \
-         rm -rf xml $(REPORT_FILES) \
-                $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-maintainer-clean-local: clean
-       cd $(srcdir) && rm -rf xml html
-
-install-data-local:
-       -installfiles=`echo $(srcdir)/html/*`; \
-       if test "$$installfiles" = '$(srcdir)/html/*'; \
-       then echo '-- Nothing to install' ; \
-       else \
-         $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \
-         for i in $$installfiles; do \
-           echo '-- Installing '$$i ; \
-           $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
-         done; \
-         echo '-- Installing $(srcdir)/html/index.sgml' ; \
-         $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR) || :; \
-         which gtkdoc-rebase >/dev/null && \
-           gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR) ; \
-       fi
-       
-
-uninstall-local:
-       rm -f $(DESTDIR)$(TARGET_DIR)/*
-
-#
-# Require gtk-doc when making dist
-#
-if ENABLE_GTK_DOC
-dist-check-gtkdoc:
-else
-dist-check-gtkdoc:
-       @echo "*** gtk-doc must be installed and enabled in order to make dist"
-       @false
-endif
-
-dist-hook: dist-check-gtkdoc dist-hook-local
-       mkdir $(distdir)/tmpl
-       mkdir $(distdir)/xml
-       mkdir $(distdir)/html
-       -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
-       -cp $(srcdir)/xml/*.xml $(distdir)/xml
-       cp $(srcdir)/html/* $(distdir)/html
-       -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/
-       -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/
-       cd $(distdir) && rm -f $(DISTCLEANFILES)
-       -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html
-
-.PHONY : dist-hook-local docs
index ad07c3d..05d2701 100644 (file)
@@ -39,6 +39,13 @@ Methods              dict GetProperties()
 
                        Possible Errors: [service].Error.InvalidArguments
 
+               array{object,dict} GetPeers() [experimental]
+
+                       Returns a sorted list of tuples with peer object path
+                       and dictionary of peer properties
+
+                       Possible Errors: [service].Error.InvalidArguments
+
                object ConnectProvider(dict provider)   [deprecated]
 
                        Connect to a VPN specified by the given provider
@@ -186,6 +193,28 @@ Signals            TechnologyAdded(object path, dict properties)
                        required to watch the PropertyChanged signal of
                        the service object.
 
+               PeersChanged(array{object, dict}, array{object}) [experimental]
+
+                       Signals a list of peers that have been changed via the
+                       first array. And a list of peer that have been removed
+                       via the second array.
+
+                       The list of changed peers is sorted. The dictionary
+                       with the properties might be empty in case none of the
+                       properties have changed. Or only contains the
+                       properties that have changed.
+
+                       For newly added peers the whole set of properties will
+                       be present.
+
+                       The list of removed peers can be empty.
+
+                       This signal will only be triggered when the sort order
+                       of the peer list or the number of peers changes. It
+                       will not be emitted if only a property of the peer
+                       object changes. For that it is required to watch the
+                       PropertyChanged signal of the peer object.
+
                PropertyChanged(string name, variant value)
 
                        This signal indicates a changed value of the given
@@ -232,11 +261,9 @@ Properties string State [readonly]
                        the limited usage of WiFi or Bluetooth devices might
                        be allowed in some situations.
 
-               boolean SessionMode [readwrite]  [experminental]
+               boolean SessionMode [readwrite]  [experminental][deprecated]
 
-                       This disables the auto connect feature. It should be
-                       enabled when the Session API is used. When SessionMode
-                       is enabled, 'ConnectService' and 'ConnectProvider'
-                       method calls are disallowed.
+                       This property exists only for compatibility reasons
+                       and does not affect ConnMan in any way.
 
                        The default value is false.
index 7268adc..f126887 100644 (file)
@@ -99,13 +99,11 @@ delete/remove button.
        |                                       |
 
 Ethernet is special here since the unplugging of the network cable will
-remove the favorite selection.
+remove the service from the list
 
        +---------------------------------------+
        | Ethernet with cable                   |  order=1 - favorite=yes
        +---------------------------------------+
-       | Ethernet without cable                |  order=0 - favorite=no
-       +---------------------------------------+
        | Guest            (strength 90, none)  |  order=0
        +---------------------------------------+
        |                                       |
@@ -143,14 +141,13 @@ A working connection is considered top priority.
        +---------------------------------------+
        |                                       |
 
-Another possible user interaction would be to unplug the Ethernet cable and
-in this case the favorite setting will be removed and the service falls back
-down in the list.
+Another possible user interaction would be to disconnect the Ethernet service
+and in this case the service falls back down in the list.
 
        +---------------------------------------+
        | My WiFi AP       (strength 80, rsn)   |  order=1 - connected=yes
        +---------------------------------------+
-       | Ethernet                              |  order=0
+       | Ethernet                              |  order=1 - connected=no
        +---------------------------------------+
        | Guest            (strength 90, none)  |  order=0
        +---------------------------------------+
@@ -174,15 +171,11 @@ and are sorted above all others.
        +---------------------------------------+
        |                                       |
 
-Unplugging the Ethernet cable will remove the favorite setting, but due to
-the basic ordering of services it will be at the top of the services with an
-order number of 0 (directly after all favorite services).
+Unplugging the Ethernet cable will remove the Ethernet service.
 
        +---------------------------------------+
        | My WiFi AP       (strength 80, rsn)   |  order=1 - connected=no
        +---------------------------------------+
-       | Ethernet                              |  order=0 - connected=no
-       +---------------------------------------+
        | Guest            (strength 90, none)  |  order=0
        +---------------------------------------+
        |                                       |
@@ -197,7 +190,7 @@ included in this list. They will only show up once a carrier is detected.
 
 The service interface is not meant for basic device configuration task. So
 switching a device on and off (via RFKILL for example) should be done via
-the technology interface.
+the technology interface. See "Technology interfaces" chapter in this document.
 
 Due to limited screen size of small devices and the big amount of WiFi
 access points that are deployed right now it might be sensible to not show
@@ -408,3 +401,35 @@ gives detailed information about the current progress.
 All state changes are also sent via the PropertyChanged signal on the
 service interface. This allows asynchronous monitoring without having to poll
 Connection Manager for changes.
+
+
+Technology interfaces
+=====================
+
+When ConnMan is started first time, all technologies except ethernet are
+powered off by default. The reason is that the user needs to decide which
+technologies are relevant to him and what bearers the user wants to use.
+User can use the Technology Powered property to turn on or off a given
+technology. See doc/technology-api.txt document for details.
+
+User can activate offline (flight) mode via Manager OfflineMode property.
+While in offline mode, all the technologies including ethernet are
+powered off. During the offline mode, the user can temporarily activate
+individual technologies by using the Technology Powered property or by
+using the rfkill command or Fn-Fx key combination found in some laptops.
+
+If the host supports rfkill switch, then all the radios can be turned off
+by the kernel when the switch is activated. ConnMan will notice this and
+remove corresponding technologies from D-Bus. Technologies cannot be
+activated while rfkill switch is turned on. When rfkill switch is turned
+off (radios are activated), then ConnMan restores the original Powered
+status for each activated technology.
+
+User can use the rfkill command from command line or indirectly via
+some UI component to activate/deactivate individual radios found in
+the host. ConnMan will listen these rfkill events and set the Powered
+property accordingly. ConnMan will not save the rfkill status it has
+received. This means that after restarting ConnMan, the original and
+saved technology status is used when deciding which technologies should
+be powered. If the user uses the Technology D-Bus API to set the Powered
+property, then that information is saved and used when ConnMan is restarted.
index b39c043..616938b 100644 (file)
@@ -22,3 +22,143 @@ static void example_exit(void)
 
 CONNMAN_PLUGIN_DEFINE(example, "Example plugin", CONNMAN_VERSION,
                                                example_init, example_exit)
+
+
+Infrastructure for plugins
+==========================
+
+The Connection Manager provides a very good infrastructure for plugins to
+interface with the core functionalities of ConnMan. The infrastructure is
+well divided into the concepts of Technology, Device and Network, among
+others.
+
+Technology infrastructure
+=========================
+
+A Technology in ConnMan is an abstract representation of the different
+kinds of technologies it supports such as WiFi, Ethernet, Bluetooth and
+Celullar. The technologies support are added to ConnMan through plugins, such
+as plugins/bluetooth.c for the Bluetooth Technology or plugins/wifi.c for the
+WiFi Technology. Each new technology plugin needs to register itself as a
+Technology with ConnMan. As an example we will take a look at the Bluetooth
+plugin registration. As a first step 'struct connman_technology_driver' needs
+to be defined:
+
+       static struct connman_technology_driver tech_driver = {
+               .name           = "bluetooth",
+               .type           = CONNMAN_SERVICE_TYPE_BLUETOOTH,
+               .probe          = bluetooth_tech_probe,
+               .remove         = bluetooth_tech_remove,
+               .set_tethering  = bluetooth_tech_set_tethering,
+       };
+
+More functions can be defined depending on the purpose of the plugin. All
+vtable's supported functions can be seen in include/technology.h. If a
+completely new technology type is added 'enum connman_service_type' in
+include/service.h needs to be extended accordingly. This inclusion comes in
+the form of Service because ultimately a new technology introduces a new
+Service. New technologies can also reuse existing Services types.
+
+To make the Connection Manager aware of the new Technology plugin we need to
+register its driver by calling 'connman_technology_driver_register()' in the
+plugin initialization function, bluetooth_init() in this example:
+
+       connman_technology_driver_register(&tech_driver);
+
+In this document the error check is supressed for the sake of simplicity.
+All plugins should check return values in driver registration functions.
+
+After this call ConnMan becomes aware of the new Technology plugin and will
+call the probe() method when the new technology is recognized by the system. For
+the Bluetooth plugin for example probe() would be called when a Bluetooth
+adapter is recognized. A Technology is only probed if there exists at least
+one device of such technology plugged into the system.
+
+Complementary, the technology must be unregistered on the plugin exit function
+through 'connman_technology_driver_unregister()'.
+
+Device infrastructure
+=====================
+
+A Device represents a real device of a given Technology, there could be many
+devices per technology. To enable ConnMan to handle Devices a device driver
+needs to be registered. Using the Bluetooth plugin as example it would have to
+define a 'struct connman_device_driver':
+
+       static struct connman_device_driver device_driver = {
+               .name           = "bluetooth",
+               .type           = CONNMAN_DEVICE_TYPE_BLUETOOTH,
+               .probe          = bluetooth_device_probe,
+               .remove         = bluetooth_device_remove,
+               .enable         = bluetooth_device_enable,
+               .disable        = bluetooth_device_disable,
+       };
+
+And to register the driver:
+
+       connman_device_driver_register(&device_driver);
+
+'connman_device_driver_register()' is called during the plugin initialization
+process, not necessarily at the plugin init function.
+
+In this document the error check is supressed for the sake of simplicity.
+All plugins should check return values in driver registration functions.
+
+Additionally code to handle the detection of new devices needs to be written
+for each plugin, the bluetooth plugin does so by registering watchers for the
+BlueZ D-Bus interface. Once a new Bluetooth Device appears the plugin needs to
+notify ConnMan core by calling connman_device_create(), for the bluetooth
+plugin the call would be:
+
+       struct connman_device *device;
+
+        device = connman_device_create("bluetooth",
+                                       CONNMAN_DEVICE_TYPE_BLUETOOTH)
+
+ConnMan core will then register the bluetooth device as a Device entity and
+call the probe() function from the bluetooth plugin device driver. If a
+Technology entity for the Device type doesn't exist it will be created and
+Technology probe() function in the bluetooth technology driver is called.
+
+For the Bluetooth plugin a Device represents the local Bluetooth Adapter
+plugged in the system.
+
+To learn how to use the connman_device_*() functions such as
+connman_device_set_powered() and connman_device_ref() see src/device.c for
+its API documentation.
+
+Network infrastructure
+======================
+
+The Connection Manager provides a mean to plugins handle the specifics of
+establishing/handling a connection for each type of Technology. For the
+bluetooth plugin a connman_network_driver needs to be registered:
+
+       static struct connman_network_driver network_driver = {
+               .name           = "bluetooth",
+               .type           = CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN,
+               .probe          = bluetooth_pan_probe,
+               .remove         = bluetooth_pan_remove,
+               .connect        = bluetooth_pan_connect,
+               .disconnect     = bluetooth_pan_disconnect,
+       };
+
+And then call the register function:
+
+       connman_network_driver_register(&network_driver);
+
+In this document the error check is supressed for the sake of simplicity.
+All plugins should check return values in driver registration functions.
+
+The next step would be the probe of a Network entity, for the bluetooth
+plugin this would happen when a new device that supports the PAN NAP role is
+paired with the system. ConnMan then call connman_device_add_network() to
+associate the new Network with the existing Device entity (the local Bluetooth
+Adapter).
+
+Then in the vtable's connect method all the needed pieces to perform a
+connection shall be perfomed.
+
+To learn how to use the connman_network_*() functions such as
+connman_network_set_index() and connman_network_set_connected() see
+src/network.c for its API documentation.
index 54b77a4..c9dd7e2 100644 (file)
@@ -22,6 +22,9 @@ Methods               dict GetProperties()  [deprecated]
                        changeable. On success a PropertyChanged signal
                        will be emitted.
 
+                       Properties cannot be set for hidden WiFi service
+                       entries or provisioned services.
+
                        Possible Errors: [service].Error.InvalidArguments
                                         [service].Error.InvalidProperty
 
@@ -29,6 +32,9 @@ Methods               dict GetProperties()  [deprecated]
 
                        Clears the value of the specified property.
 
+                       Properties cannot be cleared for hidden WiFi service
+                       entries or provisioned services.
+
                        Possible Errors: [service].Error.InvalidArguments
                                         [service].Error.InvalidProperty
 
@@ -48,6 +54,11 @@ Methods              dict GetProperties()  [deprecated]
                        setting a longer D-Bus timeout might be a really
                        good idea.
 
+                       Calling Connect() on a hidden WiFi service entry will
+                       query the missing SSID via the Agent API causing a
+                       WiFi service with the given SSID to be scanned,
+                       created and connected.
+
                        Possible Errors: [service].Error.InvalidArguments
 
                void Disconnect()
@@ -63,6 +74,9 @@ Methods               dict GetProperties()  [deprecated]
                        This method can also be used to abort a previous
                        connection attempt via the Connect method.
 
+                       Hidden WiFi service entries cannot be disconnected
+                       as they always stay in idle state.
+
                        Possible Errors: [service].Error.InvalidArguments
 
                void Remove()
@@ -81,9 +95,10 @@ Methods              dict GetProperties()  [deprecated]
                        service is in the State=failure, this method can
                        also be used to reset the service.
 
-                       Calling this method on Ethernet devices will cause
-                       an error message. It is not possible to remove these
-                       kind of devices.
+                       Calling this method on Ethernet devices, hidden WiFi
+                       services or provisioned services will cause an error
+                       message. It is not possible to remove these kind of
+                       services.
 
                        Possible Errors: [service].Error.InvalidArguments
 
index d42c6d1..9af6a67 100644 (file)
@@ -5,55 +5,14 @@ Session API
 Connection management algorithm basics
 ======================================
 
-When a session is created, a sorted list of services is added to the
-session. The services are filtered and sorted according AllowedBearers.
-
-There are three triggers which lead to evaluate the connect
-algorithm:
-
- - Session.Connect()
- - Offline
-
-Connect algorithm:
-
-              Session.Connect()
-                       |
-                +------+-------+
-          +-----+ECall Session ?+-----+
-       Yes|     +--------------+      |No
-          |                           |
-        Connect to            +--------------+
-        first available   +---+AvoidHandover?+---+
-        Service           |   +--------------+   |
-                       Yes|                      |No
-                 +----------------+              |
-             +---+In service_list +---+          |
-          Yes|   |and online?     |   |No        |
-             |   +----------------+   |          |
-             |                        |          |
-         Take that one                Take first in
-                                      the service list
-
-Disconnect algorithm
-
- - Session.Disconnect()
-
-Disconnect algorithm:
-
-  Session.Disconnect()
-       |
-       +--- Session.Change()
-       |
-+-----------------+    Yes
-|service not used +-------------+
-|by other session?|             |
-+------.----------+             |
-       |No                      |
-       |                        |
-    Service.Disconnect()   Do nothing
-
-Session.Disconnect() will be blocked whenever a ongoing
-emergency call is active.
+The Session core uses the normal auto-connect algorithm for selecting
+which services will be connected or disconnected. That means only
+Services with AutoConnect to set to true will be used. The Session
+core will assign a connected Service to a Session if the Service
+is matching the AllowedBearer filter.
+
+By using the normal auto-connect algorithm, it is possible to
+use the Session API and the Service API at the same time.
 
 
 Session States and Transitions
@@ -76,3 +35,60 @@ Connnect()
   |     ^
   +-----+
  Disconnect()
+
+
+If an application wants to stay offline it can set an empty
+AllowedBearers list.
+
+
+Session application identification
+==================================
+
+Application using session can be identified through different means.
+
+  - SELinux
+  - UID
+  - GID
+
+ConnMan will try to identify the application in the given order above.
+If SELinux is not supported by the system or not configured, ConnMan
+will ignore it and fallback asking the D-Bus daemon about the UID of
+the application.
+
+The identification is only useful in combination with the policy plugin.
+
+
+Policy Plugin
+=============
+
+The policy plugin allows the administrator to provision/configure
+sessions. Each policy needs an application identification in order to
+match the policy to a session.
+
+See session-policy-format.txt for more details.
+
+
+Per application routing
+=======================
+
+For each session a policy routing table is maintained. Each policy
+routing table contains a default route to the selected service.
+
+Per session iptables rules:
+
+iptables -t mangle -A OUTPUT -m owner [--uid-owner|--gid-owner] $OWNER \
+         -j MARK --set-mark $MARK
+
+Global rules for all sessions:
+
+iptables -t mangle -A INPUT -j CONNMARK --restore-mark
+iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
+
+Per application routing is only available when policy files are
+used. Without the policy plugin or a valid configuration, the default
+session configuration is applied.
+
+The default session configuration does not enable the per application
+routing. Sessions are still useful in this setup, because the
+notification of sessions is still available, e.g. the online/offline
+notification.
index 81adcbc..f97eac0 100644 (file)
@@ -36,6 +36,10 @@ Methods              dict GetProperties()  [deprecated]
                        Results will be signaled via the ServicesChanged
                        signal from the manager interface.
 
+                       In case of P2P technology, results will be signaled
+                       via the PeersChanged signal from the manager
+                       interface.
+
 Signals                PropertyChanged(string name, variant value)
 
                        This signal indicates a changed value of the given
diff --git a/doc/valgrind.suppressions b/doc/valgrind.suppressions
deleted file mode 100644 (file)
index c1c7bca..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-{
-   <syslog error>
-   Memcheck:Cond
-   obj:/lib/libc-*.so
-   ...
-   fun:localtime_r
-   fun:__vsyslog_chk
-   fun:__syslog_chk
-   fun:__connman_log_init
-   ...
-}
-{
-   <iconv open>
-   Memcheck:Addr4
-   obj:/lib/libc-*.so
-   obj:/lib/libglib-2.0.so*
-   fun:g_iconv_open
-   ...
-   fun:g_convert
-   fun:g_locale_to_utf8
-   fun:g_strerror
-   fun:g_key_file_load_from_file
-   ...
-}
-{
-   <ioctl ADDRT/DELRT>
-   Memcheck:Param
-   ioctl(SIOCADDRT/DELRT)
-   obj:/lib/ld-*.so
-   ...
-}
-{
-   <g_main_loop>
-   Memcheck:Leak
-   fun:memalign
-   ...
-   fun:g_slice_alloc
-   ...
-   fun:g_main_loop_new
-   ...
-}
-{
-   <g_option_context_parse>
-   Memcheck:Leak
-   ...
-   fun:g_slice_alloc
-   ...
-   fun:g_option_context_parse
-   ...
-}
-{
-   <g_key_file_load_from_data>
-   Memcheck:Leak
-   ...
-   fun:g_slice_alloc
-   ...
-   fun:g_key_file_load_from_data
-   ...
-}
-{
-   <g_key_file_new 1>
-   Memcheck:Leak
-   ...
-   fun:g_slice_alloc
-   ...
-   fun:g_key_file_new
-   ...
-}
-{
-   <g_key_file_new 2>
-   Memcheck:Leak
-   fun:*alloc
-   ...
-   fun:g_key_file_new
-   fun:main
-}
-{
-   <connman plugin cleanup>
-   Memcheck:Leak
-   ...
-   fun:__connman_plugin_cleanup
-   ...
-}
-{
-   <cmd line option parsing>
-   Memcheck:Leak
-   fun:malloc
-   fun:g_malloc
-   fun:g_strdup
-   fun:g_set_prgname
-   fun:g_option_context_parse
-   fun:main
-}
-{
-   <dbus system bus setup 1>
-   Memcheck:Leak
-   ...
-   fun:dbus_malloc*
-   ...
-   fun:g_dbus_setup_bus
-   fun:main
-}
-{
-   <dbus system bus setup 2>
-   Memcheck:Leak
-   ...
-   fun:g_malloc*
-   ...
-   fun:dbus_connection_set_watch_functions
-   fun:setup_bus
-   ...
-}
-{
-   <key file get charset>
-   Memcheck:Leak
-   ...
-   fun:g_*alloc*
-   ...
-   fun:g_strerror
-   fun:g_key_file_load_from_file
-   fun:main
-}
-{
-   <dbus disconnect func set>
-   Memcheck:Leak
-   ...
-   fun:filter_data_get
-   fun:g_dbus_add_signal_watch
-   fun:g_dbus_set_disconnect_function
-   fun:main
-}
-{
-   <plugin dlopen>
-   Memcheck:Leak
-   ...
-   fun:dlopen
-   fun:__connman_plugin_init
-   fun:main
-}
-{
-   <dbus system bus setup 3>
-   Memcheck:Leak
-   ...
-   fun:dbus_malloc0
-   ...
-   fun:dbus_parse_address
-   ...
-   fun:g_dbus_setup_bus
-   fun:main
-}
-{
-   <libdbus internals 1>
-   Memcheck:Leak
-   fun:*malloc
-   ...
-   obj:/lib/libdbus-1.so.3.5.3
-}
-{
-   <dbus system bus setup 4>
-   Memcheck:Leak
-   fun:*alloc
-   ...
-   fun:dbus_*alloc*
-   ...
-   fun:g_dbus_setup_bus
-   fun:main
-}
-{
-   <dbus system bus setup 5>
-   Memcheck:Leak
-   fun:calloc
-   fun:g_malloc0
-   ...
-   fun:g_dbus_set_disconnect_function
-   fun:main
-}
-{
-   <dbus bus remove match>
-   Memcheck:Leak
-   fun:malloc
-   fun:g_malloc
-   fun:g_source_set_callback
-   fun:g_timeout_add_full
-   fun:g_timeout_add
-   ...
-   fun:dbus_pending_call_block
-   fun:dbus_connection_send_with_reply_and_block
-   ...
-   fun:dbus_bus_remove_match
-}
-{
-   <g_main_loop_run/new>
-   Memcheck:Leak
-   fun:*alloc
-   ...
-   fun:g_main_loop_*
-   fun:main
-}
-{
-   <g_main_context_dispatch>
-   Memcheck:Leak
-   fun:*alloc
-   ...
-   fun:g_main_context_dispatch
-}
-{
-   <libdbus internals 2>
-   Memcheck:Leak
-   fun:realloc
-   fun:dbus_realloc
-   ...
-   fun:dbus_message_set_reply_serial
-   fun:dbus_message_new_error
-   ...
-}
-{
-   <libdbus internals 3>
-   Memcheck:Leak
-   fun:realloc
-   fun:dbus_realloc
-   ...
-   fun:dbus_message_new_signal
-   ...
-}
-{
-   <dbus_bus_register>
-   Memcheck:Leak
-   fun:malloc
-   fun:realloc
-   fun:dbus_realloc
-   ...
-   fun:dbus_pending_call_block
-   fun:dbus_connection_send_with_reply_and_block
-   fun:dbus_bus_register
-}
diff --git a/doc/version.xml.in b/doc/version.xml.in
deleted file mode 100644 (file)
index d78bda9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@VERSION@
diff --git a/doc/vpn-agent-api.txt b/doc/vpn-agent-api.txt
deleted file mode 100644 (file)
index bdef9f3..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-Agent hierarchy
-===============
-
-Service                unique name
-Interface      net.connman.vpn.Agent
-Object path    freely definable
-
-Methods                void Release()
-
-                       This method gets called when the service daemon
-                       unregisters the agent. An agent can use it to do
-                       cleanup tasks. There is no need to unregister the
-                       agent, because when this method gets called it has
-                       already been unregistered.
-
-               void ReportError(object service, string error)
-
-                       This method gets called when an error has to be
-                       reported to the user.
-
-                       A special return value can be used to trigger a
-                       retry of the failed transaction.
-
-                       Possible Errors: net.connman.vpn.Agent.Error.Retry
-
-               dict RequestInput(object service, dict fields)
-
-                       This method gets called when trying to connect to
-                       a service and some extra input is required. For
-                       example a password or username.
-
-                       The return value should be a dictionary where the
-                       keys are the field names and the values are the
-                       actual fields. Alternatively an error indicating that
-                       the request got canceled can be returned.
-
-                       Most common return field names are "Username" and of
-                       course "Password".
-
-                       The dictionary arguments contains field names with
-                       their input parameters.
-
-                       Possible Errors: net.connman.vpn.Agent.Error.Canceled
-
-               void Cancel()
-
-                       This method gets called to indicate that the agent
-                       request failed before a reply was returned.
-
-Fields         string Username
-
-                       Username for authentication. This field will be
-                       requested when connecting to L2TP and PPTP.
-
-               string Password
-
-                       Password for authentication.
-
-               boolean SaveCredentials
-
-                       Tells if the user wants the user credentials
-                       be saved by connman-vpnd.
-
-               string Host
-
-                       End point of this VPN link i.e., the VPN gateway
-                       we are trying to connect to.
-
-               string Name
-
-                       Name of the VPN connection we are trying to connect to.
-
-               string OpenConnect.Cookie
-
-                       Return the OpenConnect cookie value that is used to
-                       authenticate the user and is specific to this user.
-
-Arguments      string Type
-
-                       Contains the type of a field. For example "password",
-                       "response", "boolean" or plain "string".
-
-               string Requirement
-
-                       Contains the requirement option. Valid values are
-                       "mandatory", "optional", "alternate" or
-                       "informational".
-
-                       The "alternate" value specifies that this field can be
-                       returned as an alternative to another one.
-
-                       All "mandatory" fields must be returned, while the
-                       "optional" can be returned if available.
-
-                       Nothing needs to be returned for "informational", as it
-                       is here only to provide an information so a value is
-                       attached to it.
-
-               array{string} Alternates
-
-                       Contains the list of alternate field names this
-                       field can be represented by.
-
-               string Value
-
-                       Contains data as a string, relatively to an
-                       "informational" argument.
-
-Examples       Requesting a username and password for L2TP network
-
-                       RequestInput("/vpn1",
-                               { "Username" : { "Type"        : "string",
-                                                "Requirement" : "mandatory"
-                                               } }
-                               { "Password" : { "Type"        : "password",
-                                                "Requirement" : "mandatory"
-                                               } }
-                               { "SaveCredentials" : { "Type" : "boolean",
-                                               "Requirement" : "optional"
-                                               }
-                               }
-                       ==> { "Username" : "foo", "Password" : "secret123",
-                               "SaveCredentials" : true }
-
-               Requesting a OpenConnect cookie
-
-                       RequestInput("/vpn2",
-                               { "OpenConnect.Cookie" : { "Type" : "string",
-                                                "Requirement" : "mandatory"
-                                                       } }
-                               { "Host" : { "Type" : "string",
-                                        "Requirement" : "informational"
-                                                       } }
-                               { "Name" : { "Type" : "string",
-                                        "Requirement" : "informational"
-                                                       } }
-                       ==> { "OpenConnect.Cookie" : "0123456@adfsf@asasdf" }
diff --git a/doc/vpn-config-format.txt b/doc/vpn-config-format.txt
deleted file mode 100644 (file)
index f3c4569..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-Connman configuration file format for VPN
-*****************************************
-
-Connman VPN uses configuration files to provision existing providers.
-vpnd will be looking for its configuration files at VPN_STORAGEDIR
-which by default points to /var/lib/connman-vpn. Configuration file names
-must not include other characters than letters or numbers and must have
-a .config suffix. Those configuration files are text files with a simple
-format and we typically have one file per provisioned network.
-
-If the config file is removed, then vpnd tries to remove the
-provisioned service. If individual service entry inside config is removed,
-then the corresponding provisioned service is removed. If service
-entry is changed, then corresponding service is removed and then
-immediately re-provisioned.
-
-
-Global entry [global]
-=====================
-
-These files can have an optional global entry describing the actual file.
-The 2 allowed fields for that entry are:
-- Name: Name of the network.
-- Description: Description of the network.
-
-
-Provider entry [provider_*]
-===========================
-
-Each provisioned provider must start with the [provider_*] tag.
-Replace * with an identifier unique to the config file.
-
-Allowed fields:
-- Type: Provider type. Value of OpenConnect, OpenVPN, VPNC, L2TP or PPTP
-
-VPN related parameters (M = mandatory, O = optional):
-- Name: A user defined name for the VPN (M)
-- Host: VPN server IP address (M)
-- Domain: Domain name for the VPN service (M)
-- Networks: The networks behind the VPN link can be defined here. This can
-  be missing if all traffic should go via VPN tunnel. If there are more
-  than one network, then separate them by comma. Format of the entry
-  is network/netmask/gateway. The gateway can be left out. (O)
-  Example: 192.168.100.0/24/10.1.0.1,192.168.200.0/255.255.255.0/10.1.0.2
-  For IPv6 addresses only prefix length is accepted like this 2001:db8::1/64
-
-OpenConnect VPN supports following options (see openconnect(8) for details):
- Option name            OpenConnect option   Description
- OpenConnect.ServerCert --servercert         Accept server's SSL certificate
-                                             only if its fingerprint matches
-                                             this value (SHA1) (M)
- OpenConnect.CACert     --cafile             Cert file for server
-                                             verification (M)
- VPN.MTU                --mtu                Request MTU from server as the
-                                             MTU of the tunnel (O)
-
-OpenVPN VPN supports following options (see openvpn(8) for details):
- Option name            OpenVPN option   Description
- OpenVPN.CACert         --ca             Certificate authority file (M)
- OpenVPN.Cert           --cert           Local peer's signed certificate (M)
- OpenVPN.Key            --key            Local peer's private key (M)
- OpenVPN.MTU            --mtu            MTU of the tunnel (O)
- OpenVPN.NSCertType     --ns-cert-type   Peer certificate type, value of
-                                         either server or client (O)
- OpenVPN.Proto          --proto          Use protocol (O)
- OpenVPN.Port           --port           TCP/UDP port number (O)
- OpenVPN.AuthUserPass   --auth-user-pass Authenticate with server using
-                                         username/password (O)
- OpenVPN.AskPass        --askpass        Get certificate password from file (O)
- OpenVPN.AuthNoCache    --auth-nocache   Don't cache --askpass or
-                                         --auth-user-pass value (O)
- OpenVPN.TLSRemote      --tls-remote     Accept connections only from a host
-                                         with X509 name or common name equal
-                                         to name parameter (O)
- OpenVPN.TLSAuth        sub-option of --tls-remote (O)
- OpenVPN.TLSAuthDir     sub-option of --tls-remote (O)
- OpenVPN.Cipher         --cipher         Encrypt packets with cipher algorithm
-                                         given as parameter (O)
- OpenVPN.Auth           --auth           Authenticate  packets with HMAC using
-                                         message digest algorithm alg (O)
- OpenVPN.CompLZO        --comp-lzo       Use  fast  LZO compression. Value can
-                                         be "yes", "no", or "adaptive". Default
-                                         is adaptive (O)
- OpenVPN.RemoteCertTls  --remote-cert-tls Require that peer certificate was
-                                          signed based on RFC3280 TLS rules.
-                                          Value is "client" or "server" (O)
-
-VPNC VPN supports following options (see vpnc(8) for details):
- Option name         VPNC config value     Description
- VPNC.IPSec.ID       IPSec ID              your group username (M)
- VPNC.IPSec.Secret   IPSec secret          your group password (cleartext) (O)
- VPNC.Xauth.Username Xauth username        your username (O)
- VPNC.Xauth.Password Xauth password        your password (cleartext) (O)
- VPNC.IKE.Authmode   IKE Authmode          IKE Authentication mode (O)
- VPNC.IKE.DHGroup    IKE DH Group          name of the IKE DH Group (O)
- VPNC.PFS Perfect    Forward Secrecy       Diffie-Hellman group to use for PFS (O)
- VPNC.Domain         Domain                Domain name for authentication (O)
- VPNC.Vendor         Vendor                vendor of your IPSec gateway (O)
- VPNC.LocalPort      Local Port            local ISAKMP port number to use
- VPNC.CiscoPort      Cisco UDP Encapsulation Port  Local UDP port number to use (O)
- VPNC.AppVersion     Application Version   Application Version to report (O)
- VPNC.NATTMode       NAT Traversal Mode    Which NAT-Traversal Method to use (O)
- VPNC.DPDTimeout     DPD idle timeout (our side)  Send DPD packet after timeout (O)
- VPNC.SingleDES      Enable Single DES     enables single DES encryption (O)
- VPNC.NoEncryption   Enable no encryption  enables using no encryption for data traffic (O)
-
-L2TP VPN supports following options (see xl2tpd.conf(5) and pppd(8) for details)
- Option name         xl2tpd config value    Description
- L2TP.User           -                      L2TP user name, asked from the user
-                                            if not set here (O)
- L2TP.Password       -                      L2TP password, asked from the user
-                                            if not set here (O)
- L2TP.BPS            bps                    Max bandwith to use (O)
- L2TP.TXBPS          tx bps                 Max transmit bandwith to use (O)
- L2TP.RXBPS          rx bps                 Max receive bandwith to use (O)
- L2TP.LengthBit      length bit             Use length bit (O)
- L2TP.Challenge      challenge              Use challenge authentication (O)
- L2TP.DefaultRoute   defaultroute           Default route (O)
- L2TP.FlowBit        flow bit               Use seq numbers (O)
- L2TP.TunnelRWS      tunnel rws             Window size (O)
- L2TP.Exclusive      exclusive              Use only one control channel (O)
- L2TP.Redial         redial                 Redial if disconnected (O)
- L2TP.RedialTimeout  redial timeout         Redial timeout (O)
- L2TP.MaxRedials     max redials            How many times to try redial (O)
- L2TP.RequirePAP     require pap            Need pap (O)
- L2TP.RequireCHAP    require chap           Need chap (O)
- L2TP.ReqAuth        require authentication Need auth (O)
- L2TP.AccessControl  access control         Accept only these peers (O)
- L2TP.AuthFile       auth file              Authentication file location (O)
- L2TP.ListenAddr     listen-addr            Listen address (O)
- L2TP.IPsecSaref     ipsec saref            Use IPSec SA (O)
- L2TP.Port           port                   What UDP port is used (O)
-
- Option name         pppd config value      Description
- PPPD.EchoFailure    lcp-echo-failure       Dead peer check count (O)
- PPPD.EchoInterval   lcp-echo-interval      Dead peer check interval (O)
- PPPD.Debug          debug                  Debug level (O)
- PPPD.RefuseEAP      refuse-eap             Deny eap auth (O)
- PPPD.RefusePAP      refuse-pap             Deny pap auth (O)
- PPPD.RefuseCHAP     refuse-chap            Deny chap auth (O)
- PPPD.RefuseMSCHAP   refuse-mschap          Deny mschap auth (O)
- PPPD.RefuseMSCHAP2  refuse-mschapv2        Deny mschapv2 auth (O)
- PPPD.NoBSDComp      nobsdcomp              Disables BSD compression (O)
- PPPD.NoPcomp        nopcomp                Disable protocol compression (O)
- PPPD.UseAccomp      accomp                 Disable address/control compression (O)
- PPPD.NoDeflate      nodeflate              Disable deflate compression (O)
- PPPD.ReqMPPE        require-mppe           Require the use of MPPE (O)
- PPPD.ReqMPPE40      require-mppe-40        Require the use of MPPE 40 bit (O)
- PPPD.ReqMPPE128     require-mppe-128       Require the use of MPPE 128 bit (O)
- PPPD.ReqMPPEStateful mppe-stateful         Allow MPPE to use stateful mode (O)
- PPPD.NoVJ           no-vj-comp             No Van Jacobson compression (O)
-
-
-PPTP VPN supports following options (see pptp(8) and pppd(8) for details)
- Option name         pptp config value    Description
- PPTP.User           -                    PPTP user name, asked from the user
-                                          if not set here (O)
- PPTP.Password       -                    PPTP password, asked from the user
-                                          if not set here (O)
-
- Option name         pppd config value    Description
- PPPD.EchoFailure    lcp-echo-failure     Dead peer check count (O)
- PPPD.EchoInterval   lcp-echo-interval    Dead peer check interval (O)
- PPPD.Debug          debug                Debug level (O)
- PPPD.RefuseEAP      refuse-eap           Deny eap auth (O)
- PPPD.RefusePAP      refuse-pap           Deny pap auth (O)
- PPPD.RefuseCHAP     refuse-chap          Deny chap auth (O)
- PPPD.RefuseMSCHAP   refuse-mschap        Deny mschap auth (O)
- PPPD.RefuseMSCHAP2  refuse-mschapv2      Deny mschapv2 auth (O)
- PPPD.NoBSDComp      nobsdcomp            Disables BSD compression (O)
- PPPD.NoDeflate      nodeflate            Disable deflate compression (O)
- PPPD.RequirMPPE     require-mppe         Require the use of MPPE (O)
- PPPD.RequirMPPE40   require-mppe-40      Require the use of MPPE 40 bit (O)
- PPPD.RequirMPPE128  require-mppe-128     Require the use of MPPE 128 bit (O)
- PPPD.RequirMPPEStateful mppe-stateful    Allow MPPE to use stateful mode (O)
- PPPD.NoVJ           no-vj-comp           No Van Jacobson compression (O)
-
-
-Example
-=======
-
-This is a configuration file for a VPN providing L2TP, OpenVPN and
-OpenConnect services.
-
-
-example@example:[~]$ cat /var/lib/connman/vpn/example.config
-[global]
-Name = Example
-Description = Example VPN configuration
-
-[provider_l2tp]
-Type = L2TP
-Name = Connection to corporate network
-Host = 1.2.3.4
-Domain = corporate.com
-Networks = 10.10.30.0/24
-L2TP.User = username
-
-[provider_openconnect]
-Type = OpenConnect
-Name = Connection to corporate network using Cisco VPN
-Host = 7.6.5.4
-Domain = corporate.com
-Networks = 10.10.20.0/255.255.255.0/10.20.1.5,192.168.99.1/24,2001:db8::1/64
-OpenConnect.ServerCert = 263AFAB4CB2E6621D12E90182008AEF44AEFA031
-OpenConnect.CACert = /etc/certs/certificate.p12
-
-[provider_openvpn]
-Type = OpenVPN
-Name = Connection to corporate network using OpenVPN
-Host = 3.2.5.6
-Domain = my.home.network
-OpenVPN.CACert = /etc/certs/cacert.pem
-OpenVPN.Cert = /etc/certs/cert.pem
-OpenVPN.Key = /etc/certs/cert.key
index f700b7e..3bf883a 100644 (file)
@@ -25,6 +25,7 @@
 #include <config.h>
 #endif
 
+#include <stdio.h>
 #include <glib.h>
 #include <dbus/dbus.h>
 
 
 #define METHOD_CALL_TIMEOUT (300 * 1000)
 
+#ifndef DBUS_INTERFACE_OBJECT_MANAGER
+#define DBUS_INTERFACE_OBJECT_MANAGER DBUS_INTERFACE_DBUS ".ObjectManager"
+#endif
+
 struct GDBusClient {
        int ref_count;
        DBusConnection *dbus_conn;
        char *service_name;
-       char *unique_name;
        char *base_path;
+       guint watch;
+       guint added_watch;
+       guint removed_watch;
        GPtrArray *match_rules;
        DBusPendingCall *pending_call;
        DBusPendingCall *get_objects_call;
@@ -49,6 +56,8 @@ struct GDBusClient {
        void *signal_data;
        GDBusProxyFunction proxy_added;
        GDBusProxyFunction proxy_removed;
+       GDBusClientFunction ready;
+       void *ready_data;
        GDBusPropertyFunction property_changed;
        void *user_data;
        GList *proxy_list;
@@ -60,7 +69,7 @@ struct GDBusProxy {
        char *obj_path;
        char *interface;
        GHashTable *prop_list;
-       char *match_rule;
+       guint watch;
        GDBusPropertyFunction prop_func;
        void *prop_data;
        GDBusProxyFunction removed_func;
@@ -100,12 +109,7 @@ static gboolean modify_match(DBusConnection *conn, const char *member,
        dbus_message_append_args(msg, DBUS_TYPE_STRING, &rule,
                                                DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(conn, msg, &call, -1) == FALSE) {
-               dbus_message_unref(msg);
-               return FALSE;
-       }
-
-       if (call == NULL) {
+       if (g_dbus_send_message_with_reply(conn, msg, &call, -1) == FALSE) {
                dbus_message_unref(msg);
                return FALSE;
        }
@@ -319,7 +323,7 @@ static void get_all_properties(GDBusProxy *proxy)
        dbus_message_append_args(msg, DBUS_TYPE_STRING, &proxy->interface,
                                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+       if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
                                                        &call, -1) == FALSE) {
                dbus_message_unref(msg);
                return;
@@ -351,6 +355,52 @@ static GDBusProxy *proxy_lookup(GDBusClient *client, const char *path,
        return NULL;
 }
 
+static gboolean properties_changed(DBusConnection *conn, DBusMessage *msg,
+                                                       void *user_data)
+{
+       GDBusProxy *proxy = user_data;
+       GDBusClient *client = proxy->client;
+       DBusMessageIter iter, entry;
+       const char *interface;
+
+       if (dbus_message_iter_init(msg, &iter) == FALSE)
+               return TRUE;
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+               return TRUE;
+
+       dbus_message_iter_get_basic(&iter, &interface);
+       dbus_message_iter_next(&iter);
+
+       update_properties(proxy, &iter, TRUE);
+
+       dbus_message_iter_next(&iter);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
+               return TRUE;
+
+       dbus_message_iter_recurse(&iter, &entry);
+
+       while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
+               const char *name;
+
+               dbus_message_iter_get_basic(&entry, &name);
+
+               g_hash_table_remove(proxy->prop_list, name);
+
+               if (proxy->prop_func)
+                       proxy->prop_func(proxy, name, NULL, proxy->prop_data);
+
+               if (client->property_changed)
+                       client->property_changed(proxy, name, NULL,
+                                                       client->user_data);
+
+               dbus_message_iter_next(&entry);
+       }
+
+       return TRUE;
+}
+
 static GDBusProxy *proxy_new(GDBusClient *client, const char *path,
                                                const char *interface)
 {
@@ -366,14 +416,12 @@ static GDBusProxy *proxy_new(GDBusClient *client, const char *path,
 
        proxy->prop_list = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                        NULL, prop_entry_free);
-
-       proxy->match_rule = g_strdup_printf("type='signal',"
-                               "sender='%s',path='%s',interface='%s',"
-                               "member='PropertiesChanged',arg0='%s'",
-                               client->service_name, proxy->obj_path,
-                               DBUS_INTERFACE_PROPERTIES, proxy->interface);
-
-       modify_match(client->dbus_conn, "AddMatch", proxy->match_rule);
+       proxy->watch = g_dbus_add_properties_watch(client->dbus_conn,
+                                                       client->service_name,
+                                                       proxy->obj_path,
+                                                       proxy->interface,
+                                                       properties_changed,
+                                                       proxy, NULL);
 
        return g_dbus_proxy_ref(proxy);
 }
@@ -388,11 +436,7 @@ static void proxy_free(gpointer data)
                if (client->proxy_removed)
                        client->proxy_removed(proxy, client->user_data);
 
-               modify_match(client->dbus_conn, "RemoveMatch",
-                                                       proxy->match_rule);
-
-               g_free(proxy->match_rule);
-               proxy->match_rule = NULL;
+               g_dbus_remove_watch(client->dbus_conn, proxy->watch);
 
                g_hash_table_remove_all(proxy->prop_list);
 
@@ -575,7 +619,7 @@ gboolean g_dbus_proxy_refresh_property(GDBusProxy *proxy, const char *name)
                                                        &proxy->interface);
        dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
 
-       if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+       if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
                                                        &call, -1) == FALSE) {
                dbus_message_unref(msg);
                refresh_property_free(data);
@@ -668,7 +712,94 @@ gboolean g_dbus_proxy_set_property_basic(GDBusProxy *proxy,
        dbus_message_iter_append_basic(&variant, type, value);
        dbus_message_iter_close_container(&iter, &variant);
 
-       if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+       if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
+                                                       &call, -1) == FALSE) {
+               dbus_message_unref(msg);
+               g_free(data);
+               return FALSE;
+       }
+
+       dbus_pending_call_set_notify(call, set_property_reply, data, g_free);
+       dbus_pending_call_unref(call);
+
+       dbus_message_unref(msg);
+
+       return TRUE;
+}
+
+gboolean g_dbus_proxy_set_property_array(GDBusProxy *proxy,
+                               const char *name, int type, const void *value,
+                               size_t size, GDBusResultFunction function,
+                               void *user_data, GDBusDestroyFunction destroy)
+{
+       struct set_property_data *data;
+       GDBusClient *client;
+       DBusMessage *msg;
+       DBusMessageIter iter, variant, array;
+       DBusPendingCall *call;
+       char array_sig[3];
+       char type_sig[2];
+
+       if (!proxy || !name || !value)
+               return FALSE;
+
+       if (!dbus_type_is_basic(type))
+               return FALSE;
+
+       client = proxy->client;
+       if (!client)
+               return FALSE;
+
+       data = g_try_new0(struct set_property_data, 1);
+       if (!data)
+               return FALSE;
+
+       data->function = function;
+       data->user_data = user_data;
+       data->destroy = destroy;
+
+       msg = dbus_message_new_method_call(client->service_name,
+                                               proxy->obj_path,
+                                               DBUS_INTERFACE_PROPERTIES,
+                                               "Set");
+       if (!msg) {
+               g_free(data);
+               return FALSE;
+       }
+
+       array_sig[0] = DBUS_TYPE_ARRAY;
+       array_sig[1] = (char) type;
+       array_sig[2] = '\0';
+
+       type_sig[0] = (char) type;
+       type_sig[1] = '\0';
+
+       dbus_message_iter_init_append(msg, &iter);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
+                                                       &proxy->interface);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
+
+       dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+                                                       array_sig, &variant);
+
+       dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
+                                                       type_sig, &array);
+
+       if (dbus_type_is_fixed(type))
+               dbus_message_iter_append_fixed_array(&array, type, &value,
+                                                                       size);
+       else if (type == DBUS_TYPE_STRING || type == DBUS_TYPE_OBJECT_PATH) {
+               const char **str = (const char **) value;
+               size_t i;
+
+               for (i = 0; i < size; i++)
+                       dbus_message_iter_append_basic(&array, type, &str[i]);
+       }
+
+       dbus_message_iter_close_container(&variant, &array);
+       dbus_message_iter_close_container(&iter, &variant);
+
+       if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
                                                        &call, -1) == FALSE) {
                dbus_message_unref(msg);
                g_free(data);
@@ -742,7 +873,7 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
                setup(&iter, data->user_data);
        }
 
-       if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+       if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
                                        &call, METHOD_CALL_TIMEOUT) == FALSE) {
                dbus_message_unref(msg);
                g_free(data);
@@ -793,64 +924,6 @@ static void refresh_properties(GDBusClient *client)
         }
 }
 
-static void properties_changed(GDBusClient *client, const char *path,
-                                                       DBusMessage *msg)
-{
-       GDBusProxy *proxy = NULL;
-       DBusMessageIter iter, entry;
-       const char *interface;
-       GList *list;
-
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
-               return;
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
-               return;
-
-       dbus_message_iter_get_basic(&iter, &interface);
-       dbus_message_iter_next(&iter);
-
-       for (list = g_list_first(client->proxy_list); list;
-                                               list = g_list_next(list)) {
-               GDBusProxy *data = list->data;
-
-               if (g_str_equal(data->interface, interface) == TRUE &&
-                               g_str_equal(data->obj_path, path) == TRUE) {
-                       proxy = data;
-                       break;
-               }
-       }
-
-       if (proxy == NULL)
-               return;
-
-       update_properties(proxy, &iter, TRUE);
-
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
-               return;
-
-       dbus_message_iter_recurse(&iter, &entry);
-
-       while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
-               const char *name;
-
-               dbus_message_iter_get_basic(&entry, &name);
-
-               g_hash_table_remove(proxy->prop_list, name);
-
-               if (proxy->prop_func)
-                       proxy->prop_func(proxy, name, NULL, proxy->prop_data);
-
-               if (client->property_changed)
-                       client->property_changed(proxy, name, NULL,
-                                                       client->user_data);
-
-               dbus_message_iter_next(&entry);
-       }
-}
-
 static void parse_properties(GDBusClient *client, const char *path,
                                const char *interface, DBusMessageIter *iter)
 {
@@ -908,16 +981,18 @@ static void parse_interfaces(GDBusClient *client, const char *path,
        }
 }
 
-static void interfaces_added(GDBusClient *client, DBusMessage *msg)
+static gboolean interfaces_added(DBusConnection *conn, DBusMessage *msg,
+                                                       void *user_data)
 {
+       GDBusClient *client = user_data;
        DBusMessageIter iter;
        const char *path;
 
        if (dbus_message_iter_init(msg, &iter) == FALSE)
-               return;
+               return TRUE;
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
-               return;
+               return TRUE;
 
        dbus_message_iter_get_basic(&iter, &path);
        dbus_message_iter_next(&iter);
@@ -927,24 +1002,28 @@ static void interfaces_added(GDBusClient *client, DBusMessage *msg)
        parse_interfaces(client, path, &iter);
 
        g_dbus_client_unref(client);
+
+       return TRUE;
 }
 
-static void interfaces_removed(GDBusClient *client, DBusMessage *msg)
+static gboolean interfaces_removed(DBusConnection *conn, DBusMessage *msg,
+                                                       void *user_data)
 {
+       GDBusClient *client = user_data;
        DBusMessageIter iter, entry;
        const char *path;
 
        if (dbus_message_iter_init(msg, &iter) == FALSE)
-               return;
+               return TRUE;
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
-               return;
+               return TRUE;
 
        dbus_message_iter_get_basic(&iter, &path);
        dbus_message_iter_next(&iter);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
-               return;
+               return TRUE;
 
        dbus_message_iter_recurse(&iter, &entry);
 
@@ -959,6 +1038,8 @@ static void interfaces_removed(GDBusClient *client, DBusMessage *msg)
        }
 
        g_dbus_client_unref(client);
+
+       return TRUE;
 }
 
 static void parse_managed_objects(GDBusClient *client, DBusMessage *msg)
@@ -990,6 +1071,9 @@ static void parse_managed_objects(GDBusClient *client, DBusMessage *msg)
 
                dbus_message_iter_next(&dict);
        }
+
+       if (client->ready)
+               client->ready(client, client->ready_data);
 }
 
 static void get_managed_objects_reply(DBusPendingCall *call, void *user_data)
@@ -1038,7 +1122,7 @@ static void get_managed_objects(GDBusClient *client)
 
        dbus_message_append_args(msg, DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+       if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
                                &client->get_objects_call, -1) == FALSE) {
                dbus_message_unref(msg);
                return;
@@ -1051,74 +1135,36 @@ static void get_managed_objects(GDBusClient *client)
        dbus_message_unref(msg);
 }
 
-static void get_name_owner_reply(DBusPendingCall *call, void *user_data)
+static void service_connect(DBusConnection *conn, void *user_data)
 {
        GDBusClient *client = user_data;
-       DBusMessage *reply = dbus_pending_call_steal_reply(call);
-       DBusError error;
-       const char *name;
 
        g_dbus_client_ref(client);
 
-       dbus_error_init(&error);
-
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
-               dbus_error_free(&error);
-               goto done;
-       }
-
-       if (dbus_message_get_args(reply, NULL, DBUS_TYPE_STRING, &name,
-                                               DBUS_TYPE_INVALID) == FALSE)
-               goto done;
-
-       if (client->unique_name == NULL) {
-               client->unique_name = g_strdup(name);
-
-               if (client->connect_func)
-                       client->connect_func(client->dbus_conn,
-                                                       client->connect_data);
-
-               get_managed_objects(client);
-       }
-
-done:
-       dbus_message_unref(reply);
+       if (client->connect_func)
+               client->connect_func(conn, client->connect_data);
 
-       dbus_pending_call_unref(client->pending_call);
-       client->pending_call = NULL;
+       get_managed_objects(client);
 
        g_dbus_client_unref(client);
 }
 
-static void get_name_owner(GDBusClient *client, const char *name)
+static void service_disconnect(DBusConnection *conn, void *user_data)
 {
-       DBusMessage *msg;
-
-       msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
-                                       DBUS_INTERFACE_DBUS, "GetNameOwner");
-       if (msg == NULL)
-               return;
-
-       dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,
-                                               DBUS_TYPE_INVALID);
-
-       if (dbus_connection_send_with_reply(client->dbus_conn, msg,
-                                       &client->pending_call, -1) == FALSE) {
-               dbus_message_unref(msg);
-               return;
-       }
+       GDBusClient *client = user_data;
 
-       dbus_pending_call_set_notify(client->pending_call,
-                                       get_name_owner_reply, client, NULL);
+       g_list_free_full(client->proxy_list, proxy_free);
+       client->proxy_list = NULL;
 
-       dbus_message_unref(msg);
+       if (client->disconn_func)
+               client->disconn_func(conn, client->disconn_data);
 }
 
 static DBusHandlerResult message_filter(DBusConnection *connection,
                                        DBusMessage *message, void *user_data)
 {
        GDBusClient *client = user_data;
-       const char *sender;
+       const char *sender, *path, *interface;
 
        if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_SIGNAL)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -1127,93 +1173,17 @@ static DBusHandlerResult message_filter(DBusConnection *connection,
        if (sender == NULL)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       if (g_str_equal(sender, DBUS_SERVICE_DBUS) == TRUE) {
-               const char *interface, *member;
-               const char *name, *old, *new;
-
-               interface = dbus_message_get_interface(message);
-
-               if (g_str_equal(interface, DBUS_INTERFACE_DBUS) == FALSE)
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-               member = dbus_message_get_member(message);
-
-               if (g_str_equal(member, "NameOwnerChanged") == FALSE)
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-               if (dbus_message_get_args(message, NULL,
-                                               DBUS_TYPE_STRING, &name,
-                                               DBUS_TYPE_STRING, &old,
-                                               DBUS_TYPE_STRING, &new,
-                                               DBUS_TYPE_INVALID) == FALSE)
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-               if (g_str_equal(name, client->service_name) == FALSE)
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-               if (*new == '\0' && client->unique_name != NULL &&
-                               g_str_equal(old, client->unique_name) == TRUE) {
-                       if (client->disconn_func)
-                               client->disconn_func(client->dbus_conn,
-                                                       client->disconn_data);
-
-                       g_free(client->unique_name);
-                       client->unique_name = NULL;
-               } else if (*old == '\0' && client->unique_name == NULL) {
-                       client->unique_name = g_strdup(new);
-
-                       if (client->connect_func)
-                               client->connect_func(client->dbus_conn,
-                                                       client->connect_data);
-
-                       get_managed_objects(client);
-               }
+       path = dbus_message_get_path(message);
+       interface = dbus_message_get_interface(message);
 
+       if (g_str_has_prefix(path, client->base_path) == FALSE)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-       }
 
-       if (client->unique_name == NULL)
+       if (g_str_equal(interface, DBUS_INTERFACE_PROPERTIES) == TRUE)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       if (g_str_equal(sender, client->unique_name) == TRUE) {
-               const char *path, *interface, *member;
-
-               path = dbus_message_get_path(message);
-               interface = dbus_message_get_interface(message);
-               member = dbus_message_get_member(message);
-
-               if (g_str_equal(path, "/") == TRUE) {
-                       if (g_str_equal(interface, DBUS_INTERFACE_DBUS
-                                               ".ObjectManager") == FALSE)
-                               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-                       if (g_str_equal(member, "InterfacesAdded") == TRUE) {
-                               interfaces_added(client, message);
-                               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-                       }
-
-                       if (g_str_equal(member, "InterfacesRemoved") == TRUE) {
-                               interfaces_removed(client, message);
-                               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-                       }
-
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-               }
-
-               if (g_str_has_prefix(path, client->base_path) == FALSE)
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-               if (g_str_equal(interface, DBUS_INTERFACE_PROPERTIES) == TRUE) {
-                       if (g_str_equal(member, "PropertiesChanged") == TRUE)
-                               properties_changed(client, path, message);
-
-                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-               }
-
-               if (client->signal_func)
-                       client->signal_func(client->dbus_conn,
-                                       message, client->signal_data);
-       }
+       if (client->signal_func)
+               client->signal_func(connection, message, client->signal_data);
 
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
@@ -1241,26 +1211,25 @@ GDBusClient *g_dbus_client_new(DBusConnection *connection,
        client->service_name = g_strdup(service);
        client->base_path = g_strdup(path);
 
-       get_name_owner(client, client->service_name);
-
-       client->match_rules = g_ptr_array_sized_new(4);
+       client->match_rules = g_ptr_array_sized_new(1);
        g_ptr_array_set_free_func(client->match_rules, g_free);
 
-       g_ptr_array_add(client->match_rules, g_strdup_printf("type='signal',"
-                               "sender='%s',path='%s',interface='%s',"
-                               "member='NameOwnerChanged',arg0='%s'",
-                               DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
-                               DBUS_INTERFACE_DBUS, client->service_name));
-       g_ptr_array_add(client->match_rules, g_strdup_printf("type='signal',"
-                               "sender='%s',"
-                               "path='/',interface='%s.ObjectManager',"
-                               "member='InterfacesAdded'",
-                               client->service_name, DBUS_INTERFACE_DBUS));
-       g_ptr_array_add(client->match_rules, g_strdup_printf("type='signal',"
-                               "sender='%s',"
-                               "path='/',interface='%s.ObjectManager',"
-                               "member='InterfacesRemoved'",
-                               client->service_name, DBUS_INTERFACE_DBUS));
+       client->watch = g_dbus_add_service_watch(connection, service,
+                                               service_connect,
+                                               service_disconnect,
+                                               client, NULL);
+       client->added_watch = g_dbus_add_signal_watch(connection, service,
+                                               "/",
+                                               DBUS_INTERFACE_OBJECT_MANAGER,
+                                               "InterfacesAdded",
+                                               interfaces_added,
+                                               client, NULL);
+       client->removed_watch = g_dbus_add_signal_watch(connection, service,
+                                               "/",
+                                               DBUS_INTERFACE_OBJECT_MANAGER,
+                                               "InterfacesRemoved",
+                                               interfaces_removed,
+                                               client, NULL);
        g_ptr_array_add(client->match_rules, g_strdup_printf("type='signal',"
                                "sender='%s',path_namespace='%s'",
                                client->service_name, client->base_path));
@@ -1318,10 +1287,13 @@ void g_dbus_client_unref(GDBusClient *client)
        if (client->disconn_func)
                client->disconn_func(client->dbus_conn, client->disconn_data);
 
+       g_dbus_remove_watch(client->dbus_conn, client->watch);
+       g_dbus_remove_watch(client->dbus_conn, client->added_watch);
+       g_dbus_remove_watch(client->dbus_conn, client->removed_watch);
+
        dbus_connection_unref(client->dbus_conn);
 
        g_free(client->service_name);
-       g_free(client->unique_name);
        g_free(client->base_path);
 
        g_free(client);
@@ -1363,6 +1335,18 @@ gboolean g_dbus_client_set_signal_watch(GDBusClient *client,
        return TRUE;
 }
 
+gboolean g_dbus_client_set_ready_watch(GDBusClient *client,
+                               GDBusClientFunction ready, void *user_data)
+{
+       if (client == NULL)
+               return FALSE;
+
+       client->ready = ready;
+       client->ready_data = user_data;
+
+       return TRUE;
+}
+
 gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client,
                                        GDBusProxyFunction proxy_added,
                                        GDBusProxyFunction proxy_removed,
index 8b13393..551c306 100644 (file)
@@ -250,6 +250,9 @@ DBusMessage *g_dbus_create_reply_valist(DBusMessage *message,
                                                int type, va_list args);
 
 gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message);
+gboolean g_dbus_send_message_with_reply(DBusConnection *connection,
+                                       DBusMessage *message,
+                                       DBusPendingCall **call, int timeout);
 gboolean g_dbus_send_error(DBusConnection *connection, DBusMessage *message,
                                const char *name, const char *format, ...)
                                         __attribute__((format(printf, 4, 5)));
@@ -326,6 +329,11 @@ gboolean g_dbus_proxy_set_property_basic(GDBusProxy *proxy,
                                GDBusResultFunction function, void *user_data,
                                GDBusDestroyFunction destroy);
 
+gboolean g_dbus_proxy_set_property_array(GDBusProxy *proxy,
+                               const char *name, int type, const void *value,
+                               size_t size, GDBusResultFunction function,
+                               void *user_data, GDBusDestroyFunction destroy);
+
 typedef void (* GDBusSetupFunction) (DBusMessageIter *iter, void *user_data);
 typedef void (* GDBusReturnFunction) (DBusMessage *message, void *user_data);
 
@@ -334,6 +342,7 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
                                GDBusReturnFunction function, void *user_data,
                                GDBusDestroyFunction destroy);
 
+typedef void (* GDBusClientFunction) (GDBusClient *client, void *user_data);
 typedef void (* GDBusProxyFunction) (GDBusProxy *proxy, void *user_data);
 typedef void (* GDBusPropertyFunction) (GDBusProxy *proxy, const char *name,
                                        DBusMessageIter *iter, void *user_data);
@@ -356,7 +365,8 @@ gboolean g_dbus_client_set_disconnect_watch(GDBusClient *client,
                                GDBusWatchFunction function, void *user_data);
 gboolean g_dbus_client_set_signal_watch(GDBusClient *client,
                                GDBusMessageFunction function, void *user_data);
-
+gboolean g_dbus_client_set_ready_watch(GDBusClient *client,
+                               GDBusClientFunction ready, void *user_data);
 gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client,
                                        GDBusProxyFunction proxy_added,
                                        GDBusProxyFunction proxy_removed,
index 099b67f..435fb93 100644 (file)
@@ -30,8 +30,6 @@
 
 #include "gdbus.h"
 
-#define DISPATCH_TIMEOUT  0
-
 #define info(fmt...)
 #define error(fmt...)
 #define debug(fmt...)
@@ -70,8 +68,6 @@ static gboolean message_dispatch(void *data)
 {
        DBusConnection *conn = data;
 
-       dbus_connection_ref(conn);
-
        /* Dispatch messages */
        while (dbus_connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS);
 
@@ -84,7 +80,7 @@ static inline void queue_dispatch(DBusConnection *conn,
                                                DBusDispatchStatus status)
 {
        if (status == DBUS_DISPATCH_DATA_REMAINS)
-               g_timeout_add(DISPATCH_TIMEOUT, message_dispatch, conn);
+               g_idle_add(message_dispatch, dbus_connection_ref(conn));
 }
 
 static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
@@ -92,9 +88,6 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
        struct watch_info *info = data;
        unsigned int flags = 0;
        DBusDispatchStatus status;
-       DBusConnection *conn;
-
-       conn = dbus_connection_ref(info->conn);
 
        if (cond & G_IO_IN)  flags |= DBUS_WATCH_READABLE;
        if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE;
@@ -103,10 +96,8 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
 
        dbus_watch_handle(info->watch, flags);
 
-       status = dbus_connection_get_dispatch_status(conn);
-       queue_dispatch(conn, status);
-
-       dbus_connection_unref(conn);
+       status = dbus_connection_get_dispatch_status(info->conn);
+       queue_dispatch(info->conn, status);
 
        return TRUE;
 }
index 2f8ef45..13cf9a9 100644 (file)
@@ -86,6 +86,7 @@ struct property_data {
 
 static int global_flags = 0;
 static struct generic_data *root;
+static GSList *pending = NULL;
 
 static gboolean process_changes(gpointer user_data);
 static void process_properties_from_interface(struct generic_data *data,
@@ -271,8 +272,7 @@ static DBusHandlerResult process_message(DBusConnection *connection,
        if (reply == NULL)
                return DBUS_HANDLER_RESULT_NEED_MEMORY;
 
-       dbus_connection_send(connection, reply, NULL);
-       dbus_message_unref(reply);
+       g_dbus_send_message(connection, reply);
 
        return DBUS_HANDLER_RESULT_HANDLED;
 }
@@ -312,19 +312,14 @@ void g_dbus_pending_error_valist(DBusConnection *connection,
 
        for (list = pending_security; list; list = list->next) {
                struct security_data *secdata = list->data;
-               DBusMessage *reply;
 
                if (secdata->pending != pending)
                        continue;
 
                pending_security = g_slist_remove(pending_security, secdata);
 
-               reply = g_dbus_create_error_valist(secdata->message,
+               g_dbus_send_error_valist(connection, secdata->message,
                                                        name, format, args);
-               if (reply != NULL) {
-                       dbus_connection_send(connection, reply, NULL);
-                       dbus_message_unref(reply);
-               }
 
                dbus_message_unref(secdata->message);
                g_free(secdata);
@@ -469,18 +464,13 @@ void g_dbus_pending_property_error_valist(GDBusPendingReply id,
                                        va_list args)
 {
        struct property_data *propdata;
-       DBusMessage *reply;
 
        propdata = remove_pending_property_data(id);
        if (propdata == NULL)
                return;
 
-       reply = g_dbus_create_error_valist(propdata->message, name, format,
-                                                                       args);
-       if (reply != NULL) {
-               dbus_connection_send(propdata->conn, reply, NULL);
-               dbus_message_unref(reply);
-       }
+       g_dbus_send_error_valist(propdata->conn, propdata->message, name,
+                                                               format, args);
 
        dbus_message_unref(propdata->message);
        g_free(propdata);
@@ -599,7 +589,9 @@ static void emit_interfaces_added(struct generic_data *data)
 
        dbus_message_iter_close_container(&iter, &array);
 
-       g_dbus_send_message(data->conn, signal);
+       /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
+       dbus_connection_send(data->conn, signal, NULL);
+       dbus_message_unref(signal);
 }
 
 static struct interface_data *find_interface(GSList *interfaces,
@@ -640,6 +632,16 @@ static gboolean g_dbus_args_have_signature(const GDBusArgInfo *args,
        return TRUE;
 }
 
+static void add_pending(struct generic_data *data)
+{
+       if (data->process_id > 0)
+               return;
+
+       data->process_id = g_idle_add(process_changes, data);
+
+       pending = g_slist_append(pending, data);
+}
+
 static gboolean remove_interface(struct generic_data *data, const char *name)
 {
        struct interface_data *iface;
@@ -677,10 +679,7 @@ static gboolean remove_interface(struct generic_data *data, const char *name)
        data->removed = g_slist_prepend(data->removed, iface->name);
        g_free(iface);
 
-       if (data->process_id > 0)
-               return TRUE;
-
-       data->process_id = g_idle_add(process_changes, data);
+       add_pending(data);
 
        return TRUE;
 }
@@ -976,14 +975,26 @@ static void emit_interfaces_removed(struct generic_data *data)
 
        dbus_message_iter_close_container(&iter, &array);
 
-       g_dbus_send_message(data->conn, signal);
+       /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
+       dbus_connection_send(data->conn, signal, NULL);
+       dbus_message_unref(signal);
+}
+
+static void remove_pending(struct generic_data *data)
+{
+       if (data->process_id > 0) {
+               g_source_remove(data->process_id);
+               data->process_id = 0;
+       }
+
+       pending = g_slist_remove(pending, data);
 }
 
 static gboolean process_changes(gpointer user_data)
 {
        struct generic_data *data = user_data;
 
-       data->process_id = 0;
+       remove_pending(data);
 
        if (data->added != NULL)
                emit_interfaces_added(data);
@@ -995,6 +1006,8 @@ static gboolean process_changes(gpointer user_data)
        if (data->removed != NULL)
                emit_interfaces_removed(data);
 
+       data->process_id = 0;
+
        return FALSE;
 }
 
@@ -1008,6 +1021,7 @@ static void generic_unregister(DBusConnection *connection, void *user_data)
 
        if (data->process_id > 0) {
                g_source_remove(data->process_id);
+               data->process_id = 0;
                process_changes(data);
        }
 
@@ -1211,10 +1225,8 @@ done:
                return TRUE;
 
        data->added = g_slist_append(data->added, iface);
-       if (data->process_id > 0)
-               return TRUE;
 
-       data->process_id = g_idle_add(process_changes, data);
+       add_pending(data);
 
        return TRUE;
 }
@@ -1241,6 +1253,8 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
 
        if (!dbus_connection_register_object_path(connection, path,
                                                &generic_table, data)) {
+               dbus_connection_unref(data->conn);
+               g_free(data->path);
                g_free(data->introspect);
                g_free(data);
                return NULL;
@@ -1319,45 +1333,6 @@ static gboolean check_signal(DBusConnection *conn, const char *path,
        return FALSE;
 }
 
-static dbus_bool_t emit_signal_valist(DBusConnection *conn,
-                                               const char *path,
-                                               const char *interface,
-                                               const char *name,
-                                               int first,
-                                               va_list var_args)
-{
-       DBusMessage *signal;
-       dbus_bool_t ret;
-       const GDBusArgInfo *args;
-
-       if (!check_signal(conn, path, interface, name, &args))
-               return FALSE;
-
-       signal = dbus_message_new_signal(path, interface, name);
-       if (signal == NULL) {
-               error("Unable to allocate new %s.%s signal", interface,  name);
-               return FALSE;
-       }
-
-       ret = dbus_message_append_args_valist(signal, first, var_args);
-       if (!ret)
-               goto fail;
-
-       if (g_dbus_args_have_signature(args, signal) == FALSE) {
-               error("%s.%s: got unexpected signature '%s'", interface, name,
-                                       dbus_message_get_signature(signal));
-               ret = FALSE;
-               goto fail;
-       }
-
-       ret = dbus_connection_send(conn, signal, NULL);
-
-fail:
-       dbus_message_unref(signal);
-
-       return ret;
-}
-
 gboolean g_dbus_register_interface(DBusConnection *connection,
                                        const char *path, const char *name,
                                        const GDBusMethodTable *methods,
@@ -1494,6 +1469,21 @@ DBusMessage *g_dbus_create_reply(DBusMessage *message, int type, ...)
        return reply;
 }
 
+static void g_dbus_flush(DBusConnection *connection)
+{
+       GSList *l;
+
+       for (l = pending; l;) {
+               struct generic_data *data = l->data;
+
+               l = l->next;
+               if (data->conn != connection)
+                       continue;
+
+               process_changes(data);
+       }
+}
+
 gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message)
 {
        dbus_bool_t result = FALSE;
@@ -1510,6 +1500,9 @@ gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message)
                        goto out;
        }
 
+       /* Flush pending signal to guarantee message order */
+       g_dbus_flush(connection);
+
        result = dbus_connection_send(connection, message, NULL);
 
 out:
@@ -1518,6 +1511,26 @@ out:
        return result;
 }
 
+gboolean g_dbus_send_message_with_reply(DBusConnection *connection,
+                                       DBusMessage *message,
+                                       DBusPendingCall **call, int timeout)
+{
+       dbus_bool_t ret;
+
+       /* Flush pending signal to guarantee message order */
+       g_dbus_flush(connection);
+
+       ret = dbus_connection_send_with_reply(connection, message, call,
+                                                               timeout);
+
+       if (ret == TRUE && call != NULL && *call == NULL) {
+               error("Unable to send message (passing fd blocked?)");
+               return FALSE;
+       }
+
+       return ret;
+}
+
 gboolean g_dbus_send_error_valist(DBusConnection *connection,
                                        DBusMessage *message, const char *name,
                                        const char *format, va_list args)
@@ -1591,7 +1604,7 @@ gboolean g_dbus_emit_signal(DBusConnection *connection,
 
        va_start(args, type);
 
-       result = emit_signal_valist(connection, path, interface,
+       result = g_dbus_emit_signal_valist(connection, path, interface,
                                                        name, type, args);
 
        va_end(args);
@@ -1603,8 +1616,36 @@ gboolean g_dbus_emit_signal_valist(DBusConnection *connection,
                                const char *path, const char *interface,
                                const char *name, int type, va_list args)
 {
-       return emit_signal_valist(connection, path, interface,
-                                                       name, type, args);
+       DBusMessage *signal;
+       dbus_bool_t ret;
+       const GDBusArgInfo *args_info;
+
+       if (!check_signal(connection, path, interface, name, &args_info))
+               return FALSE;
+
+       signal = dbus_message_new_signal(path, interface, name);
+       if (signal == NULL) {
+               error("Unable to allocate new %s.%s signal", interface,  name);
+               return FALSE;
+       }
+
+       ret = dbus_message_append_args_valist(signal, type, args);
+       if (!ret)
+               goto fail;
+
+       if (g_dbus_args_have_signature(args_info, signal) == FALSE) {
+               error("%s.%s: got unexpected signature '%s'", interface, name,
+                                       dbus_message_get_signature(signal));
+               ret = FALSE;
+               goto fail;
+       }
+
+       return g_dbus_send_message(connection, signal);
+
+fail:
+       dbus_message_unref(signal);
+
+       return ret;
 }
 
 static void process_properties_from_interface(struct generic_data *data,
@@ -1615,6 +1656,8 @@ static void process_properties_from_interface(struct generic_data *data,
        DBusMessageIter iter, dict, array;
        GSList *invalidated;
 
+       data->pending_prop = FALSE;
+
        if (iface->pending_prop == NULL)
                return;
 
@@ -1664,10 +1707,12 @@ static void process_properties_from_interface(struct generic_data *data,
        g_slist_free(invalidated);
        dbus_message_iter_close_container(&iter, &array);
 
-       g_dbus_send_message(data->conn, signal);
-
        g_slist_free(iface->pending_prop);
        iface->pending_prop = NULL;
+
+       /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
+       dbus_connection_send(data->conn, signal, NULL);
+       dbus_message_unref(signal);
 }
 
 static void process_property_changes(struct generic_data *data)
@@ -1679,8 +1724,6 @@ static void process_property_changes(struct generic_data *data)
 
                process_properties_from_interface(data, iface);
        }
-
-       data->pending_prop = FALSE;
 }
 
 void g_dbus_emit_property_changed(DBusConnection *connection,
@@ -1723,10 +1766,7 @@ void g_dbus_emit_property_changed(DBusConnection *connection,
        iface->pending_prop = g_slist_prepend(iface->pending_prop,
                                                (void *) property);
 
-       if (!data->process_id) {
-               data->process_id = g_idle_add(process_changes, data);
-               return;
-       }
+       add_pending(data);
 }
 
 gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,
index 9e4f994..0f99f4f 100644 (file)
@@ -281,6 +281,11 @@ static void filter_data_free(struct filter_data *data)
 {
        GSList *l;
 
+       /* Remove filter if there are no listeners left for the connection */
+       if (filter_data_find(data->connection) == NULL)
+               dbus_connection_remove_filter(data->connection, message_filter,
+                                                                       NULL);
+
        for (l = data->callbacks; l != NULL; l = l->next)
                g_free(l->data);
 
@@ -360,8 +365,6 @@ static void service_data_free(struct service_data *data)
 static gboolean filter_data_remove_callback(struct filter_data *data,
                                                struct filter_callback *cb)
 {
-       DBusConnection *connection;
-
        data->callbacks = g_slist_remove(data->callbacks, cb);
        data->processed = g_slist_remove(data->processed, cb);
 
@@ -385,16 +388,8 @@ static gboolean filter_data_remove_callback(struct filter_data *data,
        if (data->registered && !remove_match(data))
                return FALSE;
 
-       connection = dbus_connection_ref(data->connection);
        listeners = g_slist_remove(listeners, data);
-
-       /* Remove filter if there are no listeners left for the connection */
-       if (filter_data_find(connection) == NULL)
-               dbus_connection_remove_filter(connection, message_filter,
-                                               NULL);
-
        filter_data_free(data);
-       dbus_connection_unref(connection);
 
        return TRUE;
 }
@@ -524,6 +519,8 @@ static DBusHandlerResult message_filter(DBusConnection *connection,
        dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, DBUS_TYPE_INVALID);
 
        /* Sender is always the owner */
+       if (sender == NULL)
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
        for (current = listeners; current != NULL; current = current->next) {
                data = current->data;
@@ -563,6 +560,9 @@ static DBusHandlerResult message_filter(DBusConnection *connection,
                                                                current);
        }
 
+       if (delete_listener == NULL)
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
        for (current = delete_listener; current != NULL;
                                        current = delete_listener->next) {
                GSList *l = current->data;
@@ -581,11 +581,6 @@ static DBusHandlerResult message_filter(DBusConnection *connection,
 
        g_slist_free(delete_listener);
 
-       /* Remove filter if there are no listeners left for the connection */
-       if (filter_data_find(connection) == NULL)
-               dbus_connection_remove_filter(connection, message_filter,
-                                               NULL);
-
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
@@ -593,12 +588,16 @@ static gboolean update_service(void *user_data)
 {
        struct service_data *data = user_data;
        struct filter_callback *cb = data->callback;
+       DBusConnection *conn;
 
        update_name_cache(data->name, data->owner);
+       conn = dbus_connection_ref(data->conn);
+       service_data_free(data);
+
        if (cb->conn_func)
-               cb->conn_func(data->conn, cb->user_data);
+               cb->conn_func(conn, cb->user_data);
 
-       service_data_free(data);
+       dbus_connection_unref(conn);
 
        return FALSE;
 }
@@ -810,6 +809,4 @@ void g_dbus_remove_all_watches(DBusConnection *connection)
                listeners = g_slist_remove(listeners, data);
                filter_data_call_and_free(data);
        }
-
-       dbus_connection_remove_filter(connection, message_filter, NULL);
 }
index bbd00c4..2b7202a 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DHCP client library with GLib integration
  *
- *  Copyright (C) 2009-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2009-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -32,6 +32,7 @@
 #include <sys/ioctl.h>
 #include <arpa/inet.h>
 #include <sys/time.h>
+#include <resolv.h>
 
 #include <netpacket/packet.h>
 #include <netinet/if_ether.h>
@@ -61,6 +62,7 @@ typedef enum _listen_mode {
 
 typedef enum _dhcp_client_state {
        INIT_SELECTING,
+       REBOOTING,
        REQUESTING,
        BOUND,
        RENEWING,
@@ -77,6 +79,7 @@ typedef enum _dhcp_client_state {
        RENEW,
        REBIND,
        RELEASE,
+       DECLINE,
 } ClientState;
 
 struct _GDHCPClient {
@@ -98,8 +101,10 @@ struct _GDHCPClient {
        uint8_t ack_retry_times;
        uint8_t conflicts;
        guint timeout;
+       guint t1_timeout;
+       guint t2_timeout;
+       guint lease_timeout;
        guint listener_watch;
-       GIOChannel *listener_channel;
        GList *require_list;
        GList *request_list;
        GHashTable *code_value_hash;
@@ -134,6 +139,8 @@ struct _GDHCPClient {
        gpointer release_data;
        GDHCPClientEventFunc confirm_cb;
        gpointer confirm_data;
+       GDHCPClientEventFunc decline_cb;
+       gpointer decline_data;
        char *last_address;
        unsigned char *duid;
        int duid_len;
@@ -144,10 +151,9 @@ struct _GDHCPClient {
        uint32_t T1, T2;
        struct in6_addr ia_na;
        struct in6_addr ia_ta;
-       time_t last_renew;
-       time_t last_rebind;
-       time_t expire;
-       gboolean retransmit;
+       time_t last_request;
+       uint32_t expire;
+       bool retransmit;
        struct timeval start_time;
 };
 
@@ -156,7 +162,7 @@ static inline void debug(GDHCPClient *client, const char *format, ...)
        char str[256];
        va_list ap;
 
-       if (client->debug_func == NULL)
+       if (!client->debug_func)
                return;
 
        va_start(ap, format);
@@ -251,7 +257,7 @@ static void copy_option(uint8_t *buf, uint16_t code, uint16_t len,
        buf[1] = code & 0xff;
        buf[2] = len >> 8;
        buf[3] = len & 0xff;
-       if (len > 0 && msg != NULL)
+       if (len > 0 && msg)
                memcpy(&buf[4], msg, len);
 }
 
@@ -268,6 +274,25 @@ static int32_t get_time_diff(struct timeval *tv)
        return hsec;
 }
 
+static void remove_timeouts(GDHCPClient *dhcp_client)
+{
+
+       if (dhcp_client->timeout > 0)
+               g_source_remove(dhcp_client->timeout);
+       if (dhcp_client->t1_timeout > 0)
+               g_source_remove(dhcp_client->t1_timeout);
+       if (dhcp_client->t2_timeout > 0)
+               g_source_remove(dhcp_client->t2_timeout);
+       if (dhcp_client->lease_timeout > 0)
+               g_source_remove(dhcp_client->lease_timeout);
+
+       dhcp_client->timeout = 0;
+       dhcp_client->t1_timeout = 0;
+       dhcp_client->t2_timeout = 0;
+       dhcp_client->lease_timeout = 0;
+
+}
+
 static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
                                struct dhcpv6_packet *packet,
                                unsigned char *buf, int max_buf,
@@ -275,6 +300,7 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
 {
        GList *list;
        uint16_t code, value;
+       bool added;
        int32_t diff;
        int len;
 
@@ -283,10 +309,11 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
 
        for (list = dhcp_client->request_list; list; list = list->next) {
                code = (uint16_t) GPOINTER_TO_INT(list->data);
+               added = false;
 
                switch (code) {
                case G_DHCPV6_CLIENTID:
-                       if (dhcp_client->duid == NULL)
+                       if (!dhcp_client->duid)
                                return;
 
                        len = 2 + 2 + dhcp_client->duid_len;
@@ -299,11 +326,12 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
                        copy_option(*ptr_buf, G_DHCPV6_CLIENTID,
                                dhcp_client->duid_len, dhcp_client->duid);
                        (*ptr_buf) += len;
+                       added = true;
                        break;
 
                case G_DHCPV6_SERVERID:
-                       if (dhcp_client->server_duid == NULL)
-                               return;
+                       if (!dhcp_client->server_duid)
+                               break;
 
                        len = 2 + 2 + dhcp_client->server_duid_len;
                        if ((*ptr_buf + len) > (buf + max_buf)) {
@@ -316,6 +344,7 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
                                dhcp_client->server_duid_len,
                                dhcp_client->server_duid);
                        (*ptr_buf) += len;
+                       added = true;
                        break;
 
                case G_DHCPV6_RAPID_COMMIT:
@@ -328,13 +357,14 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
 
                        copy_option(*ptr_buf, G_DHCPV6_RAPID_COMMIT, 0, 0);
                        (*ptr_buf) += len;
+                       added = true;
                        break;
 
                case G_DHCPV6_ORO:
                        break;
 
                case G_DHCPV6_ELAPSED_TIME:
-                       if (dhcp_client->retransmit == FALSE) {
+                       if (!dhcp_client->retransmit) {
                                /*
                                 * Initial message, elapsed time is 0.
                                 */
@@ -356,6 +386,7 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
                        copy_option(*ptr_buf, G_DHCPV6_ELAPSED_TIME,
                                2, (uint8_t *)&value);
                        (*ptr_buf) += len;
+                       added = true;
                        break;
 
                case G_DHCPV6_DNS_SERVERS:
@@ -370,6 +401,9 @@ static void add_dhcpv6_request_options(GDHCPClient *dhcp_client,
                default:
                        break;
                }
+
+               if (added)
+                       debug(dhcp_client, "option %d len %d added", code, len);
        }
 }
 
@@ -426,63 +460,37 @@ static int send_discover(GDHCPClient *dhcp_client, uint32_t requested)
                                        MAC_BCAST_ADDR, dhcp_client->ifindex);
 }
 
-static int send_select(GDHCPClient *dhcp_client)
+static int send_request(GDHCPClient *dhcp_client)
 {
        struct dhcp_packet packet;
-
-       debug(dhcp_client, "sending DHCP select request");
+       debug(dhcp_client, "sending DHCP request");
 
        init_packet(dhcp_client, &packet, DHCPREQUEST);
 
        packet.xid = dhcp_client->xid;
        packet.secs = dhcp_attempt_secs(dhcp_client);
 
-       dhcp_add_option_uint32(&packet, DHCP_REQUESTED_IP,
-                                               dhcp_client->requested_ip);
-       dhcp_add_option_uint32(&packet, DHCP_SERVER_ID,
-                                               dhcp_client->server_ip);
-
-       add_request_options(dhcp_client, &packet);
-
-       add_send_options(dhcp_client, &packet);
-
-       return dhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT,
-                                       INADDR_BROADCAST, SERVER_PORT,
-                                       MAC_BCAST_ADDR, dhcp_client->ifindex);
-}
-
-static int send_renew(GDHCPClient *dhcp_client)
-{
-       struct dhcp_packet packet;
+       if (dhcp_client->state == REQUESTING || dhcp_client->state == REBOOTING)
+               dhcp_add_option_uint32(&packet, DHCP_REQUESTED_IP,
+                               dhcp_client->requested_ip);
 
-       debug(dhcp_client, "sending DHCP renew request");
+       if (dhcp_client->state == REQUESTING)
+               dhcp_add_option_uint32(&packet, DHCP_SERVER_ID,
+                               dhcp_client->server_ip);
 
-       init_packet(dhcp_client , &packet, DHCPREQUEST);
-       packet.xid = dhcp_client->xid;
-       packet.ciaddr = htonl(dhcp_client->requested_ip);
+       dhcp_add_option_uint16(&packet, DHCP_MAX_SIZE, 576);
 
        add_request_options(dhcp_client, &packet);
 
        add_send_options(dhcp_client, &packet);
 
-       return dhcp_send_kernel_packet(&packet,
-               dhcp_client->requested_ip, CLIENT_PORT,
-               dhcp_client->server_ip, SERVER_PORT);
-}
-
-static int send_rebound(GDHCPClient *dhcp_client)
-{
-       struct dhcp_packet packet;
-
-       debug(dhcp_client, "sending DHCP rebound request");
+       if (dhcp_client->state == RENEWING) {
+               packet.ciaddr = htonl(dhcp_client->requested_ip);
 
-       init_packet(dhcp_client , &packet, DHCPREQUEST);
-       packet.xid = dhcp_client->xid;
-       packet.ciaddr = htonl(dhcp_client->requested_ip);
-
-       add_request_options(dhcp_client, &packet);
-
-       add_send_options(dhcp_client, &packet);
+               return dhcp_send_kernel_packet(&packet,
+                               dhcp_client->requested_ip, CLIENT_PORT,
+                               dhcp_client->server_ip, SERVER_PORT);
+       }
 
        return dhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT,
                                        INADDR_BROADCAST, SERVER_PORT,
@@ -562,9 +570,7 @@ static gboolean send_announce_packet(gpointer dhcp_data)
                                dhcp_client->requested_ip,
                                dhcp_client->ifindex);
 
-       if (dhcp_client->timeout > 0)
-               g_source_remove(dhcp_client->timeout);
-       dhcp_client->timeout = 0;
+       remove_timeouts(dhcp_client);
 
        if (dhcp_client->state == IPV4LL_DEFEND) {
                dhcp_client->timeout =
@@ -618,18 +624,18 @@ done:
 
 void g_dhcpv6_client_set_retransmit(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL)
+       if (!dhcp_client)
                return;
 
-       dhcp_client->retransmit = TRUE;
+       dhcp_client->retransmit = true;
 }
 
 void g_dhcpv6_client_clear_retransmit(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL)
+       if (!dhcp_client)
                return;
 
-       dhcp_client->retransmit = FALSE;
+       dhcp_client->retransmit = false;
 }
 
 int g_dhcpv6_create_duid(GDHCPDuidType duid_type, int index, int type,
@@ -641,7 +647,7 @@ int g_dhcpv6_create_duid(GDHCPDuidType duid_type, int index, int type,
        case G_DHCPV6_DUID_LLT:
                *duid_len = 2 + 2 + 4 + ETH_ALEN;
                *duid = g_try_malloc(*duid_len);
-               if (*duid == NULL)
+               if (!*duid)
                        return -ENOMEM;
 
                (*duid)[0] = 0;
@@ -660,7 +666,7 @@ int g_dhcpv6_create_duid(GDHCPDuidType duid_type, int index, int type,
        case G_DHCPV6_DUID_LL:
                *duid_len = 2 + 2 + ETH_ALEN;
                *duid = g_try_malloc(*duid_len);
-               if (*duid == NULL)
+               if (!*duid)
                        return -ENOMEM;
 
                (*duid)[0] = 0;
@@ -674,10 +680,21 @@ int g_dhcpv6_create_duid(GDHCPDuidType duid_type, int index, int type,
        return 0;
 }
 
+static gchar *convert_to_hex(unsigned char *buf, int len)
+{
+       gchar *ret = g_try_malloc(len * 2 + 1);
+       int i;
+
+       for (i = 0; ret && i < len; i++)
+               g_snprintf(ret + i * 2, 3, "%02x", buf[i]);
+
+       return ret;
+}
+
 int g_dhcpv6_client_set_duid(GDHCPClient *dhcp_client, unsigned char *duid,
                        int duid_len)
 {
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
                return -EINVAL;
 
        g_free(dhcp_client->duid);
@@ -685,17 +702,95 @@ int g_dhcpv6_client_set_duid(GDHCPClient *dhcp_client, unsigned char *duid,
        dhcp_client->duid = duid;
        dhcp_client->duid_len = duid_len;
 
+       if (dhcp_client->debug_func) {
+               gchar *hex = convert_to_hex(duid, duid_len);
+               debug(dhcp_client, "DUID(%d) %s", duid_len, hex);
+               g_free(hex);
+       }
+
+       return 0;
+}
+
+int g_dhcpv6_client_set_pd(GDHCPClient *dhcp_client, uint32_t *T1,
+                       uint32_t *T2, GSList *prefixes)
+{
+       uint8_t options[1452];
+       unsigned int max_buf = sizeof(options);
+       int len, count = g_slist_length(prefixes);
+
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
+               return -EINVAL;
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_IA_PD);
+
+       memset(options, 0, sizeof(options));
+
+       options[0] = dhcp_client->iaid >> 24;
+       options[1] = dhcp_client->iaid >> 16;
+       options[2] = dhcp_client->iaid >> 8;
+       options[3] = dhcp_client->iaid;
+
+       if (T1) {
+               uint32_t t = htonl(*T1);
+               memcpy(&options[4], &t, 4);
+       }
+
+       if (T2) {
+               uint32_t t = htonl(*T2);
+               memcpy(&options[8], &t, 4);
+       }
+
+       len = 12;
+
+       if (count > 0) {
+               GSList *list;
+
+               for (list = prefixes; list; list = list->next) {
+                       GDHCPIAPrefix *prefix = list->data;
+                       uint8_t sub_option[4+4+1+16];
+
+                       if ((len + 2 + 2 + sizeof(sub_option)) >= max_buf) {
+                               debug(dhcp_client,
+                                       "Too long dhcpv6 message "
+                                       "when writing IA prefix option");
+                               return -EINVAL;
+                       }
+
+                       memset(&sub_option, 0, sizeof(sub_option));
+
+                       /* preferred and validity time are left zero */
+
+                       sub_option[8] = prefix->prefixlen;
+                       memcpy(&sub_option[9], &prefix->prefix, 16);
+
+                       copy_option(&options[len], G_DHCPV6_IA_PREFIX,
+                               sizeof(sub_option), sub_option);
+                       len += 2 + 2 + sizeof(sub_option);
+               }
+       }
+
+       g_dhcpv6_client_set_send(dhcp_client, G_DHCPV6_IA_PD,
+                               options, len);
+
        return 0;
 }
 
 uint32_t g_dhcpv6_client_get_iaid(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
                return 0;
 
        return dhcp_client->iaid;
 }
 
+void g_dhcpv6_client_set_iaid(GDHCPClient *dhcp_client, uint32_t iaid)
+{
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
+               return;
+
+       dhcp_client->iaid = iaid;
+}
+
 void g_dhcpv6_client_create_iaid(GDHCPClient *dhcp_client, int index,
                                unsigned char *iaid)
 {
@@ -710,26 +805,23 @@ void g_dhcpv6_client_create_iaid(GDHCPClient *dhcp_client, int index,
 
 int g_dhcpv6_client_get_timeouts(GDHCPClient *dhcp_client,
                                uint32_t *T1, uint32_t *T2,
-                               time_t *last_renew, time_t *last_rebind,
+                               time_t *started,
                                time_t *expire)
 {
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
                return -EINVAL;
 
-       if (T1 != NULL)
+       if (T1)
                *T1 = dhcp_client->T1;
 
-       if (T2 != NULL)
+       if (T2)
                *T2 = dhcp_client->T2;
 
-       if (last_renew != NULL)
-               *last_renew = dhcp_client->last_renew;
-
-       if (last_rebind != NULL)
-               *last_rebind = dhcp_client->last_rebind;
+       if (started)
+               *started = dhcp_client->last_request;
 
-       if (expire != NULL)
-               *expire = dhcp_client->expire;
+       if (expire)
+               *expire = dhcp_client->last_request + dhcp_client->expire;
 
        return 0;
 }
@@ -747,6 +839,24 @@ static uint8_t *create_iaaddr(GDHCPClient *dhcp_client, uint8_t *buf,
        return buf;
 }
 
+static uint8_t *append_iaaddr(GDHCPClient *dhcp_client, uint8_t *buf,
+                       const char *address)
+{
+       struct in6_addr addr;
+
+       if (inet_pton(AF_INET6, address, &addr) != 1)
+               return NULL;
+
+       buf[0] = 0;
+       buf[1] = G_DHCPV6_IAADDR;
+       buf[2] = 0;
+       buf[3] = 24;
+       memcpy(&buf[4], &addr, 16);
+       memset(&buf[20], 0, 4); /* preferred */
+       memset(&buf[24], 0, 4); /* valid */
+       return &buf[28];
+}
+
 static void put_iaid(GDHCPClient *dhcp_client, int index, uint8_t *buf)
 {
        uint32_t iaid;
@@ -765,7 +875,7 @@ static void put_iaid(GDHCPClient *dhcp_client, int index, uint8_t *buf)
 
 int g_dhcpv6_client_set_ia(GDHCPClient *dhcp_client, int index,
                        int code, uint32_t *T1, uint32_t *T2,
-                       gboolean add_iaaddr, const char *ia_na)
+                       bool add_iaaddr, const char *ia_na)
 {
        if (code == G_DHCPV6_IA_TA) {
                uint8_t ia_options[4];
@@ -789,20 +899,20 @@ int g_dhcpv6_client_set_ia(GDHCPClient *dhcp_client, int index,
                 * if the current address is not set, then we should not send
                 * the address sub-option.
                 */
-               if (add_iaaddr == TRUE && ((ia_na == NULL &&
-                       IN6_IS_ADDR_UNSPECIFIED(&dhcp_client->ia_na) == FALSE)
-                       || (ia_na != NULL &&
+               if (add_iaaddr && ((!ia_na &&
+                       !IN6_IS_ADDR_UNSPECIFIED(&dhcp_client->ia_na))
+                       || (ia_na &&
                                inet_pton(AF_INET6, ia_na, &addr) == 1))) {
 #define IAADDR_LEN (16+4+4)
                        uint8_t ia_options[4+4+4+2+2+IAADDR_LEN];
 
-                       if (ia_na != NULL)
+                       if (ia_na)
                                memcpy(&dhcp_client->ia_na, &addr,
                                                sizeof(struct in6_addr));
 
                        put_iaid(dhcp_client, index, ia_options);
 
-                       if (T1 != NULL) {
+                       if (T1) {
                                ia_options[4] = *T1 >> 24;
                                ia_options[5] = *T1 >> 16;
                                ia_options[6] = *T1 >> 8;
@@ -810,7 +920,7 @@ int g_dhcpv6_client_set_ia(GDHCPClient *dhcp_client, int index,
                        } else
                                memset(&ia_options[4], 0x00, 4);
 
-                       if (T2 != NULL) {
+                       if (T2) {
                                ia_options[8] = *T2 >> 24;
                                ia_options[9] = *T2 >> 16;
                                ia_options[10] = *T2 >> 8;
@@ -841,6 +951,67 @@ int g_dhcpv6_client_set_ia(GDHCPClient *dhcp_client, int index,
        return 0;
 }
 
+int g_dhcpv6_client_set_ias(GDHCPClient *dhcp_client, int index,
+                       int code, uint32_t *T1, uint32_t *T2,
+                       GSList *addresses)
+{
+       GSList *list;
+       uint8_t *ia_options, *pos;
+       int len, count, total_len;
+
+       count = g_slist_length(addresses);
+       if (count == 0)
+               return -EINVAL;
+
+       g_dhcp_client_set_request(dhcp_client, code);
+
+       if (code == G_DHCPV6_IA_TA)
+               len = 4;         /* IAID */
+       else if (code == G_DHCPV6_IA_NA)
+               len = 4 + 4 + 4; /* IAID + T1 + T2 */
+       else
+               return -EINVAL;
+
+       total_len = len + count * (2 + 2 + 16 + 4 + 4);
+       ia_options = g_try_malloc0(total_len);
+       if (!ia_options)
+               return -ENOMEM;
+
+       put_iaid(dhcp_client, index, ia_options);
+
+       pos = &ia_options[len]; /* skip the IA_NA or IA_TA */
+
+       for (list = addresses; list; list = list->next) {
+               pos = append_iaaddr(dhcp_client, pos, list->data);
+               if (!pos)
+                       break;
+       }
+
+       if (code == G_DHCPV6_IA_NA) {
+               if (T1) {
+                       ia_options[4] = *T1 >> 24;
+                       ia_options[5] = *T1 >> 16;
+                       ia_options[6] = *T1 >> 8;
+                       ia_options[7] = *T1;
+               } else
+                       memset(&ia_options[4], 0x00, 4);
+
+               if (T2) {
+                       ia_options[8] = *T2 >> 24;
+                       ia_options[9] = *T2 >> 16;
+                       ia_options[10] = *T2 >> 8;
+                       ia_options[11] = *T2;
+               } else
+                       memset(&ia_options[8], 0x00, 4);
+       }
+
+       g_dhcpv6_client_set_send(dhcp_client, code, ia_options, total_len);
+
+       g_free(ia_options);
+
+       return 0;
+}
+
 int g_dhcpv6_client_set_oro(GDHCPClient *dhcp_client, int args, ...)
 {
        va_list va;
@@ -848,7 +1019,7 @@ int g_dhcpv6_client_set_oro(GDHCPClient *dhcp_client, int args, ...)
        uint8_t *values;
 
        values = g_try_malloc(len);
-       if (values == NULL)
+       if (!values)
                return -ENOMEM;
 
        va_start(va, args);
@@ -879,7 +1050,7 @@ static int send_dhcpv6_msg(GDHCPClient *dhcp_client, int type, char *msg)
 
        init_packet(dhcp_client, packet, type);
 
-       if (dhcp_client->retransmit == FALSE) {
+       if (!dhcp_client->retransmit) {
                dhcp_client->xid = packet->transaction_id[0] << 16 |
                                packet->transaction_id[1] << 8 |
                                packet->transaction_id[2];
@@ -932,6 +1103,11 @@ static int send_dhcpv6_rebind(GDHCPClient *dhcp_client)
        return send_dhcpv6_msg(dhcp_client, DHCPV6_REBIND, "rebind");
 }
 
+static int send_dhcpv6_decline(GDHCPClient *dhcp_client)
+{
+       return send_dhcpv6_msg(dhcp_client, DHCPV6_DECLINE, "decline");
+}
+
 static int send_dhcpv6_release(GDHCPClient *dhcp_client)
 {
        return send_dhcpv6_msg(dhcp_client, DHCPV6_RELEASE, "release");
@@ -967,18 +1143,18 @@ GDHCPClient *g_dhcp_client_new(GDHCPType type,
        }
 
        dhcp_client = g_try_new0(GDHCPClient, 1);
-       if (dhcp_client == NULL) {
+       if (!dhcp_client) {
                *error = G_DHCP_CLIENT_ERROR_NOMEM;
                return NULL;
        }
 
        dhcp_client->interface = get_interface_name(ifindex);
-       if (dhcp_client->interface == NULL) {
+       if (!dhcp_client->interface) {
                *error = G_DHCP_CLIENT_ERROR_INTERFACE_UNAVAILABLE;
                goto error;
        }
 
-       if (interface_is_up(ifindex) == FALSE) {
+       if (!interface_is_up(ifindex)) {
                *error = G_DHCP_CLIENT_ERROR_INTERFACE_DOWN;
                goto error;
        }
@@ -986,7 +1162,6 @@ GDHCPClient *g_dhcp_client_new(GDHCPType type,
        get_interface_mac_address(ifindex, dhcp_client->mac_address);
 
        dhcp_client->listener_sockfd = -1;
-       dhcp_client->listener_channel = NULL;
        dhcp_client->listen_mode = L_NONE;
        dhcp_client->ref_count = 1;
        dhcp_client->type = type;
@@ -1008,7 +1183,7 @@ GDHCPClient *g_dhcp_client_new(GDHCPType type,
        dhcp_client->require_list = NULL;
        dhcp_client->duid = NULL;
        dhcp_client->duid_len = 0;
-       dhcp_client->last_renew = dhcp_client->last_rebind = time(NULL);
+       dhcp_client->last_request = time(NULL);
        dhcp_client->expire = 0;
 
        *error = G_DHCP_CLIENT_ERROR_NONE;
@@ -1076,7 +1251,7 @@ static int dhcp_l2_socket(int ifindex)
 
        fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_IP));
        if (fd < 0)
-               return fd;
+               return -errno;
 
        if (SERVER_PORT == 67 && CLIENT_PORT == 68)
                /* Use only if standard ports are in use */
@@ -1089,31 +1264,32 @@ static int dhcp_l2_socket(int ifindex)
        sock.sll_ifindex = ifindex;
 
        if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) != 0) {
+               int err = -errno;
                close(fd);
-               return -errno;
+               return err;
        }
 
        return fd;
 }
 
-static gboolean sanity_check(struct ip_udp_dhcp_packet *packet, int bytes)
+static bool sanity_check(struct ip_udp_dhcp_packet *packet, int bytes)
 {
        if (packet->ip.protocol != IPPROTO_UDP)
-               return FALSE;
+               return false;
 
        if (packet->ip.version != IPVERSION)
-               return FALSE;
+               return false;
 
        if (packet->ip.ihl != sizeof(packet->ip) >> 2)
-               return FALSE;
+               return false;
 
        if (packet->udp.dest != htons(CLIENT_PORT))
-               return FALSE;
+               return false;
 
        if (ntohs(packet->udp.len) != (uint16_t)(bytes - sizeof(packet->ip)))
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static int dhcp_recv_l2_packet(struct dhcp_packet *dhcp_pkt, int fd)
@@ -1138,7 +1314,7 @@ static int dhcp_recv_l2_packet(struct dhcp_packet *dhcp_pkt, int fd)
        /* ignore any extra garbage bytes */
        bytes = ntohs(packet.ip.tot_len);
 
-       if (sanity_check(&packet, bytes) == FALSE)
+       if (!sanity_check(&packet, bytes))
                return -1;
 
        check = packet.ip.check;
@@ -1169,13 +1345,9 @@ static void ipv4ll_start(GDHCPClient *dhcp_client)
        guint timeout;
        int seed;
 
-       if (dhcp_client->timeout > 0) {
-               g_source_remove(dhcp_client->timeout);
-               dhcp_client->timeout = 0;
-       }
+       remove_timeouts(dhcp_client);
 
        switch_listening_mode(dhcp_client, L_NONE);
-       dhcp_client->type = G_DHCP_IPV4LL;
        dhcp_client->retry_times = 0;
        dhcp_client->requested_ip = 0;
 
@@ -1199,8 +1371,7 @@ static void ipv4ll_stop(GDHCPClient *dhcp_client)
 
        switch_listening_mode(dhcp_client, L_NONE);
 
-       if (dhcp_client->timeout > 0)
-               g_source_remove(dhcp_client->timeout);
+       remove_timeouts(dhcp_client);
 
        if (dhcp_client->listener_watch > 0) {
                g_source_remove(dhcp_client->listener_watch);
@@ -1260,7 +1431,7 @@ static int ipv4ll_recv_arp_packet(GDHCPClient *dhcp_client)
        if (dhcp_client->state == IPV4LL_DEFEND) {
                if (!source_conflict)
                        return 0;
-               else if (dhcp_client->ipv4ll_lost_cb != NULL)
+               else if (dhcp_client->ipv4ll_lost_cb)
                        dhcp_client->ipv4ll_lost_cb(dhcp_client,
                                                dhcp_client->ipv4ll_lost_data);
        }
@@ -1281,42 +1452,42 @@ static int ipv4ll_recv_arp_packet(GDHCPClient *dhcp_client)
         * to wait RATE_LIMIT_INTERVAL before retrying,
         * but we just report failure.
         */
-       else if (dhcp_client->no_lease_cb != NULL)
+       else if (dhcp_client->no_lease_cb)
                        dhcp_client->no_lease_cb(dhcp_client,
                                                dhcp_client->no_lease_data);
 
        return 0;
 }
 
-static gboolean check_package_owner(GDHCPClient *dhcp_client, gpointer pkt)
+static bool check_package_owner(GDHCPClient *dhcp_client, gpointer pkt)
 {
        if (dhcp_client->type == G_DHCP_IPV6) {
                struct dhcpv6_packet *packet6 = pkt;
                uint32_t xid;
 
-               if (packet6 == NULL)
-                       return FALSE;
+               if (!packet6)
+                       return false;
 
                xid = packet6->transaction_id[0] << 16 |
                        packet6->transaction_id[1] << 8 |
                        packet6->transaction_id[2];
 
                if (xid != dhcp_client->xid)
-                       return FALSE;
+                       return false;
        } else {
                struct dhcp_packet *packet = pkt;
 
                if (packet->xid != dhcp_client->xid)
-                       return FALSE;
+                       return false;
 
                if (packet->hlen != 6)
-                       return FALSE;
+                       return false;
 
                if (memcmp(packet->chaddr, dhcp_client->mac_address, 6))
-                       return FALSE;
+                       return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static void start_request(GDHCPClient *dhcp_client);
@@ -1353,7 +1524,6 @@ static int switch_listening_mode(GDHCPClient *dhcp_client,
        if (dhcp_client->listen_mode != L_NONE) {
                if (dhcp_client->listener_watch > 0)
                        g_source_remove(dhcp_client->listener_watch);
-               dhcp_client->listener_channel = NULL;
                dhcp_client->listen_mode = L_NONE;
                dhcp_client->listener_sockfd = -1;
                dhcp_client->listener_watch = 0;
@@ -1382,7 +1552,7 @@ static int switch_listening_mode(GDHCPClient *dhcp_client,
                return -EIO;
 
        listener_channel = g_io_channel_unix_new(listener_sockfd);
-       if (listener_channel == NULL) {
+       if (!listener_channel) {
                /* Failed to create listener channel */
                close(listener_sockfd);
                return -EIO;
@@ -1390,7 +1560,6 @@ static int switch_listening_mode(GDHCPClient *dhcp_client,
 
        dhcp_client->listen_mode = listen_mode;
        dhcp_client->listener_sockfd = listener_sockfd;
-       dhcp_client->listener_channel = listener_channel;
 
        g_io_channel_set_close_on_unref(listener_channel, TRUE);
        dhcp_client->listener_watch =
@@ -1398,7 +1567,7 @@ static int switch_listening_mode(GDHCPClient *dhcp_client,
                                G_IO_IN | G_IO_NVAL | G_IO_ERR | G_IO_HUP,
                                                listener_event, dhcp_client,
                                                                NULL);
-       g_io_channel_unref(dhcp_client->listener_channel);
+       g_io_channel_unref(listener_channel);
 
        return 0;
 }
@@ -1409,9 +1578,9 @@ static void start_request(GDHCPClient *dhcp_client)
                                        dhcp_client->retry_times);
 
        if (dhcp_client->retry_times == REQUEST_RETRIES) {
-               dhcp_client->state = INIT_SELECTING;
-               ipv4ll_start(dhcp_client);
-
+               if (dhcp_client->no_lease_cb)
+                       dhcp_client->no_lease_cb(dhcp_client,
+                                               dhcp_client->no_lease_data);
                return;
        }
 
@@ -1420,7 +1589,7 @@ static void start_request(GDHCPClient *dhcp_client)
                switch_listening_mode(dhcp_client, L2);
        }
 
-       send_select(dhcp_client);
+       send_request(dhcp_client);
 
        dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
                                                        REQUEST_TIMEOUT,
@@ -1435,7 +1604,7 @@ static uint32_t get_lease(struct dhcp_packet *packet)
        uint32_t lease_seconds;
 
        option = dhcp_get_option(packet, DHCP_LEASE_TIME);
-       if (option == NULL)
+       if (!option)
                return 3600;
 
        lease_seconds = get_be32(option);
@@ -1451,10 +1620,7 @@ static void restart_dhcp(GDHCPClient *dhcp_client, int retry_times)
 {
        debug(dhcp_client, "restart DHCP (retries %d)", retry_times);
 
-       if (dhcp_client->timeout > 0) {
-               g_source_remove(dhcp_client->timeout);
-               dhcp_client->timeout = 0;
-       }
+       remove_timeouts(dhcp_client);
 
        dhcp_client->retry_times = retry_times;
        dhcp_client->requested_ip = 0;
@@ -1464,78 +1630,103 @@ static void restart_dhcp(GDHCPClient *dhcp_client, int retry_times)
        g_dhcp_client_start(dhcp_client, dhcp_client->last_address);
 }
 
-static gboolean start_rebound_timeout(gpointer user_data)
+static gboolean start_expire(gpointer user_data)
 {
        GDHCPClient *dhcp_client = user_data;
 
-       debug(dhcp_client, "start rebound timeout");
+       debug(dhcp_client, "lease expired");
 
-       switch_listening_mode(dhcp_client, L2);
+       /*remove all timeouts if they are set*/
+       remove_timeouts(dhcp_client);
 
-       dhcp_client->lease_seconds >>= 1;
+       restart_dhcp(dhcp_client, 0);
 
-       /* We need to have enough time to receive ACK package*/
-       if (dhcp_client->lease_seconds <= 6) {
+       /* ip need to be cleared */
+       if (dhcp_client->lease_lost_cb)
+               dhcp_client->lease_lost_cb(dhcp_client,
+                               dhcp_client->lease_lost_data);
 
-               /* ip need to be cleared */
-               if (dhcp_client->lease_lost_cb != NULL)
-                       dhcp_client->lease_lost_cb(dhcp_client,
-                                       dhcp_client->lease_lost_data);
+       return false;
+}
 
-               restart_dhcp(dhcp_client, 0);
-       } else {
-               send_rebound(dhcp_client);
+static gboolean continue_rebound(gpointer user_data)
+{
+       GDHCPClient *dhcp_client = user_data;
 
-               dhcp_client->timeout =
-                               g_timeout_add_seconds_full(G_PRIORITY_HIGH,
-                                               dhcp_client->lease_seconds >> 1,
-                                                       start_rebound_timeout,
-                                                               dhcp_client,
-                                                               NULL);
+       switch_listening_mode(dhcp_client, L2);
+       send_request(dhcp_client);
+
+       if (dhcp_client->t2_timeout> 0)
+               g_source_remove(dhcp_client->t2_timeout);
+
+       /*recalculate remaining rebind time*/
+       dhcp_client->T2 >>= 1;
+       if (dhcp_client->T2 > 60) {
+               dhcp_client->t2_timeout =
+                       g_timeout_add_full(G_PRIORITY_HIGH,
+                                       dhcp_client->T2 * 1000 + (rand() % 2000) - 1000,
+                                       continue_rebound,
+                                       dhcp_client,
+                                       NULL);
        }
 
        return FALSE;
 }
 
-static void start_rebound(GDHCPClient *dhcp_client)
+static gboolean start_rebound(gpointer user_data)
 {
-       debug(dhcp_client, "start rebound");
+       GDHCPClient *dhcp_client = user_data;
 
+       /*remove renew timer*/
+       if (dhcp_client->t1_timeout > 0)
+               g_source_remove(dhcp_client->t1_timeout);
+
+       debug(dhcp_client, "start rebound");
        dhcp_client->state = REBINDING;
 
-       dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
-                                               dhcp_client->lease_seconds >> 1,
-                                                       start_rebound_timeout,
-                                                               dhcp_client,
-                                                               NULL);
+       /*calculate total rebind time*/
+       dhcp_client->T2 = dhcp_client->expire - dhcp_client->T2;
+
+       /*send the first rebound and reschedule*/
+       continue_rebound(user_data);
+
+       return FALSE;
 }
 
-static gboolean start_renew_timeout(gpointer user_data)
+static gboolean continue_renew (gpointer user_data)
 {
        GDHCPClient *dhcp_client = user_data;
 
-       debug(dhcp_client, "start renew timeout");
+       switch_listening_mode(dhcp_client, L3);
+       send_request(dhcp_client);
 
-       dhcp_client->state = RENEWING;
+       if (dhcp_client->t1_timeout > 0)
+               g_source_remove(dhcp_client->t1_timeout);
 
-       dhcp_client->lease_seconds >>= 1;
+       dhcp_client->T1 >>= 1;
 
-       switch_listening_mode(dhcp_client, L3);
-       if (dhcp_client->lease_seconds <= 60)
-               start_rebound(dhcp_client);
-       else {
-               send_renew(dhcp_client);
+       if (dhcp_client->T1 > 60) {
+               dhcp_client->t1_timeout = g_timeout_add_full(G_PRIORITY_HIGH,
+                               dhcp_client->T1 * 1000 + (rand() % 2000) - 1000,
+                               continue_renew,
+                               dhcp_client,
+                               NULL);
+       }
 
-               if (dhcp_client->timeout > 0)
-                       g_source_remove(dhcp_client->timeout);
+       return FALSE;
+}
+static gboolean start_renew(gpointer user_data)
+{
+       GDHCPClient *dhcp_client = user_data;
 
-               dhcp_client->timeout =
-                               g_timeout_add_seconds_full(G_PRIORITY_HIGH,
-                                               dhcp_client->lease_seconds >> 1,
-                                                       start_renew_timeout,
-                                                               dhcp_client,
-                                                               NULL);
-       }
+       debug(dhcp_client, "start renew");
+       dhcp_client->state = RENEWING;
+
+       /*calculate total renew period*/
+       dhcp_client->T1 = dhcp_client->T2 - dhcp_client->T1;
+
+       /*send first renew and reschedule for half the remaining time.*/
+       continue_renew(user_data);
 
        return FALSE;
 }
@@ -1546,12 +1737,30 @@ static void start_bound(GDHCPClient *dhcp_client)
 
        dhcp_client->state = BOUND;
 
-       if (dhcp_client->timeout > 0)
-               g_source_remove(dhcp_client->timeout);
+       remove_timeouts(dhcp_client);
 
-       dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
-                                       dhcp_client->lease_seconds >> 1,
-                                       start_renew_timeout, dhcp_client,
+       /*
+        *TODO: T1 and T2 should be set through options instead of
+        * defaults as they are here.
+        */
+
+       dhcp_client->T1 = dhcp_client->lease_seconds >> 1;
+       dhcp_client->T2 = dhcp_client->lease_seconds * 0.875;
+       dhcp_client->expire = dhcp_client->lease_seconds;
+
+       dhcp_client->t1_timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
+                                       dhcp_client->T1,
+                                       start_renew, dhcp_client,
+                                                       NULL);
+
+       dhcp_client->t2_timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
+                                       dhcp_client->T2,
+                                       start_rebound, dhcp_client,
+                                                       NULL);
+
+       dhcp_client->lease_timeout= g_timeout_add_seconds_full(G_PRIORITY_HIGH,
+                                       dhcp_client->expire,
+                                       start_expire, dhcp_client,
                                                        NULL);
 }
 
@@ -1561,10 +1770,14 @@ static gboolean restart_dhcp_timeout(gpointer user_data)
 
        debug(dhcp_client, "restart DHCP timeout");
 
-       dhcp_client->ack_retry_times++;
-
-       restart_dhcp(dhcp_client, dhcp_client->ack_retry_times);
-
+       if (dhcp_client->state == REBOOTING) {
+               g_free(dhcp_client->last_address);
+               dhcp_client->last_address = NULL;
+               restart_dhcp(dhcp_client, 0);
+       } else {
+               dhcp_client->ack_retry_times++;
+               restart_dhcp(dhcp_client, dhcp_client->ack_retry_times);
+       }
        return FALSE;
 }
 
@@ -1606,7 +1819,7 @@ static char *malloc_option_value_string(uint8_t *option, GDHCPOptionType type)
        upper_length = len_of_option_as_string[type] *
                        ((unsigned)len / (unsigned)optlen);
        dest = ret = g_malloc(upper_length + 1);
-       if (ret == NULL)
+       if (!ret)
                return NULL;
 
        while (len >= optlen) {
@@ -1647,13 +1860,13 @@ static GList *get_option_value_list(char *value, GDHCPOptionType type)
        char *pos = value;
        GList *list = NULL;
 
-       if (pos == NULL)
+       if (!pos)
                return NULL;
 
        if (type == OPTION_STRING)
                return g_list_append(list, g_strdup(value));
 
-       while ((pos = strchr(pos, ' ')) != NULL) {
+       while ((pos = strchr(pos, ' '))) {
                *pos = '\0';
 
                list = g_list_append(list, g_strdup(value));
@@ -1677,6 +1890,33 @@ static inline uint16_t get_uint16(unsigned char *value)
        return value[0] << 8 | value[1];
 }
 
+static GList *add_prefix(GDHCPClient *dhcp_client, GList *list,
+                       struct in6_addr *addr,
+                       unsigned char prefixlen, uint32_t preferred,
+                       uint32_t valid)
+{
+       GDHCPIAPrefix *ia_prefix;
+
+       ia_prefix = g_try_new(GDHCPIAPrefix, 1);
+       if (!ia_prefix)
+               return list;
+
+       if (dhcp_client->debug_func) {
+               char addr_str[INET6_ADDRSTRLEN + 1];
+               inet_ntop(AF_INET6, addr, addr_str, INET6_ADDRSTRLEN);
+               debug(dhcp_client, "prefix %s/%d preferred %u valid %u",
+                       addr_str, prefixlen, preferred, valid);
+       }
+
+       memcpy(&ia_prefix->prefix, addr, sizeof(struct in6_addr));
+       ia_prefix->prefixlen = prefixlen;
+       ia_prefix->preferred = preferred;
+       ia_prefix->valid = valid;
+       ia_prefix->expire = time(NULL) + valid;
+
+       return g_list_prepend(list, ia_prefix);
+}
+
 static GList *get_addresses(GDHCPClient *dhcp_client,
                                int code, int len,
                                unsigned char *value,
@@ -1686,23 +1926,26 @@ static GList *get_addresses(GDHCPClient *dhcp_client,
        struct in6_addr addr;
        uint32_t iaid, T1 = 0, T2 = 0, preferred = 0, valid = 0;
        uint16_t option_len, option_code, st = 0, max_len;
-       int addr_count = 0, i, pos;
+       int addr_count = 0, prefix_count = 0, i, pos;
+       unsigned char prefixlen;
+       unsigned int shortest_valid = 0;
        uint8_t *option;
        char *str;
 
-       if (value == NULL || len < 4)
+       if (!value || len < 4)
                return NULL;
 
        iaid = get_uint32(&value[0]);
        if (dhcp_client->iaid != iaid)
                return NULL;
 
-       if (code == G_DHCPV6_IA_NA) {
+       if (code == G_DHCPV6_IA_NA || code == G_DHCPV6_IA_PD) {
                T1 = get_uint32(&value[4]);
                T2 = get_uint32(&value[8]);
 
                if (T1 > T2)
-                       /* RFC 3315, 22.4 */
+                       /* IA_NA: RFC 3315, 22.4 */
+                       /* IA_PD: RFC 3633, ch 9 */
                        return NULL;
 
                pos = 12;
@@ -1714,6 +1957,8 @@ static GList *get_addresses(GDHCPClient *dhcp_client,
 
        max_len = len - pos;
 
+       debug(dhcp_client, "header %d sub-option max len %d", pos, max_len);
+
        /* We have more sub-options in this packet. */
        do {
                option = dhcpv6_get_sub_option(&value[pos], max_len,
@@ -1722,10 +1967,10 @@ static GList *get_addresses(GDHCPClient *dhcp_client,
                debug(dhcp_client, "pos %d option %p code %d len %d",
                        pos, option, option_code, option_len);
 
-               if (option == NULL)
+               if (!option)
                        break;
 
-               if (pos >= max_len)
+               if (pos >= len)
                        break;
 
                switch (option_code) {
@@ -1752,11 +1997,31 @@ static GList *get_addresses(GDHCPClient *dhcp_client,
 
                        *status = st;
                        break;
+
+               case G_DHCPV6_IA_PREFIX:
+                       i = 0;
+                       preferred = get_uint32(&option[i]);
+                       i += 4;
+                       valid = get_uint32(&option[i]);
+                       i += 4;
+                       prefixlen = option[i];
+                       i += 1;
+                       memcpy(&addr, &option[i], sizeof(addr));
+                       i += sizeof(addr);
+                       if (preferred < valid) {
+                               /* RFC 3633, ch 10 */
+                               list = add_prefix(dhcp_client, list, &addr,
+                                               prefixlen, preferred, valid);
+                               if (shortest_valid > valid)
+                                       shortest_valid = valid;
+                               prefix_count++;
+                       }
+                       break;
                }
 
                pos += 2 + 2 + option_len;
 
-       } while (option != NULL);
+       } while (pos < len);
 
        if (addr_count > 0 && st == 0) {
                /* We only support one address atm */
@@ -1770,7 +2035,7 @@ static GList *get_addresses(GDHCPClient *dhcp_client,
                dhcp_client->T2 = T2;
 
                inet_ntop(AF_INET6, &addr, addr_str, INET6_ADDRSTRLEN);
-               debug(dhcp_client, "count %d addr %s T1 %u T2 %u",
+               debug(dhcp_client, "address count %d addr %s T1 %u T2 %u",
                        addr_count, addr_str, T1, T2);
 
                list = g_list_append(list, g_strdup(addr_str));
@@ -1782,12 +2047,59 @@ static GList *get_addresses(GDHCPClient *dhcp_client,
                        memcpy(&dhcp_client->ia_ta, &addr,
                                                sizeof(struct in6_addr));
 
-               g_dhcpv6_client_set_expire(dhcp_client, valid);
+               if (valid > dhcp_client->expire)
+                       dhcp_client->expire = valid;
        }
 
+       if (prefix_count > 0 && list) {
+               /*
+                * This means we have a list of prefixes to delegate.
+                */
+               list = g_list_reverse(list);
+
+               debug(dhcp_client, "prefix count %d T1 %u T2 %u",
+                       prefix_count, T1, T2);
+
+               dhcp_client->T1 = T1;
+               dhcp_client->T2 = T2;
+
+               dhcp_client->expire = shortest_valid;
+       }
+
+       if (status && *status != 0)
+               debug(dhcp_client, "status %d", *status);
+
        return list;
 }
 
+static GList *get_domains(int maxlen, unsigned char *value)
+
+{
+       GList *list = NULL;
+       int pos = 0;
+       unsigned char *c;
+       char dns_name[NS_MAXDNAME + 1];
+
+       if (!value || maxlen < 3)
+               return NULL;
+
+       while (pos < maxlen) {
+               strncpy(dns_name, (char *)&value[pos], NS_MAXDNAME);
+
+               c = (unsigned char *)dns_name;
+               while (c && *c) {
+                       int jump;
+                       jump = *c;
+                       *c = '.';
+                       c += jump + 1;
+               }
+               list = g_list_prepend(list, g_strdup(&dns_name[1]));
+               pos += (char *)c - dns_name + 1;
+       }
+
+       return g_list_reverse(list);
+}
+
 static GList *get_dhcpv6_option_value_list(GDHCPClient *dhcp_client,
                                        int code, int len,
                                        unsigned char *value,
@@ -1797,7 +2109,7 @@ static GList *get_dhcpv6_option_value_list(GDHCPClient *dhcp_client,
        char *str;
        int i;
 
-       if (value == NULL)
+       if (!value)
                return NULL;
 
        switch (code) {
@@ -1813,11 +2125,11 @@ static GList *get_dhcpv6_option_value_list(GDHCPClient *dhcp_client,
                for (i = 0; i < len; i += 16) {
 
                        str = g_try_malloc0(INET6_ADDRSTRLEN+1);
-                       if (str == NULL)
+                       if (!str)
                                return list;
 
-                       if (inet_ntop(AF_INET6, &value[i], str,
-                                       INET6_ADDRSTRLEN) == NULL)
+                       if (!inet_ntop(AF_INET6, &value[i], str,
+                                       INET6_ADDRSTRLEN))
                                g_free(str);
                        else
                                list = g_list_append(list, str);
@@ -1826,9 +2138,14 @@ static GList *get_dhcpv6_option_value_list(GDHCPClient *dhcp_client,
 
        case G_DHCPV6_IA_NA:            /* RFC 3315, chapter 22.4 */
        case G_DHCPV6_IA_TA:            /* RFC 3315, chapter 22.5 */
+       case G_DHCPV6_IA_PD:            /* RFC 3633, chapter 9 */
                list = get_addresses(dhcp_client, code, len, value, status);
                break;
 
+       case G_DHCPV6_DOMAIN_LIST:
+               list = get_domains(len, value);
+               break;
+
        default:
                break;
        }
@@ -1850,7 +2167,7 @@ static void get_dhcpv6_request(GDHCPClient *dhcp_client,
 
                option = dhcpv6_get_option(packet, pkt_len, code, &option_len,
                                                NULL);
-               if (option == NULL) {
+               if (!option) {
                        g_hash_table_remove(dhcp_client->code_value_hash,
                                                GINT_TO_POINTER((int) code));
                        continue;
@@ -1862,7 +2179,7 @@ static void get_dhcpv6_request(GDHCPClient *dhcp_client,
                debug(dhcp_client, "code %d %p len %d list %p", code, option,
                        option_len, value_list);
 
-               if (value_list == NULL)
+               if (!value_list)
                        g_hash_table_remove(dhcp_client->code_value_hash,
                                                GINT_TO_POINTER((int) code));
                else
@@ -1883,7 +2200,7 @@ static void get_request(GDHCPClient *dhcp_client, struct dhcp_packet *packet)
                code = (uint8_t) GPOINTER_TO_INT(list->data);
 
                option = dhcp_get_option(packet, code);
-               if (option == NULL) {
+               if (!option) {
                        g_hash_table_remove(dhcp_client->code_value_hash,
                                                GINT_TO_POINTER((int) code));
                        continue;
@@ -1892,7 +2209,7 @@ static void get_request(GDHCPClient *dhcp_client, struct dhcp_packet *packet)
                type =  dhcp_get_code_type(code);
 
                option_value = malloc_option_value_string(option, type);
-               if (option_value == NULL)
+               if (!option_value)
                        g_hash_table_remove(dhcp_client->code_value_hash,
                                                GINT_TO_POINTER((int) code));
 
@@ -1900,7 +2217,7 @@ static void get_request(GDHCPClient *dhcp_client, struct dhcp_packet *packet)
 
                g_free(option_value);
 
-               if (value_list == NULL)
+               if (!value_list)
                        g_hash_table_remove(dhcp_client->code_value_hash,
                                                GINT_TO_POINTER((int) code));
                else
@@ -1937,10 +2254,10 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
 
        dhcp_client->status_code = 0;
 
-       if (dhcp_client->listen_mode == L2)
+       if (dhcp_client->listen_mode == L2) {
                re = dhcp_recv_l2_packet(&packet,
                                        dhcp_client->listener_sockfd);
-       else if (dhcp_client->listen_mode == L3) {
+       else if (dhcp_client->listen_mode == L3) {
                if (dhcp_client->type == G_DHCP_IPV6) {
                        re = dhcpv6_recv_l3_packet(&packet6, buf, sizeof(buf),
                                                dhcp_client->listener_sockfd);
@@ -1957,25 +2274,24 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
        } else if (dhcp_client->listen_mode == L_ARP) {
                ipv4ll_recv_arp_packet(dhcp_client);
                return TRUE;
-       }
-       else
+       } else
                re = -EIO;
 
        if (re < 0)
                return TRUE;
 
-       if (check_package_owner(dhcp_client, pkt) == FALSE)
+       if (!check_package_owner(dhcp_client, pkt))
                return TRUE;
 
        if (dhcp_client->type == G_DHCP_IPV6) {
-               if (packet6 == NULL)
+               if (!packet6)
                        return TRUE;
 
                count = 0;
                client_id = dhcpv6_get_option(packet6, pkt_len,
                                G_DHCPV6_CLIENTID, &option_len, &count);
 
-               if (client_id == NULL || count == 0 || option_len == 0 ||
+               if (!client_id || count == 0 || option_len == 0 ||
                                memcmp(dhcp_client->duid, client_id,
                                        dhcp_client->duid_len) != 0) {
                        debug(dhcp_client,
@@ -2003,11 +2319,11 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                }
        } else {
                message_type = dhcp_get_option(&packet, DHCP_MESSAGE_TYPE);
-               if (message_type == NULL)
+               if (!message_type)
                        return TRUE;
        }
 
-       if (message_type == NULL && client_id == NULL)
+       if (!message_type && !client_id)
                /* No message type / client id option, ignore package */
                return TRUE;
 
@@ -2019,7 +2335,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                if (*message_type != DHCPOFFER)
                        return TRUE;
 
-               g_source_remove(dhcp_client->timeout);
+               remove_timeouts(dhcp_client);
                dhcp_client->timeout = 0;
                dhcp_client->retry_times = 0;
 
@@ -2032,15 +2348,14 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                start_request(dhcp_client);
 
                return TRUE;
+       case REBOOTING:
        case REQUESTING:
        case RENEWING:
        case REBINDING:
                if (*message_type == DHCPACK) {
                        dhcp_client->retry_times = 0;
 
-                       if (dhcp_client->timeout > 0)
-                               g_source_remove(dhcp_client->timeout);
-                       dhcp_client->timeout = 0;
+                       remove_timeouts(dhcp_client);
 
                        dhcp_client->lease_seconds = get_lease(&packet);
 
@@ -2052,7 +2367,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                        dhcp_client->assigned_ip = get_ip(packet.yiaddr);
 
                        /* Address should be set up here */
-                       if (dhcp_client->lease_available_cb != NULL)
+                       if (dhcp_client->lease_available_cb)
                                dhcp_client->lease_available_cb(dhcp_client,
                                        dhcp_client->lease_available_data);
 
@@ -2060,8 +2375,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                } else if (*message_type == DHCPNAK) {
                        dhcp_client->retry_times = 0;
 
-                       if (dhcp_client->timeout > 0)
-                               g_source_remove(dhcp_client->timeout);
+                       remove_timeouts(dhcp_client);
 
                        dhcp_client->timeout = g_timeout_add_seconds_full(
                                                        G_PRIORITY_HIGH, 3,
@@ -2082,7 +2396,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                count = 0;
                server_id = dhcpv6_get_option(packet6, pkt_len,
                                G_DHCPV6_SERVERID, &option_len, &count);
-               if (server_id == NULL || count != 1 || option_len == 0) {
+               if (!server_id || count != 1 || option_len == 0) {
                        /* RFC 3315, 15.10 */
                        debug(dhcp_client,
                                "server duid error, discarding msg %p/%d/%d",
@@ -2090,7 +2404,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                        return TRUE;
                }
                dhcp_client->server_duid = g_try_malloc(option_len);
-               if (dhcp_client->server_duid == NULL)
+               if (!dhcp_client->server_duid)
                        return TRUE;
                memcpy(dhcp_client->server_duid, server_id, option_len);
                dhcp_client->server_duid_len = option_len;
@@ -2102,7 +2416,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                        rapid_commit = dhcpv6_get_option(packet6, pkt_len,
                                                        G_DHCPV6_RAPID_COMMIT,
                                                        &option_len, &count);
-                       if (rapid_commit == NULL || option_len == 0 ||
+                       if (!rapid_commit || option_len == 0 ||
                                                                count != 1)
                                /* RFC 3315, 17.1.4 */
                                return TRUE;
@@ -2115,13 +2429,13 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                                        &dhcp_client->status_code);
 
                if (packet6->message == DHCPV6_ADVERTISE) {
-                       if (dhcp_client->advertise_cb != NULL)
+                       if (dhcp_client->advertise_cb)
                                dhcp_client->advertise_cb(dhcp_client,
                                                dhcp_client->advertise_data);
                        return TRUE;
                }
 
-               if (dhcp_client->solicitation_cb != NULL) {
+               if (dhcp_client->solicitation_cb) {
                        /*
                         * The dhcp_client might not be valid after the
                         * callback call so just return immediately.
@@ -2131,12 +2445,31 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                        return TRUE;
                }
                break;
+       case REBIND:
+               if (dhcp_client->type != G_DHCP_IPV6)
+                       return TRUE;
+
+               server_id = dhcpv6_get_option(packet6, pkt_len,
+                               G_DHCPV6_SERVERID, &option_len, &count);
+               if (!dhcp_client->server_duid && server_id &&
+                                                               count == 1) {
+                       /*
+                        * If we do not have server duid yet, then get it now.
+                        * Prefix delegation renew support needs it.
+                        */
+                       dhcp_client->server_duid = g_try_malloc(option_len);
+                       if (!dhcp_client->server_duid)
+                               return TRUE;
+                       memcpy(dhcp_client->server_duid, server_id, option_len);
+                       dhcp_client->server_duid_len = option_len;
+               }
+               /* fall through */
        case INFORMATION_REQ:
        case REQUEST:
        case RENEW:
-       case REBIND:
        case RELEASE:
        case CONFIRM:
+       case DECLINE:
                if (dhcp_client->type != G_DHCP_IPV6)
                        return TRUE;
 
@@ -2147,7 +2480,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                option_len = 0;
                server_id = dhcpv6_get_option(packet6, pkt_len,
                                G_DHCPV6_SERVERID, &option_len, &count);
-               if (server_id == NULL || count != 1 || option_len == 0 ||
+               if (!server_id || count != 1 || option_len == 0 ||
                                (dhcp_client->server_duid_len > 0 &&
                                memcmp(dhcp_client->server_duid, server_id,
                                        dhcp_client->server_duid_len) != 0)) {
@@ -2163,7 +2496,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                get_dhcpv6_request(dhcp_client, packet6, pkt_len,
                                                &dhcp_client->status_code);
 
-               if (dhcp_client->information_req_cb != NULL) {
+               if (dhcp_client->information_req_cb) {
                        /*
                         * The dhcp_client might not be valid after the
                         * callback call so just return immediately.
@@ -2172,32 +2505,37 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                                        dhcp_client->information_req_data);
                        return TRUE;
                }
-               if (dhcp_client->request_cb != NULL) {
+               if (dhcp_client->request_cb) {
                        dhcp_client->request_cb(dhcp_client,
                                        dhcp_client->request_data);
                        return TRUE;
                }
-               if (dhcp_client->renew_cb != NULL) {
+               if (dhcp_client->renew_cb) {
                        dhcp_client->renew_cb(dhcp_client,
                                        dhcp_client->renew_data);
                        return TRUE;
                }
-               if (dhcp_client->rebind_cb != NULL) {
+               if (dhcp_client->rebind_cb) {
                        dhcp_client->rebind_cb(dhcp_client,
                                        dhcp_client->rebind_data);
                        return TRUE;
                }
-               if (dhcp_client->release_cb != NULL) {
+               if (dhcp_client->release_cb) {
                        dhcp_client->release_cb(dhcp_client,
                                        dhcp_client->release_data);
                        return TRUE;
                }
-               if (dhcp_client->confirm_cb != NULL) {
+               if (dhcp_client->decline_cb) {
+                       dhcp_client->decline_cb(dhcp_client,
+                                       dhcp_client->decline_data);
+                       return TRUE;
+               }
+               if (dhcp_client->confirm_cb) {
                        count = 0;
                        server_id = dhcpv6_get_option(packet6, pkt_len,
                                                G_DHCPV6_SERVERID, &option_len,
                                                &count);
-                       if (server_id == NULL || count != 1 ||
+                       if (!server_id || count != 1 ||
                                                        option_len == 0) {
                                /* RFC 3315, 15.10 */
                                debug(dhcp_client,
@@ -2207,7 +2545,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
                                return TRUE;
                        }
                        dhcp_client->server_duid = g_try_malloc(option_len);
-                       if (dhcp_client->server_duid == NULL)
+                       if (!dhcp_client->server_duid)
                                return TRUE;
                        memcpy(dhcp_client->server_duid, server_id, option_len);
                        dhcp_client->server_duid_len = option_len;
@@ -2243,6 +2581,22 @@ static gboolean discover_timeout(gpointer user_data)
        return FALSE;
 }
 
+static gboolean reboot_timeout(gpointer user_data)
+{
+       GDHCPClient *dhcp_client = user_data;
+       dhcp_client->retry_times = 0;
+       dhcp_client->requested_ip = 0;
+       dhcp_client->state = INIT_SELECTING;
+       /*
+        * We do not send the REQUESTED IP option because the server didn't
+        * respond when we send DHCPREQUEST with the REQUESTED IP option in
+        * init-reboot state
+        */
+       g_dhcp_client_start(dhcp_client, NULL);
+
+       return FALSE;
+}
+
 static gboolean ipv4ll_defend_timeout(gpointer dhcp_data)
 {
        GDHCPClient *dhcp_client = dhcp_data;
@@ -2263,7 +2617,7 @@ static gboolean ipv4ll_announce_timeout(gpointer dhcp_data)
        debug(dhcp_client, "request timeout (retries %d)",
               dhcp_client->retry_times);
 
-       if (dhcp_client->retry_times != ANNOUNCE_NUM){
+       if (dhcp_client->retry_times != ANNOUNCE_NUM) {
                dhcp_client->retry_times++;
                send_announce_packet(dhcp_client);
                return FALSE;
@@ -2274,7 +2628,7 @@ static gboolean ipv4ll_announce_timeout(gpointer dhcp_data)
        dhcp_client->state = IPV4LL_MONITOR;
        dhcp_client->assigned_ip = get_ip(ip);
 
-       if (dhcp_client->ipv4ll_available_cb != NULL)
+       if (dhcp_client->ipv4ll_available_cb)
                dhcp_client->ipv4ll_available_cb(dhcp_client,
                                        dhcp_client->ipv4ll_available_data);
        dhcp_client->conflicts = 0;
@@ -2379,16 +2733,34 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const char *last_address)
                                return re;
                        }
                        send_dhcpv6_release(dhcp_client);
+               } else if (dhcp_client->decline_cb) {
+                       dhcp_client->state = DECLINE;
+                       re = switch_listening_mode(dhcp_client, L3);
+                       if (re != 0) {
+                               switch_listening_mode(dhcp_client, L_NONE);
+                               dhcp_client->state = 0;
+                               return re;
+                       }
+                       send_dhcpv6_decline(dhcp_client);
                }
 
                return 0;
        }
 
-       if (dhcp_client->retry_times == DISCOVER_RETRIES) {
+       if (dhcp_client->type == G_DHCP_IPV4LL) {
+               dhcp_client->state = INIT_SELECTING;
                ipv4ll_start(dhcp_client);
                return 0;
        }
 
+       if (dhcp_client->retry_times == DISCOVER_RETRIES) {
+               if (dhcp_client->no_lease_cb)
+                       dhcp_client->no_lease_cb(dhcp_client,
+                                               dhcp_client->no_lease_data);
+               dhcp_client->retry_times = 0;
+               return 0;
+       }
+
        if (dhcp_client->retry_times == 0) {
                g_free(dhcp_client->assigned_ip);
                dhcp_client->assigned_ip = NULL;
@@ -2402,10 +2774,10 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const char *last_address)
                dhcp_client->start = time(NULL);
        }
 
-       if (last_address == NULL) {
+       if (!last_address) {
                addr = 0;
        } else {
-               addr = inet_addr(last_address);
+               addr = ntohl(inet_addr(last_address));
                if (addr == 0xFFFFFFFF) {
                        addr = 0;
                } else {
@@ -2413,6 +2785,21 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const char *last_address)
                        dhcp_client->last_address = g_strdup(last_address);
                }
        }
+
+       if ((addr != 0) && (dhcp_client->type != G_DHCP_IPV4LL)) {
+               debug(dhcp_client, "DHCP client start with state init_reboot");
+               dhcp_client->requested_ip = addr;
+               dhcp_client->state = REBOOTING;
+               send_request(dhcp_client);
+
+               dhcp_client->timeout = g_timeout_add_seconds_full(
+                                                               G_PRIORITY_HIGH,
+                                                               REQUEST_TIMEOUT,
+                                                               reboot_timeout,
+                                                               dhcp_client,
+                                                               NULL);
+               return 0;
+       }
        send_discover(dhcp_client, addr);
 
        dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
@@ -2433,18 +2820,13 @@ void g_dhcp_client_stop(GDHCPClient *dhcp_client)
                send_release(dhcp_client, dhcp_client->server_ip,
                                        dhcp_client->requested_ip);
 
-       if (dhcp_client->timeout > 0) {
-               g_source_remove(dhcp_client->timeout);
-               dhcp_client->timeout = 0;
-       }
+       remove_timeouts(dhcp_client);
 
        if (dhcp_client->listener_watch > 0) {
                g_source_remove(dhcp_client->listener_watch);
                dhcp_client->listener_watch = 0;
        }
 
-       dhcp_client->listener_channel = NULL;
-
        dhcp_client->retry_times = 0;
        dhcp_client->ack_retry_times = 0;
 
@@ -2542,6 +2924,12 @@ void g_dhcp_client_register_event(GDHCPClient *dhcp_client,
                dhcp_client->confirm_cb = func;
                dhcp_client->confirm_data = data;
                return;
+       case G_DHCP_CLIENT_EVENT_DECLINE:
+               if (dhcp_client->type != G_DHCP_IPV6)
+                       return;
+               dhcp_client->decline_cb = func;
+               dhcp_client->decline_data = data;
+               return;
        }
 }
 
@@ -2570,9 +2958,10 @@ char *g_dhcp_client_get_netmask(GDHCPClient *dhcp_client)
        case RENEWING:
        case REBINDING:
                option = g_dhcp_client_get_option(dhcp_client, G_DHCP_SUBNET);
-               if (option != NULL)
+               if (option)
                        return g_strdup(option->data);
        case INIT_SELECTING:
+       case REBOOTING:
        case REQUESTING:
        case RELEASED:
        case IPV4LL_PROBE:
@@ -2584,6 +2973,7 @@ char *g_dhcp_client_get_netmask(GDHCPClient *dhcp_client)
        case RENEW:
        case REBIND:
        case RELEASE:
+       case DECLINE:
                break;
        }
        return NULL;
@@ -2592,8 +2982,8 @@ char *g_dhcp_client_get_netmask(GDHCPClient *dhcp_client)
 GDHCPClientError g_dhcp_client_set_request(GDHCPClient *dhcp_client,
                                                unsigned int option_code)
 {
-       if (g_list_find(dhcp_client->request_list,
-                       GINT_TO_POINTER((int) option_code)) == NULL)
+       if (!g_list_find(dhcp_client->request_list,
+                               GINT_TO_POINTER((int)option_code)))
                dhcp_client->request_list = g_list_prepend(
                                        dhcp_client->request_list,
                                        (GINT_TO_POINTER((int) option_code)));
@@ -2617,7 +3007,7 @@ static uint8_t *alloc_dhcp_option(int code, const uint8_t *data, unsigned size)
        uint8_t *storage;
 
        storage = g_try_malloc(size + OPT_DATA);
-       if (storage == NULL)
+       if (!storage)
                return NULL;
 
        storage[OPT_CODE] = code;
@@ -2627,7 +3017,8 @@ static uint8_t *alloc_dhcp_option(int code, const uint8_t *data, unsigned size)
        return storage;
 }
 
-static uint8_t *alloc_dhcp_data_option(int code, const uint8_t *data, unsigned size)
+static uint8_t *alloc_dhcp_data_option(int code, const uint8_t *data,
+                                       unsigned size)
 {
        return alloc_dhcp_option(code, data, MIN(size, 255));
 }
@@ -2650,7 +3041,7 @@ GDHCPClientError g_dhcp_client_set_id(GDHCPClient *dhcp_client)
        memcpy(&idbuf[1], dhcp_client->mac_address, maclen);
 
        data_option = alloc_dhcp_data_option(option_code, idbuf, idlen);
-       if (data_option == NULL)
+       if (!data_option)
                return G_DHCP_CLIENT_ERROR_NOMEM;
 
        g_hash_table_insert(dhcp_client->send_value_hash,
@@ -2665,10 +3056,10 @@ GDHCPClientError g_dhcp_client_set_send(GDHCPClient *dhcp_client,
 {
        uint8_t *binary_option;
 
-       if (option_code == G_DHCP_HOST_NAME && option_value != NULL) {
+       if (option_code == G_DHCP_HOST_NAME && option_value) {
                binary_option = alloc_dhcp_string_option(option_code,
                                                        option_value);
-               if (binary_option == NULL)
+               if (!binary_option)
                        return G_DHCP_CLIENT_ERROR_NOMEM;
 
                g_hash_table_insert(dhcp_client->send_value_hash,
@@ -2684,7 +3075,7 @@ static uint8_t *alloc_dhcpv6_option(uint16_t code, uint8_t *option,
        uint8_t *storage;
 
        storage = g_malloc(2 + 2 + len);
-       if (storage == NULL)
+       if (!storage)
                return NULL;
 
        storage[0] = code >> 8;
@@ -2696,12 +3087,18 @@ static uint8_t *alloc_dhcpv6_option(uint16_t code, uint8_t *option,
        return storage;
 }
 
+gboolean g_dhcpv6_client_clear_send(GDHCPClient *dhcp_client, uint16_t code)
+{
+       return g_hash_table_remove(dhcp_client->send_value_hash,
+                               GINT_TO_POINTER((int)code));
+}
+
 void g_dhcpv6_client_set_send(GDHCPClient *dhcp_client,
                                        uint16_t option_code,
                                        uint8_t *option_value,
                                        uint16_t option_len)
 {
-       if (option_value != NULL) {
+       if (option_value) {
                uint8_t *binary_option;
 
                debug(dhcp_client, "setting option %d to %p len %d",
@@ -2709,40 +3106,24 @@ void g_dhcpv6_client_set_send(GDHCPClient *dhcp_client,
 
                binary_option = alloc_dhcpv6_option(option_code, option_value,
                                                option_len);
-               if (binary_option != NULL)
+               if (binary_option)
                        g_hash_table_insert(dhcp_client->send_value_hash,
                                        GINT_TO_POINTER((int) option_code),
                                        binary_option);
        }
 }
 
-void g_dhcpv6_client_reset_renew(GDHCPClient *dhcp_client)
+void g_dhcpv6_client_reset_request(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
                return;
 
-       dhcp_client->last_renew = time(NULL);
-}
-
-void g_dhcpv6_client_reset_rebind(GDHCPClient *dhcp_client)
-{
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
-               return;
-
-       dhcp_client->last_rebind = time(NULL);
-}
-
-void g_dhcpv6_client_set_expire(GDHCPClient *dhcp_client, uint32_t timeout)
-{
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
-               return;
-
-       dhcp_client->expire = time(NULL) + timeout;
+       dhcp_client->last_request = time(NULL);
 }
 
 uint16_t g_dhcpv6_client_get_status(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL || dhcp_client->type != G_DHCP_IPV6)
+       if (!dhcp_client || dhcp_client->type != G_DHCP_IPV6)
                return 0;
 
        return dhcp_client->status_code;
@@ -2750,7 +3131,7 @@ uint16_t g_dhcpv6_client_get_status(GDHCPClient *dhcp_client)
 
 GDHCPClient *g_dhcp_client_ref(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL)
+       if (!dhcp_client)
                return NULL;
 
        __sync_fetch_and_add(&dhcp_client->ref_count, 1);
@@ -2760,7 +3141,7 @@ GDHCPClient *g_dhcp_client_ref(GDHCPClient *dhcp_client)
 
 void g_dhcp_client_unref(GDHCPClient *dhcp_client)
 {
-       if (dhcp_client == NULL)
+       if (!dhcp_client)
                return;
 
        if (__sync_fetch_and_sub(&dhcp_client->ref_count, 1) != 1)
@@ -2786,9 +3167,33 @@ void g_dhcp_client_unref(GDHCPClient *dhcp_client)
 void g_dhcp_client_set_debug(GDHCPClient *dhcp_client,
                                GDHCPDebugFunc func, gpointer user_data)
 {
-       if (dhcp_client == NULL)
+       if (!dhcp_client)
                return;
 
        dhcp_client->debug_func = func;
        dhcp_client->debug_data = user_data;
 }
+
+static GDHCPIAPrefix *copy_prefix(gpointer data)
+{
+       GDHCPIAPrefix *copy, *prefix = data;
+
+       copy = g_try_new(GDHCPIAPrefix, 1);
+       if (!copy)
+               return NULL;
+
+       memcpy(copy, prefix, sizeof(GDHCPIAPrefix));
+
+       return copy;
+}
+
+GSList *g_dhcpv6_copy_prefixes(GSList *prefixes)
+{
+       GSList *copy = NULL;
+       GSList *list;
+
+       for (list = prefixes; list; list = list->next)
+               copy = g_slist_prepend(copy, copy_prefix(list->data));
+
+       return copy;
+}
index 0c433dd..e111150 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  DHCP library with GLib integration
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -170,12 +170,9 @@ uint8_t *dhcpv6_get_option(struct dhcpv6_packet *packet, uint16_t pkt_len,
                        break;
 
                if (opt_code == code) {
-                       if (option_len != NULL)
+                       if (option_len)
                                *option_len = opt_len;
-                       if (rem < 0)
-                               goto bad_packet;
-                       else
-                               found = optionptr + 2 + 2;
+                       found = optionptr + 2 + 2;
                        count++;
                }
 
@@ -185,15 +182,15 @@ uint8_t *dhcpv6_get_option(struct dhcpv6_packet *packet, uint16_t pkt_len,
                optionptr += len;
        }
 
-       if (option_count != NULL)
+       if (option_count)
                *option_count = count;
 
        return found;
 
 bad_packet:
-       if (option_len != NULL)
+       if (option_len)
                *option_len = 0;
-       if (option_count != NULL)
+       if (option_count)
                *option_count = 0;
        return NULL;
 }
@@ -371,34 +368,6 @@ void dhcpv6_init_header(struct dhcpv6_packet *packet, uint8_t type)
        packet->transaction_id[2] = id & 0xff;
 }
 
-static gboolean check_vendor(uint8_t  *option_vendor, const char *vendor)
-{
-       uint8_t vendor_length = sizeof(vendor) - 1;
-
-       if (option_vendor[OPT_LEN - OPT_DATA] != vendor_length)
-               return FALSE;
-
-       if (memcmp(option_vendor, vendor, vendor_length) != 0)
-               return FALSE;
-
-       return TRUE;
-}
-
-static void check_broken_vendor(struct dhcp_packet *packet)
-{
-       uint8_t *vendor;
-
-       if (packet->op != BOOTREQUEST)
-               return;
-
-       vendor = dhcp_get_option(packet, DHCP_VENDOR);
-       if (vendor == NULL)
-               return;
-
-       if (check_vendor(vendor, "MSFT 98") == TRUE)
-               packet->flags |= htons(BROADCAST_FLAG);
-}
-
 int dhcp_recv_l3_packet(struct dhcp_packet *packet, int fd)
 {
        int n;
@@ -412,8 +381,6 @@ int dhcp_recv_l3_packet(struct dhcp_packet *packet, int fd)
        if (packet->cookie != htonl(DHCP_MAGIC))
                return -EPROTO;
 
-       check_broken_vendor(packet);
-
        return n;
 }
 
@@ -496,7 +463,7 @@ int dhcpv6_send_packet(int index, struct dhcpv6_packet *dhcp_pkt, int len)
 
        control_buf_len = CMSG_SPACE(sizeof(struct in6_pktinfo));
        control_buf = g_try_malloc0(control_buf_len);
-       if (control_buf == NULL) {
+       if (!control_buf) {
                close(fd);
                return -ENOMEM;
        }
@@ -525,8 +492,17 @@ int dhcpv6_send_packet(int index, struct dhcpv6_packet *dhcp_pkt, int len)
        m.msg_controllen = cmsg->cmsg_len;
 
        ret = sendmsg(fd, &m, 0);
-       if (ret < 0)
-               perror("DHCPv6 msg send failed");
+       if (ret < 0) {
+               char *msg = "DHCPv6 msg send failed";
+
+               if (errno == EADDRNOTAVAIL) {
+                       char *str = g_strdup_printf("%s (index %d)",
+                                       msg, index);
+                       perror(str);
+                       g_free(str);
+               } else
+                       perror(msg);
+       }
 
        g_free(control_buf);
        close(fd);
@@ -553,6 +529,8 @@ int dhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
        if (fd < 0)
                return -errno;
 
+       dhcp_pkt->flags |= htons(BROADCAST_FLAG);
+
        memset(&dest, 0, sizeof(dest));
        memset(&packet, 0, sizeof(packet));
        packet.data = *dhcp_pkt;
@@ -718,16 +696,16 @@ char *get_interface_name(int index)
        return g_strdup(ifr.ifr_name);
 }
 
-gboolean interface_is_up(int index)
+bool interface_is_up(int index)
 {
        int sk, err;
        struct ifreq ifr;
-       gboolean ret = FALSE;
+       bool ret = false;
 
        sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sk < 0) {
                perror("Open socket error");
-               return FALSE;
+               return false;
        }
 
        memset(&ifr, 0, sizeof(ifr));
@@ -746,7 +724,7 @@ gboolean interface_is_up(int index)
        }
 
        if (ifr.ifr_flags & IFF_UP)
-               ret = TRUE;
+               ret = true;
 
 done:
        close(sk);
index 740eb9c..e4a4251 100644 (file)
@@ -208,4 +208,4 @@ int dhcpv6_recv_l3_packet(struct dhcpv6_packet **packet, unsigned char *buf,
 int dhcp_l3_socket_send(int index, int port, int family);
 
 char *get_interface_name(int index);
-gboolean interface_is_up(int index);
+bool interface_is_up(int index);
index 4f0a16b..f3e47bf 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  DHCP library with GLib integration
  *
- *  Copyright (C) 2009-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2009-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,7 +22,9 @@
 #ifndef __G_DHCP_H
 #define __G_DHCP_H
 
+#include <stdbool.h>
 #include <stdint.h>
+#include <arpa/inet.h>
 
 #include <glib.h>
 
@@ -60,6 +62,7 @@ typedef enum {
        G_DHCP_CLIENT_EVENT_REBIND,
        G_DHCP_CLIENT_EVENT_RELEASE,
        G_DHCP_CLIENT_EVENT_CONFIRM,
+       G_DHCP_CLIENT_EVENT_DECLINE,
 } GDHCPClientEvent;
 
 typedef enum {
@@ -83,11 +86,14 @@ typedef enum {
 #define G_DHCPV6_IA_TA         4
 #define G_DHCPV6_IAADDR                5
 #define G_DHCPV6_ORO           6
+#define G_DHCPV6_PREFERENCE     7
 #define G_DHCPV6_ELAPSED_TIME   8
 #define G_DHCPV6_STATUS_CODE   13
 #define G_DHCPV6_RAPID_COMMIT  14
 #define G_DHCPV6_DNS_SERVERS   23
 #define G_DHCPV6_DOMAIN_LIST   24
+#define G_DHCPV6_IA_PD         25
+#define G_DHCPV6_IA_PREFIX     26
 #define G_DHCPV6_SNTP_SERVERS  31
 
 #define G_DHCPV6_ERROR_SUCCESS 0
@@ -96,6 +102,7 @@ typedef enum {
 #define G_DHCPV6_ERROR_BINDING 3
 #define G_DHCPV6_ERROR_LINK    4
 #define G_DHCPV6_ERROR_MCAST   5
+#define G_DHCPV6_ERROR_NO_PREFIX 6
 
 typedef enum {
        G_DHCPV6_DUID_LLT = 1,
@@ -103,6 +110,19 @@ typedef enum {
        G_DHCPV6_DUID_LL  = 3,
 } GDHCPDuidType;
 
+typedef struct {
+       /*
+        * Note that no field in this struct can be allocated
+        * from heap or there will be a memory leak when the
+        * struct is freed by client.c:remove_option_value()
+        */
+       struct in6_addr prefix;
+       unsigned char prefixlen;
+       uint32_t preferred;
+       uint32_t valid;
+       time_t expire;
+} GDHCPIAPrefix;
+
 typedef void (*GDHCPClientEventFunc) (GDHCPClient *client, gpointer user_data);
 
 typedef void (*GDHCPDebugFunc)(const char *str, gpointer user_data);
@@ -142,6 +162,10 @@ int g_dhcpv6_create_duid(GDHCPDuidType duid_type, int index, int type,
                        unsigned char **duid, int *duid_len);
 int g_dhcpv6_client_set_duid(GDHCPClient *dhcp_client, unsigned char *duid,
                        int duid_len);
+int g_dhcpv6_client_set_pd(GDHCPClient *dhcp_client, uint32_t *T1, uint32_t *T2,
+                       GSList *prefixes);
+GSList *g_dhcpv6_copy_prefixes(GSList *prefixes);
+gboolean g_dhcpv6_client_clear_send(GDHCPClient *dhcp_client, uint16_t code);
 void g_dhcpv6_client_set_send(GDHCPClient *dhcp_client, uint16_t option_code,
                        uint8_t *option_value, uint16_t option_len);
 uint16_t g_dhcpv6_client_get_status(GDHCPClient *dhcp_client);
@@ -150,15 +174,16 @@ void g_dhcpv6_client_create_iaid(GDHCPClient *dhcp_client, int index,
                                unsigned char *iaid);
 int g_dhcpv6_client_get_timeouts(GDHCPClient *dhcp_client,
                                uint32_t *T1, uint32_t *T2,
-                               time_t *last_renew, time_t *last_rebind,
-                               time_t *expire);
+                               time_t *started, time_t *expire);
 uint32_t g_dhcpv6_client_get_iaid(GDHCPClient *dhcp_client);
+void g_dhcpv6_client_set_iaid(GDHCPClient *dhcp_client, uint32_t iaid);
 int g_dhcpv6_client_set_ia(GDHCPClient *dhcp_client, int index,
                        int code, uint32_t *T1, uint32_t *T2,
-                       gboolean add_addresses, const char *address);
-void g_dhcpv6_client_reset_renew(GDHCPClient *dhcp_client);
-void g_dhcpv6_client_reset_rebind(GDHCPClient *dhcp_client);
-void g_dhcpv6_client_set_expire(GDHCPClient *dhcp_client, uint32_t timeout);
+                       bool add_addresses, const char *address);
+int g_dhcpv6_client_set_ias(GDHCPClient *dhcp_client, int index,
+                       int code, uint32_t *T1, uint32_t *T2,
+                       GSList *addresses);
+void g_dhcpv6_client_reset_request(GDHCPClient *dhcp_client);
 void g_dhcpv6_client_set_retransmit(GDHCPClient *dhcp_client);
 void g_dhcpv6_client_clear_retransmit(GDHCPClient *dhcp_client);
 
index 033ef81..9bf52b0 100644 (file)
@@ -122,10 +122,13 @@ int ipv4ll_arp_socket(int ifindex)
 {
        int fd;
        struct sockaddr_ll sock;
+
        fd = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_ARP));
        if (fd < 0)
                return fd;
 
+       memset(&sock, 0, sizeof(sock));
+
        sock.sll_family = AF_PACKET;
        sock.sll_protocol = htons(ETH_P_ARP);
        sock.sll_ifindex = ifindex;
index 0c5f295..728992d 100644 (file)
@@ -51,7 +51,7 @@
 struct _GDHCPServer {
        int ref_count;
        GDHCPType type;
-       gboolean started;
+       bool started;
        int ifindex;
        char *interface;
        uint32_t start_ip;
@@ -80,7 +80,7 @@ static inline void debug(GDHCPServer *server, const char *format, ...)
        char str[256];
        va_list ap;
 
-       if (server->debug_func == NULL)
+       if (!server->debug_func)
                return;
 
        va_start(ap, format);
@@ -143,14 +143,14 @@ static int get_lease(GDHCPServer *dhcp_server, uint32_t yiaddr,
                                        GINT_TO_POINTER((int) ntohl(yiaddr)));
        debug(dhcp_server, "lease_mac %p lease_nip %p", lease_mac, lease_nip);
 
-       if (lease_nip != NULL) {
+       if (lease_nip) {
                dhcp_server->lease_list =
                                g_list_remove(dhcp_server->lease_list,
                                                                lease_nip);
                g_hash_table_remove(dhcp_server->nip_lease_hash,
                                GINT_TO_POINTER((int) ntohl(yiaddr)));
 
-               if (lease_mac == NULL)
+               if (!lease_mac)
                        *lease = lease_nip;
                else if (lease_nip != lease_mac) {
                        remove_lease(dhcp_server, lease_mac);
@@ -161,7 +161,7 @@ static int get_lease(GDHCPServer *dhcp_server, uint32_t yiaddr,
                return 0;
        }
 
-       if (lease_mac != NULL) {
+       if (lease_mac) {
                dhcp_server->lease_list =
                                g_list_remove(dhcp_server->lease_list,
                                                                lease_mac);
@@ -173,7 +173,7 @@ static int get_lease(GDHCPServer *dhcp_server, uint32_t yiaddr,
        }
 
        *lease = g_try_new0(struct dhcp_lease, 1);
-       if (*lease == NULL)
+       if (!*lease)
                return -ENOMEM;
 
        return 0;
@@ -224,18 +224,18 @@ static struct dhcp_lease *find_lease_by_nip(GDHCPServer *dhcp_server,
 }
 
 /* Check if the IP is taken; if it is, add it to the lease table */
-static gboolean arp_check(uint32_t nip, const uint8_t *safe_mac)
+static bool arp_check(uint32_t nip, const uint8_t *safe_mac)
 {
        /* TODO: Add ARP checking */
-       return TRUE;
+       return true;
 }
 
-static gboolean is_expired_lease(struct dhcp_lease *lease)
+static bool is_expired_lease(struct dhcp_lease *lease)
 {
        if (lease->expire < time(NULL))
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static uint32_t find_free_or_expired_nip(GDHCPServer *dhcp_server,
@@ -255,26 +255,26 @@ static uint32_t find_free_or_expired_nip(GDHCPServer *dhcp_server,
                        continue;
 
                lease = find_lease_by_nip(dhcp_server, ip_addr);
-               if (lease != NULL)
+               if (lease)
                        continue;
 
-               if (arp_check(htonl(ip_addr), safe_mac) == TRUE)
+               if (arp_check(htonl(ip_addr), safe_mac))
                        return ip_addr;
        }
 
        /* The last lease is the oldest one */
        list = g_list_last(dhcp_server->lease_list);
-       if (list == NULL)
+       if (!list)
                return 0;
 
        lease = list->data;
-       if (lease == NULL)
+       if (!lease)
                return 0;
 
-        if (is_expired_lease(lease) == FALSE)
+        if (!is_expired_lease(lease))
                return 0;
 
-        if (arp_check(lease->lease_nip, safe_mac) == FALSE)
+        if (!arp_check(lease->lease_nip, safe_mac))
                return 0;
 
        return lease->lease_nip;
@@ -357,18 +357,18 @@ GDHCPServer *g_dhcp_server_new(GDHCPType type,
        }
 
        dhcp_server = g_try_new0(GDHCPServer, 1);
-       if (dhcp_server == NULL) {
+       if (!dhcp_server) {
                *error = G_DHCP_SERVER_ERROR_NOMEM;
                return NULL;
        }
 
        dhcp_server->interface = get_interface_name(ifindex);
-       if (dhcp_server->interface == NULL) {
+       if (!dhcp_server->interface) {
                *error = G_DHCP_SERVER_ERROR_INTERFACE_UNAVAILABLE;
                goto error;
        }
 
-       if (interface_is_up(ifindex) == FALSE) {
+       if (!interface_is_up(ifindex)) {
                *error = G_DHCP_SERVER_ERROR_INTERFACE_DOWN;
                goto error;
        }
@@ -424,7 +424,7 @@ static uint8_t check_packet_type(struct dhcp_packet *packet)
 
        type = dhcp_get_option(packet, DHCP_MESSAGE_TYPE);
 
-       if (type == NULL)
+       if (!type)
                return 0;
 
        if (*type < DHCP_MINTYPE)
@@ -460,7 +460,7 @@ static void add_option(gpointer key, gpointer value, gpointer user_data)
        struct in_addr nip;
        struct dhcp_packet *packet = user_data;
 
-       if (option_value == NULL)
+       if (!option_value)
                return;
 
        switch (option_code) {
@@ -485,28 +485,28 @@ static void add_server_options(GDHCPServer *dhcp_server,
                                add_option, packet);
 }
 
-static gboolean check_requested_nip(GDHCPServer *dhcp_server,
+static bool check_requested_nip(GDHCPServer *dhcp_server,
                                        uint32_t requested_nip)
 {
        struct dhcp_lease *lease;
 
        if (requested_nip == 0)
-               return FALSE;
+               return false;
 
        if (requested_nip < dhcp_server->start_ip)
-               return FALSE;
+               return false;
 
        if (requested_nip > dhcp_server->end_ip)
-               return FALSE;
+               return false;
 
        lease = find_lease_by_nip(dhcp_server, requested_nip);
-       if (lease == NULL)
-               return TRUE;
+       if (!lease)
+               return true;
 
-       if (is_expired_lease(lease) == FALSE)
-               return FALSE;
+       if (!is_expired_lease(lease))
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static void send_packet_to_client(GDHCPServer *dhcp_server,
@@ -544,7 +544,7 @@ static void send_offer(GDHCPServer *dhcp_server,
 
        if (lease)
                packet.yiaddr = htonl(lease->lease_nip);
-       else if (check_requested_nip(dhcp_server, requested_nip) == TRUE)
+       else if (check_requested_nip(dhcp_server, requested_nip))
                packet.yiaddr = htonl(requested_nip);
        else
                packet.yiaddr = htonl(find_free_or_expired_nip(
@@ -559,7 +559,7 @@ static void send_offer(GDHCPServer *dhcp_server,
 
        lease = add_lease(dhcp_server, OFFER_TIME,
                                packet.chaddr, packet.yiaddr);
-       if (lease == NULL) {
+       if (!lease) {
                debug(dhcp_server,
                                "Err: No free IP addresses. OFFER abandoned");
                return;
@@ -579,7 +579,7 @@ static void save_lease(GDHCPServer *dhcp_server)
 {
        GList *list;
 
-       if (dhcp_server->save_lease_func == NULL)
+       if (!dhcp_server->save_lease_func)
                return;
 
        for (list = dhcp_server->lease_list; list; list = list->next) {
@@ -677,65 +677,65 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition,
        lease = find_lease_by_mac(dhcp_server, packet.chaddr);
 
        switch (type) {
-               case DHCPDISCOVER:
-                       debug(dhcp_server, "Received DISCOVER");
+       case DHCPDISCOVER:
+               debug(dhcp_server, "Received DISCOVER");
 
-                       send_offer(dhcp_server, &packet, lease, requested_nip);
+               send_offer(dhcp_server, &packet, lease, requested_nip);
                break;
-               case DHCPREQUEST:
-                       debug(dhcp_server, "Received REQUEST NIP %d",
+       case DHCPREQUEST:
+               debug(dhcp_server, "Received REQUEST NIP %d",
                                                        requested_nip);
-                       if (requested_nip == 0) {
-                               requested_nip = packet.ciaddr;
-                               if (requested_nip == 0)
-                                       break;
-                       }
-
-                       if (lease && requested_nip == lease->lease_nip) {
-                               debug(dhcp_server, "Sending ACK");
-                               send_ACK(dhcp_server, &packet,
-                                               lease->lease_nip);
+               if (requested_nip == 0) {
+                       requested_nip = packet.ciaddr;
+                       if (requested_nip == 0)
                                break;
-                       }
+               }
+
+               if (lease && requested_nip == lease->lease_nip) {
+                       debug(dhcp_server, "Sending ACK");
+                       send_ACK(dhcp_server, &packet,
+                               lease->lease_nip);
+                       break;
+               }
 
-                       if (server_id_option || lease == NULL) {
-                               debug(dhcp_server, "Sending NAK");
-                               send_NAK(dhcp_server, &packet);
-                       }
+               if (server_id_option || !lease) {
+                       debug(dhcp_server, "Sending NAK");
+                       send_NAK(dhcp_server, &packet);
+               }
 
                break;
-               case DHCPDECLINE:
-                       debug(dhcp_server, "Received DECLINE");
+       case DHCPDECLINE:
+               debug(dhcp_server, "Received DECLINE");
 
-                       if (server_id_option == NULL)
-                               break;
+               if (!server_id_option)
+                       break;
 
-                       if (request_ip_option == NULL)
-                               break;
+               if (!request_ip_option)
+                       break;
 
-                       if (lease == NULL)
-                               break;
+               if (!lease)
+                       break;
 
-                       if (requested_nip == lease->lease_nip)
-                               remove_lease(dhcp_server, lease);
+               if (requested_nip == lease->lease_nip)
+                       remove_lease(dhcp_server, lease);
 
                break;
-               case DHCPRELEASE:
-                       debug(dhcp_server, "Received RELEASE");
+       case DHCPRELEASE:
+               debug(dhcp_server, "Received RELEASE");
 
-                       if (server_id_option == NULL)
-                               break;
+               if (!server_id_option)
+                       break;
 
-                       if (lease == NULL)
-                               break;
+               if (!lease)
+                       break;
 
-                       if (packet.ciaddr == lease->lease_nip)
-                               lease_set_expire(dhcp_server, lease,
-                                                               time(NULL));
+               if (packet.ciaddr == lease->lease_nip)
+                       lease_set_expire(dhcp_server, lease,
+                                       time(NULL));
                break;
-               case DHCPINFORM:
-                       debug(dhcp_server, "Received INFORM");
-                       send_inform(dhcp_server, &packet);
+       case DHCPINFORM:
+               debug(dhcp_server, "Received INFORM");
+               send_inform(dhcp_server, &packet);
                break;
        }
 
@@ -748,7 +748,7 @@ int g_dhcp_server_start(GDHCPServer *dhcp_server)
        GIOChannel *listener_channel;
        int listener_sockfd;
 
-       if (dhcp_server->started == TRUE)
+       if (dhcp_server->started)
                return 0;
 
        listener_sockfd = dhcp_l3_socket(SERVER_PORT,
@@ -757,7 +757,7 @@ int g_dhcp_server_start(GDHCPServer *dhcp_server)
                return -EIO;
 
        listener_channel = g_io_channel_unix_new(listener_sockfd);
-       if (listener_channel == NULL) {
+       if (!listener_channel) {
                close(listener_sockfd);
                return -EIO;
        }
@@ -783,7 +783,7 @@ int g_dhcp_server_set_option(GDHCPServer *dhcp_server,
 {
        struct in_addr nip;
 
-       if (option_value == NULL)
+       if (!option_value)
                return -EINVAL;
 
        debug(dhcp_server, "option_code %d option_value %s",
@@ -808,7 +808,7 @@ int g_dhcp_server_set_option(GDHCPServer *dhcp_server,
 void g_dhcp_server_set_save_lease(GDHCPServer *dhcp_server,
                                GDHCPSaveLeaseFunc func, gpointer user_data)
 {
-       if (dhcp_server == NULL)
+       if (!dhcp_server)
                return;
 
        dhcp_server->save_lease_func = func;
@@ -816,7 +816,7 @@ void g_dhcp_server_set_save_lease(GDHCPServer *dhcp_server,
 
 GDHCPServer *g_dhcp_server_ref(GDHCPServer *dhcp_server)
 {
-       if (dhcp_server == NULL)
+       if (!dhcp_server)
                return NULL;
 
        __sync_fetch_and_add(&dhcp_server->ref_count, 1);
@@ -841,7 +841,7 @@ void g_dhcp_server_stop(GDHCPServer *dhcp_server)
 
 void g_dhcp_server_unref(GDHCPServer *dhcp_server)
 {
-       if (dhcp_server == NULL)
+       if (!dhcp_server)
                return;
 
        if (__sync_fetch_and_sub(&dhcp_server->ref_count, 1) != 1)
@@ -876,9 +876,10 @@ int g_dhcp_server_set_ip_range(GDHCPServer *dhcp_server,
        return 0;
 }
 
-void g_dhcp_server_set_lease_time(GDHCPServer *dhcp_server, unsigned int lease_time)
+void g_dhcp_server_set_lease_time(GDHCPServer *dhcp_server,
+                                       unsigned int lease_time)
 {
-       if (dhcp_server == NULL)
+       if (!dhcp_server)
                return;
 
        dhcp_server->lease_seconds = lease_time;
@@ -887,7 +888,7 @@ void g_dhcp_server_set_lease_time(GDHCPServer *dhcp_server, unsigned int lease_t
 void g_dhcp_server_set_debug(GDHCPServer *dhcp_server,
                                GDHCPDebugFunc func, gpointer user_data)
 {
-       if (dhcp_server == NULL)
+       if (!dhcp_server)
                return;
 
        dhcp_server->debug_func = func;
index 89776c5..5b15bcd 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  WPA supplicant library with GLib integration
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <dbus/dbus.h>
+#include <glib.h>
 
 #include "dbus.h"
 
 
 static DBusConnection *connection;
 
+static GSList *method_calls;
+
+struct method_call_data {
+       gpointer caller;
+       DBusPendingCall *pending_call;
+       supplicant_dbus_result_function function;
+       void *user_data;
+};
+
+static void method_call_free(void *pointer)
+{
+       struct method_call_data *method_call = pointer;
+       method_calls = g_slist_remove(method_calls, method_call);
+       g_free(method_call);
+}
+
+static int find_method_call_by_caller(gconstpointer a, gconstpointer b)
+{
+       const struct method_call_data *method_call = a;
+       gconstpointer caller = b;
+
+       return method_call->caller != caller;
+}
+
 void supplicant_dbus_setup(DBusConnection *conn)
 {
        connection = conn;
+       method_calls = NULL;
 }
 
 void supplicant_dbus_array_foreach(DBusMessageIter *iter,
@@ -51,7 +77,7 @@ void supplicant_dbus_array_foreach(DBusMessageIter *iter,
        dbus_message_iter_recurse(iter, &entry);
 
        while (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_INVALID) {
-               if (function != NULL)
+               if (function)
                        function(&entry, user_data);
 
                dbus_message_iter_next(&entry);
@@ -86,11 +112,11 @@ void supplicant_dbus_property_foreach(DBusMessageIter *iter,
 
                dbus_message_iter_recurse(&entry, &value);
 
-               if (key != NULL) {
+               if (key) {
                        if (strcmp(key, "Properties") == 0)
                                supplicant_dbus_property_foreach(&value,
                                                        function, user_data);
-                       else if (function != NULL)
+                       else if (function)
                                function(key, &value, user_data);
                }
 
@@ -114,13 +140,13 @@ static void property_get_all_reply(DBusPendingCall *call, void *user_data)
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
                goto done;
 
-       if (dbus_message_iter_init(reply, &iter) == FALSE)
+       if (!dbus_message_iter_init(reply, &iter))
                goto done;
 
        supplicant_dbus_property_foreach(&iter, data->function,
                                                        data->user_data);
 
-       if (data->function != NULL)
+       if (data->function)
                data->function(NULL, NULL, data->user_data);
 
 done:
@@ -137,19 +163,19 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface,
        DBusMessage *message;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL)
+       if (!path || !interface)
                return -EINVAL;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                        DBUS_INTERFACE_PROPERTIES, "GetAll");
-       if (message == NULL) {
+       if (!message) {
                dbus_free(data);
                return -ENOMEM;
        }
@@ -158,14 +184,14 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface,
 
        dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, NULL);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
@@ -193,7 +219,7 @@ static void property_get_reply(DBusPendingCall *call, void *user_data)
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
                goto done;
 
-       if (dbus_message_iter_init(reply, &iter) == FALSE)
+       if (!dbus_message_iter_init(reply, &iter))
                goto done;
 
        if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) {
@@ -201,7 +227,7 @@ static void property_get_reply(DBusPendingCall *call, void *user_data)
 
                dbus_message_iter_recurse(&iter, &variant);
 
-               if (data->function != NULL)
+               if (data->function)
                        data->function(NULL, &variant, data->user_data);
        }
 done:
@@ -219,20 +245,20 @@ int supplicant_dbus_property_get(const char *path, const char *interface,
        DBusMessage *message;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL || method == NULL)
+       if (!path || !interface || !method)
                return -EINVAL;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                        DBUS_INTERFACE_PROPERTIES, "Get");
 
-       if (message == NULL) {
+       if (!message) {
                dbus_free(data);
                return -ENOMEM;
        }
@@ -242,14 +268,14 @@ int supplicant_dbus_property_get(const char *path, const char *interface,
        dbus_message_append_args(message, DBUS_TYPE_STRING, &interface,
                                        DBUS_TYPE_STRING, &method, NULL);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
@@ -287,7 +313,7 @@ static void property_set_reply(DBusPendingCall *call, void *user_data)
 
        dbus_message_iter_init(reply, &iter);
 
-       if (data->function != NULL)
+       if (data->function)
                data->function(error, &iter, data->user_data);
 
        dbus_message_unref(reply);
@@ -306,22 +332,22 @@ int supplicant_dbus_property_set(const char *path, const char *interface,
        DBusMessageIter iter, value;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL)
+       if (!path || !interface)
                return -EINVAL;
 
-       if (key == NULL || signature == NULL || setup == NULL)
+       if (!key || !signature || !setup)
                return -EINVAL;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                        DBUS_INTERFACE_PROPERTIES, "Set");
-       if (message == NULL) {
+       if (!message) {
                dbus_free(data);
                return -ENOMEM;
        }
@@ -337,14 +363,14 @@ int supplicant_dbus_property_set(const char *path, const char *interface,
        setup(&value, user_data);
        dbus_message_iter_close_container(&iter, &value);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
@@ -361,14 +387,31 @@ int supplicant_dbus_property_set(const char *path, const char *interface,
        return 0;
 }
 
-struct method_call_data {
-       supplicant_dbus_result_function function;
-       void *user_data;
-};
+void supplicant_dbus_method_call_cancel_all(gpointer caller)
+{
+       while (method_calls) {
+               struct method_call_data *method_call;
+               GSList *elem = g_slist_find_custom(method_calls, caller,
+                                               find_method_call_by_caller);
+               if (!elem)
+                       break;
+
+               method_call = elem->data;
+               method_calls = g_slist_delete_link(method_calls, elem);
+
+               dbus_pending_call_cancel(method_call->pending_call);
+
+               if (method_call->function)
+                       method_call->function("net.connman.Error.OperationAborted",
+                                       NULL, method_call->user_data);
+
+               dbus_pending_call_unref(method_call->pending_call);
+       }
+}
 
 static void method_call_reply(DBusPendingCall *call, void *user_data)
 {
-       struct method_call_data *data = user_data;
+       struct method_call_data *method_call = user_data;
        DBusMessage *reply;
        DBusMessageIter iter;
        const char *error;
@@ -382,8 +425,8 @@ static void method_call_reply(DBusPendingCall *call, void *user_data)
 
        dbus_message_iter_init(reply, &iter);
 
-       if (data->function != NULL)
-               data->function(error, &iter, data->user_data);
+       if (method_call && method_call->function)
+               method_call->function(error, &iter, method_call->user_data);
 
        dbus_message_unref(reply);
 
@@ -394,54 +437,58 @@ int supplicant_dbus_method_call(const char *path,
                                const char *interface, const char *method,
                                supplicant_dbus_setup_function setup,
                                supplicant_dbus_result_function function,
-                                                       void *user_data)
+                               void *user_data,
+                               gpointer caller)
 {
-       struct method_call_data *data;
+       struct method_call_data *method_call = NULL;
        DBusMessage *message;
        DBusMessageIter iter;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL || method == NULL)
+       if (!path || !interface || !method)
                return -EINVAL;
 
-       data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       method_call = g_try_new0(struct method_call_data, 1);
+       if (!method_call)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                                        interface, method);
-       if (message == NULL) {
-               dbus_free(data);
+       if (!message) {
+               g_free(method_call);
                return -ENOMEM;
        }
 
        dbus_message_set_auto_start(message, FALSE);
 
        dbus_message_iter_init_append(message, &iter);
-       if (setup != NULL)
+       if (setup)
                setup(&iter, user_data);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                dbus_message_unref(message);
-               dbus_free(data);
+               g_free(method_call);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
-               dbus_free(data);
+               g_free(method_call);
                return -EIO;
        }
 
-       data->function = function;
-       data->user_data = user_data;
+       method_call->caller = caller;
+       method_call->pending_call = call;
+       method_call->function = function;
+       method_call->user_data = user_data;
+       method_calls = g_slist_prepend(method_calls, method_call);
 
-       dbus_pending_call_set_notify(call, method_call_reply,
-                                                       data, dbus_free);
+       dbus_pending_call_set_notify(call, method_call_reply, method_call,
+                               method_call_free);
 
        dbus_message_unref(message);
 
index dfe77fe..0117a1c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  WPA supplicant library with GLib integration
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -71,7 +71,10 @@ int supplicant_dbus_method_call(const char *path,
                                const char *interface, const char *method,
                                supplicant_dbus_setup_function setup,
                                supplicant_dbus_result_function function,
-                                                       void *user_data);
+                               void *user_data,
+                               void *caller);
+
+void supplicant_dbus_method_call_cancel_all(void *caller);
 
 void supplicant_dbus_property_append_basic(DBusMessageIter *iter,
                                        const char *key, int type, void *val);
index da45075..a5ec405 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  WPA supplicant library with GLib integration
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -189,6 +189,12 @@ int g_supplicant_interface_autoscan(GSupplicantInterface *interface,
                                        GSupplicantInterfaceCallback callback,
                                                        void *user_data);
 
+int g_supplicant_interface_p2p_find(GSupplicantInterface *interface,
+                                       GSupplicantInterfaceCallback callback,
+                                                       void *user_data);
+
+int g_supplicant_interface_p2p_stop_find(GSupplicantInterface *interface);
+
 int g_supplicant_interface_connect(GSupplicantInterface *interface,
                                        GSupplicantSSID *ssid,
                                        GSupplicantInterfaceCallback callback,
@@ -222,11 +228,14 @@ int g_supplicant_interface_set_country(GSupplicantInterface *interface,
                                        GSupplicantCountryCallback callback,
                                                        const char *alpha2,
                                                        void *user_data);
+bool g_supplicant_interface_has_p2p(GSupplicantInterface *interface);
 
-/* Network API */
+/* Network and Peer API */
 struct _GSupplicantNetwork;
+struct _GSupplicantPeer;
 
 typedef struct _GSupplicantNetwork GSupplicantNetwork;
+typedef struct _GSupplicantPeer GSupplicantPeer;
 
 GSupplicantInterface *g_supplicant_network_get_interface(GSupplicantNetwork *network);
 const char *g_supplicant_network_get_name(GSupplicantNetwork *network);
@@ -243,18 +252,26 @@ dbus_bool_t g_supplicant_network_is_wps_active(GSupplicantNetwork *network);
 dbus_bool_t g_supplicant_network_is_wps_pbc(GSupplicantNetwork *network);
 dbus_bool_t g_supplicant_network_is_wps_advertizing(GSupplicantNetwork *network);
 
+GSupplicantInterface *g_supplicant_peer_get_interface(GSupplicantPeer *peer);
+const char *g_supplicant_peer_get_identifier(GSupplicantPeer *peer);
+const void *g_supplicant_peer_get_device_address(GSupplicantPeer *peer);
+const char *g_supplicant_peer_get_name(GSupplicantPeer *peer);
+
 struct _GSupplicantCallbacks {
        void (*system_ready) (void);
        void (*system_killed) (void);
        void (*interface_added) (GSupplicantInterface *interface);
        void (*interface_state) (GSupplicantInterface *interface);
        void (*interface_removed) (GSupplicantInterface *interface);
+       void (*p2p_support) (GSupplicantInterface *interface);
        void (*scan_started) (GSupplicantInterface *interface);
        void (*scan_finished) (GSupplicantInterface *interface);
        void (*network_added) (GSupplicantNetwork *network);
        void (*network_removed) (GSupplicantNetwork *network);
        void (*network_changed) (GSupplicantNetwork *network,
                                        const char *property);
+       void (*peer_found) (GSupplicantPeer *peer);
+       void (*peer_lost) (GSupplicantPeer *peer);
        void (*debug) (const char *str);
 };
 
index 30f0660..2674298 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  WPA supplicant library with GLib integration
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -30,6 +30,7 @@
 #include <stdint.h>
 #include <syslog.h>
 #include <ctype.h>
+#include <stdbool.h>
 
 #include <glib.h>
 #include <gdbus.h>
@@ -152,6 +153,9 @@ struct _GSupplicantInterface {
        unsigned int scan_capa;
        unsigned int mode_capa;
        unsigned int max_scan_ssids;
+       bool p2p_checked;
+       bool p2p_support;
+       bool p2p_finding;
        dbus_bool_t ready;
        GSupplicantState state;
        dbus_bool_t scanning;
@@ -164,6 +168,7 @@ struct _GSupplicantInterface {
        struct _GSupplicantWpsCredentials wps_cred;
        GSupplicantWpsState wps_state;
        GHashTable *network_table;
+       GHashTable *peer_table;
        GHashTable *net_mapping;
        GHashTable *bss_mapping;
        void *data;
@@ -212,12 +217,20 @@ struct _GSupplicantNetwork {
        GHashTable *config_table;
 };
 
+struct _GSupplicantPeer {
+       GSupplicantInterface *interface;
+       char *path;
+       unsigned char device_address[6];
+       char *name;
+       char *identifier;
+};
+
 static inline void debug(const char *format, ...)
 {
        char str[256];
        va_list ap;
 
-       if (callbacks_pointer->debug == NULL)
+       if (!callbacks_pointer->debug)
                return;
 
        va_start(ap, format);
@@ -233,12 +246,12 @@ static inline void debug(const char *format, ...)
 
 static GSupplicantMode string2mode(const char *mode)
 {
-       if (mode == NULL)
+       if (!mode)
                return G_SUPPLICANT_MODE_UNKNOWN;
 
-       if (g_str_equal(mode, "infrastructure") == TRUE)
+       if (g_str_equal(mode, "infrastructure"))
                return G_SUPPLICANT_MODE_INFRA;
-       else if (g_str_equal(mode, "ad-hoc") == TRUE)
+       else if (g_str_equal(mode, "ad-hoc"))
                return G_SUPPLICANT_MODE_IBSS;
 
        return G_SUPPLICANT_MODE_UNKNOWN;
@@ -280,30 +293,30 @@ static const char *security2string(GSupplicantSecurity security)
 
 static GSupplicantState string2state(const char *state)
 {
-       if (state == NULL)
+       if (!state)
                return G_SUPPLICANT_STATE_UNKNOWN;
 
-       if (g_str_equal(state, "unknown") == TRUE)
+       if (g_str_equal(state, "unknown"))
                return G_SUPPLICANT_STATE_UNKNOWN;
-       else if (g_str_equal(state, "interface_disabled") == TRUE)
+       else if (g_str_equal(state, "interface_disabled"))
                return G_SUPPLICANT_STATE_DISABLED;
-       else if (g_str_equal(state, "disconnected") == TRUE)
+       else if (g_str_equal(state, "disconnected"))
                return G_SUPPLICANT_STATE_DISCONNECTED;
-       else if (g_str_equal(state, "inactive") == TRUE)
+       else if (g_str_equal(state, "inactive"))
                return G_SUPPLICANT_STATE_INACTIVE;
-       else if (g_str_equal(state, "scanning") == TRUE)
+       else if (g_str_equal(state, "scanning"))
                return G_SUPPLICANT_STATE_SCANNING;
-       else if (g_str_equal(state, "authenticating") == TRUE)
+       else if (g_str_equal(state, "authenticating"))
                return G_SUPPLICANT_STATE_AUTHENTICATING;
-       else if (g_str_equal(state, "associating") == TRUE)
+       else if (g_str_equal(state, "associating"))
                return G_SUPPLICANT_STATE_ASSOCIATING;
-       else if (g_str_equal(state, "associated") == TRUE)
+       else if (g_str_equal(state, "associated"))
                return G_SUPPLICANT_STATE_ASSOCIATED;
-       else if (g_str_equal(state, "group_handshake") == TRUE)
+       else if (g_str_equal(state, "group_handshake"))
                return G_SUPPLICANT_STATE_GROUP_HANDSHAKE;
-       else if (g_str_equal(state, "4way_handshake") == TRUE)
+       else if (g_str_equal(state, "4way_handshake"))
                return G_SUPPLICANT_STATE_4WAY_HANDSHAKE;
-       else if (g_str_equal(state, "completed") == TRUE)
+       else if (g_str_equal(state, "completed"))
                return G_SUPPLICANT_STATE_COMPLETED;
 
        return G_SUPPLICANT_STATE_UNKNOWN;
@@ -311,15 +324,15 @@ static GSupplicantState string2state(const char *state)
 
 static void callback_system_ready(void)
 {
-       if (system_ready == TRUE)
+       if (system_ready)
                return;
 
        system_ready = TRUE;
 
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->system_ready == NULL)
+       if (!callbacks_pointer->system_ready)
                return;
 
        callbacks_pointer->system_ready();
@@ -329,10 +342,10 @@ static void callback_system_killed(void)
 {
        system_ready = FALSE;
 
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->system_killed == NULL)
+       if (!callbacks_pointer->system_killed)
                return;
 
        callbacks_pointer->system_killed();
@@ -342,10 +355,10 @@ static void callback_interface_added(GSupplicantInterface *interface)
 {
        SUPPLICANT_DBG("");
 
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->interface_added == NULL)
+       if (!callbacks_pointer->interface_added)
                return;
 
        callbacks_pointer->interface_added(interface);
@@ -353,10 +366,10 @@ static void callback_interface_added(GSupplicantInterface *interface)
 
 static void callback_interface_state(GSupplicantInterface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->interface_state == NULL)
+       if (!callbacks_pointer->interface_state)
                return;
 
        callbacks_pointer->interface_state(interface);
@@ -364,21 +377,34 @@ static void callback_interface_state(GSupplicantInterface *interface)
 
 static void callback_interface_removed(GSupplicantInterface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->interface_removed == NULL)
+       if (!callbacks_pointer->interface_removed)
                return;
 
        callbacks_pointer->interface_removed(interface);
 }
 
+static void callback_p2p_support(GSupplicantInterface *interface)
+{
+       SUPPLICANT_DBG("");
+
+       if (interface->p2p_checked)
+               return;
+
+       interface->p2p_checked = true;
+
+       if (callbacks_pointer && callbacks_pointer->p2p_support)
+               callbacks_pointer->p2p_support(interface);
+}
+
 static void callback_scan_started(GSupplicantInterface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->scan_started == NULL)
+       if (!callbacks_pointer->scan_started)
                return;
 
        callbacks_pointer->scan_started(interface);
@@ -386,10 +412,10 @@ static void callback_scan_started(GSupplicantInterface *interface)
 
 static void callback_scan_finished(GSupplicantInterface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->scan_finished == NULL)
+       if (!callbacks_pointer->scan_finished)
                return;
 
        callbacks_pointer->scan_finished(interface);
@@ -397,10 +423,10 @@ static void callback_scan_finished(GSupplicantInterface *interface)
 
 static void callback_network_added(GSupplicantNetwork *network)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->network_added == NULL)
+       if (!callbacks_pointer->network_added)
                return;
 
        callbacks_pointer->network_added(network);
@@ -408,10 +434,10 @@ static void callback_network_added(GSupplicantNetwork *network)
 
 static void callback_network_removed(GSupplicantNetwork *network)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->network_removed == NULL)
+       if (!callbacks_pointer->network_removed)
                return;
 
        callbacks_pointer->network_removed(network);
@@ -420,15 +446,37 @@ static void callback_network_removed(GSupplicantNetwork *network)
 static void callback_network_changed(GSupplicantNetwork *network,
                                        const char *property)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->network_changed == NULL)
+       if (!callbacks_pointer->network_changed)
                return;
 
        callbacks_pointer->network_changed(network, property);
 }
 
+static void callback_peer_found(GSupplicantPeer *peer)
+{
+       if (!callbacks_pointer)
+               return;
+
+       if (!callbacks_pointer->peer_found)
+               return;
+
+       callbacks_pointer->peer_found(peer);
+}
+
+static void callback_peer_lost(GSupplicantPeer *peer)
+{
+       if (!callbacks_pointer)
+               return;
+
+       if (!callbacks_pointer->peer_lost)
+               return;
+
+       callbacks_pointer->peer_lost(peer);
+}
+
 static void remove_interface(gpointer data)
 {
        GSupplicantInterface *interface = data;
@@ -436,8 +484,9 @@ static void remove_interface(gpointer data)
        g_hash_table_destroy(interface->bss_mapping);
        g_hash_table_destroy(interface->net_mapping);
        g_hash_table_destroy(interface->network_table);
+       g_hash_table_destroy(interface->peer_table);
 
-       if (interface->scan_callback != NULL) {
+       if (interface->scan_callback) {
                SUPPLICANT_DBG("call interface %p callback %p scanning %d",
                                interface, interface->scan_callback,
                                interface->scanning);
@@ -446,7 +495,7 @@ static void remove_interface(gpointer data)
                 interface->scan_callback = NULL;
                 interface->scan_data = NULL;
 
-               if (interface->scanning == TRUE) {
+               if (interface->scanning) {
                        interface->scanning = FALSE;
                        callback_scan_finished(interface);
                }
@@ -487,12 +536,23 @@ static void remove_bss(gpointer data)
        g_free(bss);
 }
 
+static void remove_peer(gpointer data)
+{
+       GSupplicantPeer *peer = data;
+
+       g_free(peer->path);
+       g_free(peer->name);
+       g_free(peer->identifier);
+
+       g_free(peer);
+}
+
 static void debug_strvalmap(const char *label, struct strvalmap *map,
                                                        unsigned int val)
 {
        int i;
 
-       for (i = 0; map[i].str != NULL; i++) {
+       for (i = 0; map[i].str; i++) {
                if (val & map[i].val)
                        SUPPLICANT_DBG("%s: %s", label, map[i].str);
        }
@@ -505,10 +565,10 @@ static void interface_capability_keymgmt(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; keymgmt_map[i].str != NULL; i++)
+       for (i = 0; keymgmt_map[i].str; i++)
                if (strcmp(str, keymgmt_map[i].str) == 0) {
                        interface->keymgmt_capa |= keymgmt_map[i].val;
                        break;
@@ -522,10 +582,10 @@ static void interface_capability_authalg(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; authalg_capa_map[i].str != NULL; i++)
+       for (i = 0; authalg_capa_map[i].str; i++)
                if (strcmp(str, authalg_capa_map[i].str) == 0) {
                        interface->authalg_capa |= authalg_capa_map[i].val;
                        break;
@@ -539,10 +599,10 @@ static void interface_capability_proto(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; proto_capa_map[i].str != NULL; i++)
+       for (i = 0; proto_capa_map[i].str; i++)
                if (strcmp(str, proto_capa_map[i].str) == 0) {
                        interface->proto_capa |= proto_capa_map[i].val;
                        break;
@@ -557,10 +617,10 @@ static void interface_capability_pairwise(DBusMessageIter *iter,
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; pairwise_map[i].str != NULL; i++)
+       for (i = 0; pairwise_map[i].str; i++)
                if (strcmp(str, pairwise_map[i].str) == 0) {
                        interface->pairwise_capa |= pairwise_map[i].val;
                        break;
@@ -574,10 +634,10 @@ static void interface_capability_group(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; group_map[i].str != NULL; i++)
+       for (i = 0; group_map[i].str; i++)
                if (strcmp(str, group_map[i].str) == 0) {
                        interface->group_capa |= group_map[i].val;
                        break;
@@ -591,10 +651,10 @@ static void interface_capability_scan(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; scan_capa_map[i].str != NULL; i++)
+       for (i = 0; scan_capa_map[i].str; i++)
                if (strcmp(str, scan_capa_map[i].str) == 0) {
                        interface->scan_capa |= scan_capa_map[i].val;
                        break;
@@ -608,10 +668,10 @@ static void interface_capability_mode(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; mode_capa_map[i].str != NULL; i++)
+       for (i = 0; mode_capa_map[i].str; i++)
                if (strcmp(str, mode_capa_map[i].str) == 0) {
                        interface->mode_capa |= mode_capa_map[i].val;
                        break;
@@ -623,7 +683,7 @@ static void interface_capability(const char *key, DBusMessageIter *iter,
 {
        GSupplicantInterface *interface = user_data;
 
-       if (key == NULL)
+       if (!key)
                return;
 
        if (g_strcmp0(key, "KeyMgmt") == 0)
@@ -679,15 +739,18 @@ int g_supplicant_interface_set_apscan(GSupplicantInterface *interface,
 void g_supplicant_interface_set_data(GSupplicantInterface *interface,
                                                                void *data)
 {
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface->data = data;
+
+       if (!data)
+               interface->scan_callback = NULL;
 }
 
 void *g_supplicant_interface_get_data(GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        return interface->data;
@@ -695,7 +758,7 @@ void *g_supplicant_interface_get_data(GSupplicantInterface *interface)
 
 const char *g_supplicant_interface_get_ifname(GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        return interface->ifname;
@@ -703,7 +766,7 @@ const char *g_supplicant_interface_get_ifname(GSupplicantInterface *interface)
 
 const char *g_supplicant_interface_get_driver(GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        return interface->driver;
@@ -712,7 +775,7 @@ const char *g_supplicant_interface_get_driver(GSupplicantInterface *interface)
 GSupplicantState g_supplicant_interface_get_state(
                                        GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return G_SUPPLICANT_STATE_UNKNOWN;
 
        return interface->state;
@@ -720,7 +783,7 @@ GSupplicantState g_supplicant_interface_get_state(
 
 const char *g_supplicant_interface_get_wps_key(GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        return (const char *)interface->wps_cred.key;
@@ -729,10 +792,10 @@ const char *g_supplicant_interface_get_wps_key(GSupplicantInterface *interface)
 const void *g_supplicant_interface_get_wps_ssid(GSupplicantInterface *interface,
                                                        unsigned int *ssid_len)
 {
-       if (ssid_len == NULL)
+       if (!ssid_len)
                return NULL;
 
-       if (interface == NULL || interface->wps_cred.ssid == NULL) {
+       if (!interface || interface->wps_cred.ssid_len == 0) {
                *ssid_len = 0;
                return NULL;
        }
@@ -744,7 +807,7 @@ const void *g_supplicant_interface_get_wps_ssid(GSupplicantInterface *interface,
 GSupplicantWpsState g_supplicant_interface_get_wps_state(
                                        GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return G_SUPPLICANT_WPS_STATE_UNKNOWN;
 
        return interface->wps_state;
@@ -752,7 +815,7 @@ GSupplicantWpsState g_supplicant_interface_get_wps_state(
 
 unsigned int g_supplicant_interface_get_mode(GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return 0;
 
        return interface->mode_capa;
@@ -761,7 +824,7 @@ unsigned int g_supplicant_interface_get_mode(GSupplicantInterface *interface)
 unsigned int g_supplicant_interface_get_max_scan_ssids(
                                GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return 0;
 
        return interface->max_scan_ssids;
@@ -777,10 +840,10 @@ static void set_network_enabled(DBusMessageIter *iter, void *user_data)
 int g_supplicant_interface_enable_selected_network(GSupplicantInterface *interface,
                                                        dbus_bool_t enable)
 {
-       if (interface == NULL)
+       if (!interface)
                return -1;
 
-       if (interface->network_path == NULL)
+       if (!interface->network_path)
                return -1;
 
        SUPPLICANT_DBG(" ");
@@ -792,7 +855,7 @@ int g_supplicant_interface_enable_selected_network(GSupplicantInterface *interfa
 
 dbus_bool_t g_supplicant_interface_get_ready(GSupplicantInterface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return FALSE;
 
        return interface->ready;
@@ -801,7 +864,7 @@ dbus_bool_t g_supplicant_interface_get_ready(GSupplicantInterface *interface)
 GSupplicantInterface *g_supplicant_network_get_interface(
                                        GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return NULL;
 
        return network->interface;
@@ -809,7 +872,7 @@ GSupplicantInterface *g_supplicant_network_get_interface(
 
 const char *g_supplicant_network_get_name(GSupplicantNetwork *network)
 {
-       if (network == NULL || network->name == NULL)
+       if (!network || !network->name)
                return "";
 
        return network->name;
@@ -817,7 +880,7 @@ const char *g_supplicant_network_get_name(GSupplicantNetwork *network)
 
 const char *g_supplicant_network_get_identifier(GSupplicantNetwork *network)
 {
-       if (network == NULL || network->group == NULL)
+       if (!network || !network->group)
                return "";
 
        return network->group;
@@ -825,7 +888,7 @@ const char *g_supplicant_network_get_identifier(GSupplicantNetwork *network)
 
 const char *g_supplicant_network_get_path(GSupplicantNetwork *network)
 {
-       if (network == NULL || network->path == NULL)
+       if (!network || !network->path)
                return NULL;
 
        return network->path;
@@ -833,7 +896,7 @@ const char *g_supplicant_network_get_path(GSupplicantNetwork *network)
 
 const char *g_supplicant_network_get_mode(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return G_SUPPLICANT_MODE_UNKNOWN;
 
        return mode2string(network->mode);
@@ -841,7 +904,7 @@ const char *g_supplicant_network_get_mode(GSupplicantNetwork *network)
 
 const char *g_supplicant_network_get_security(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return G_SUPPLICANT_SECURITY_UNKNOWN;
 
        return security2string(network->security);
@@ -850,7 +913,7 @@ const char *g_supplicant_network_get_security(GSupplicantNetwork *network)
 const void *g_supplicant_network_get_ssid(GSupplicantNetwork *network,
                                                unsigned int *ssid_len)
 {
-       if (network == NULL || network->ssid == NULL) {
+       if (!network) {
                *ssid_len = 0;
                return NULL;
        }
@@ -861,7 +924,7 @@ const void *g_supplicant_network_get_ssid(GSupplicantNetwork *network,
 
 dbus_int16_t g_supplicant_network_get_signal(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return 0;
 
        return network->signal;
@@ -869,7 +932,7 @@ dbus_int16_t g_supplicant_network_get_signal(GSupplicantNetwork *network)
 
 dbus_uint16_t g_supplicant_network_get_frequency(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return 0;
 
        return network->frequency;
@@ -877,7 +940,7 @@ dbus_uint16_t g_supplicant_network_get_frequency(GSupplicantNetwork *network)
 
 dbus_bool_t g_supplicant_network_get_wps(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return FALSE;
 
        return network->wps;
@@ -885,7 +948,7 @@ dbus_bool_t g_supplicant_network_get_wps(GSupplicantNetwork *network)
 
 dbus_bool_t g_supplicant_network_is_wps_active(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return FALSE;
 
        if (network->wps_capabilities & G_SUPPLICANT_WPS_CONFIGURED)
@@ -896,7 +959,7 @@ dbus_bool_t g_supplicant_network_is_wps_active(GSupplicantNetwork *network)
 
 dbus_bool_t g_supplicant_network_is_wps_pbc(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return FALSE;
 
        if (network->wps_capabilities & G_SUPPLICANT_WPS_PBC)
@@ -907,7 +970,7 @@ dbus_bool_t g_supplicant_network_is_wps_pbc(GSupplicantNetwork *network)
 
 dbus_bool_t g_supplicant_network_is_wps_advertizing(GSupplicantNetwork *network)
 {
-       if (network == NULL)
+       if (!network)
                return FALSE;
 
        if (network->wps_capabilities & G_SUPPLICANT_WPS_REGISTRAR)
@@ -916,6 +979,38 @@ dbus_bool_t g_supplicant_network_is_wps_advertizing(GSupplicantNetwork *network)
        return FALSE;
 }
 
+GSupplicantInterface *g_supplicant_peer_get_interface(GSupplicantPeer *peer)
+{
+       if (!peer)
+               return NULL;
+
+       return peer->interface;
+}
+
+const char *g_supplicant_peer_get_identifier(GSupplicantPeer *peer)
+{
+       if (!peer)
+               return NULL;
+
+       return peer->identifier;
+}
+
+const void *g_supplicant_peer_get_device_address(GSupplicantPeer *peer)
+{
+       if (!peer)
+               return NULL;
+
+       return peer->device_address;
+}
+
+const char *g_supplicant_peer_get_name(GSupplicantPeer *peer)
+{
+       if (!peer)
+               return NULL;
+
+       return peer->name;
+}
+
 static void merge_network(GSupplicantNetwork *network)
 {
        GString *str;
@@ -929,13 +1024,13 @@ static void merge_network(GSupplicantNetwork *network)
 
        SUPPLICANT_DBG("ssid %s mode %s", ssid, mode);
 
-       if (ssid != NULL)
+       if (ssid)
                ssid_len = strlen(ssid);
        else
                ssid_len = 0;
 
        str = g_string_sized_new((ssid_len * 2) + 24);
-       if (str == NULL)
+       if (!str)
                return;
 
        for (i = 0; i < ssid_len; i++)
@@ -966,10 +1061,10 @@ static void network_property(const char *key, DBusMessageIter *iter,
 {
        GSupplicantNetwork *network = user_data;
 
-       if (network->interface == NULL)
+       if (!network->interface)
                return;
 
-       if (key == NULL) {
+       if (!key) {
                merge_network(network);
                return;
        }
@@ -982,7 +1077,7 @@ static void network_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL) {
+               if (str) {
                        g_hash_table_replace(network->config_table,
                                                g_strdup(key), g_strdup(str));
                }
@@ -1000,18 +1095,18 @@ static void interface_network_added(DBusMessageIter *iter, void *user_data)
        SUPPLICANT_DBG("");
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        if (g_strcmp0(path, "/") == 0)
                return;
 
        network = g_hash_table_lookup(interface->net_mapping, path);
-       if (network != NULL)
+       if (network)
                return;
 
        network = g_try_new0(GSupplicantNetwork, 1);
-       if (network == NULL)
+       if (!network)
                return;
 
        network->interface = interface;
@@ -1040,11 +1135,11 @@ static void interface_network_removed(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        network = g_hash_table_lookup(interface->net_mapping, path);
-       if (network == NULL)
+       if (!network)
                return;
 
        g_hash_table_remove(interface->net_mapping, path);
@@ -1065,13 +1160,13 @@ static char *create_name(unsigned char *ssid, int ssid_len)
 
        while (remaining_bytes != 0) {
                if (g_utf8_validate(remainder, remaining_bytes,
-                                       &invalid) == TRUE) {
+                                       &invalid)) {
                        break;
                }
 
                valid_bytes = invalid - remainder;
 
-               if (string == NULL)
+               if (!string)
                        string = g_string_sized_new(remaining_bytes);
 
                g_string_append_len(string, remainder, valid_bytes);
@@ -1083,7 +1178,7 @@ static char *create_name(unsigned char *ssid, int ssid_len)
                remainder = invalid + 1;
        }
 
-       if (string == NULL)
+       if (!string)
                return g_strndup((const gchar *)ssid, ssid_len + 1);
 
        g_string_append(string, remainder);
@@ -1098,7 +1193,7 @@ static char *create_group(struct g_supplicant_bss *bss)
        const char *mode, *security;
 
        str = g_string_sized_new((bss->ssid_len * 2) + 24);
-       if (str == NULL)
+       if (!str)
                return NULL;
 
        if (bss->ssid_len > 0 && bss->ssid[0] != '\0') {
@@ -1108,11 +1203,11 @@ static char *create_group(struct g_supplicant_bss *bss)
                g_string_append_printf(str, "hidden");
 
        mode = mode2string(bss->mode);
-       if (mode != NULL)
+       if (mode)
                g_string_append_printf(str, "_%s", mode);
 
        security = security2string(bss->security);
-       if (security != NULL)
+       if (security)
                g_string_append_printf(str, "_%s", security);
 
        return g_string_free(str, FALSE);
@@ -1127,11 +1222,11 @@ static void add_or_replace_bss_to_network(struct g_supplicant_bss *bss)
        group = create_group(bss);
        SUPPLICANT_DBG("New group created: %s", group);
 
-       if (group == NULL)
+       if (!group)
                return;
 
        network = g_hash_table_lookup(interface->network_table, group);
-       if (network != NULL) {
+       if (network) {
                g_free(group);
                SUPPLICANT_DBG("Network %s already exist", network->name);
 
@@ -1139,13 +1234,13 @@ static void add_or_replace_bss_to_network(struct g_supplicant_bss *bss)
        }
 
        network = g_try_new0(GSupplicantNetwork, 1);
-       if (network == NULL) {
+       if (!network) {
                g_free(group);
                return;
        }
 
        network->interface = interface;
-       if (network->path == NULL)
+       if (!network->path)
                network->path = g_strdup(bss->path);
        network->group = group;
        network->name = create_name(bss->ssid, bss->ssid_len);
@@ -1209,10 +1304,10 @@ static void bss_keymgmt(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; keymgmt_map[i].str != NULL; i++)
+       for (i = 0; keymgmt_map[i].str; i++)
                if (strcmp(str, keymgmt_map[i].str) == 0) {
                        SUPPLICANT_DBG("Keymgmt: %s", str);
                        *keymgmt |= keymgmt_map[i].val;
@@ -1227,10 +1322,10 @@ static void bss_group(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; group_map[i].str != NULL; i++)
+       for (i = 0; group_map[i].str; i++)
                if (strcmp(str, group_map[i].str) == 0) {
                        SUPPLICANT_DBG("Group: %s", str);
                        *group |= group_map[i].val;
@@ -1245,10 +1340,10 @@ static void bss_pairwise(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; pairwise_map[i].str != NULL; i++)
+       for (i = 0; pairwise_map[i].str; i++)
                if (strcmp(str, pairwise_map[i].str) == 0) {
                        SUPPLICANT_DBG("Pairwise: %s", str);
                        *pairwise |= pairwise_map[i].val;
@@ -1267,21 +1362,21 @@ static void bss_wpa(const char *key, DBusMessageIter *iter,
        if (g_strcmp0(key, "KeyMgmt") == 0) {
                supplicant_dbus_array_foreach(iter, bss_keymgmt, &value);
 
-               if (bss->rsn_selected == TRUE)
+               if (bss->rsn_selected)
                        bss->rsn_keymgmt = value;
                else
                        bss->wpa_keymgmt = value;
        } else if (g_strcmp0(key, "Group") == 0) {
                supplicant_dbus_array_foreach(iter, bss_group, &value);
 
-               if (bss->rsn_selected == TRUE)
+               if (bss->rsn_selected)
                        bss->rsn_group = value;
                else
                        bss->wpa_group = value;
        } else if (g_strcmp0(key, "Pairwise") == 0) {
                supplicant_dbus_array_foreach(iter, bss_pairwise, &value);
 
-               if (bss->rsn_selected == TRUE)
+               if (bss->rsn_selected)
                        bss->rsn_pairwise = value;
                else
                        bss->wpa_pairwise = value;
@@ -1353,7 +1448,7 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data)
        dbus_message_iter_recurse(iter, &array);
        dbus_message_iter_get_fixed_array(&array, &ie, &ie_len);
 
-       if (ie == NULL || ie_len < 2)
+       if (!ie || ie_len < 2)
                return;
 
        bss->wps_capabilities = 0;
@@ -1420,11 +1515,11 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
                                G_SUPPLICANT_KEYMGMT_WPA_PSK_256))
                bss->psk = TRUE;
 
-       if (bss->ieee8021x == TRUE)
+       if (bss->ieee8021x)
                bss->security = G_SUPPLICANT_SECURITY_IEEE8021X;
-       else if (bss->psk == TRUE)
+       else if (bss->psk)
                bss->security = G_SUPPLICANT_SECURITY_PSK;
-       else if (bss->privacy == TRUE)
+       else if (bss->privacy)
                bss->security = G_SUPPLICANT_SECURITY_WEP;
        else
                bss->security = G_SUPPLICANT_SECURITY_NONE;
@@ -1436,12 +1531,12 @@ static void bss_property(const char *key, DBusMessageIter *iter,
 {
        struct g_supplicant_bss *bss = user_data;
 
-       if (bss->interface == NULL)
+       if (!bss->interface)
                return;
 
        SUPPLICANT_DBG("key %s", key);
 
-       if (key == NULL)
+       if (!key)
                return;
 
        if (g_strcmp0(key, "BSSID") == 0) {
@@ -1540,7 +1635,7 @@ static struct g_supplicant_bss *interface_bss_added(DBusMessageIter *iter,
        SUPPLICANT_DBG("");
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return NULL;
 
        if (g_strcmp0(path, "/") == 0)
@@ -1549,14 +1644,14 @@ static struct g_supplicant_bss *interface_bss_added(DBusMessageIter *iter,
        SUPPLICANT_DBG("%s", path);
 
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network != NULL) {
+       if (network) {
                bss = g_hash_table_lookup(network->bss_table, path);
-               if (bss != NULL)
+               if (bss)
                        return NULL;
        }
 
        bss = g_try_new0(struct g_supplicant_bss, 1);
-       if (bss == NULL)
+       if (!bss)
                return NULL;
 
        bss->interface = interface;
@@ -1573,7 +1668,7 @@ static void interface_bss_added_with_keys(DBusMessageIter *iter,
        SUPPLICANT_DBG("");
 
        bss = interface_bss_added(iter, user_data);
-       if (bss == NULL)
+       if (!bss)
                return;
 
        dbus_message_iter_next(iter);
@@ -1595,7 +1690,7 @@ static void interface_bss_added_without_keys(DBusMessageIter *iter,
        SUPPLICANT_DBG("");
 
        bss = interface_bss_added(iter, user_data);
-       if (bss == NULL)
+       if (!bss)
                return;
 
        supplicant_dbus_property_get_all(bss->path,
@@ -1636,11 +1731,11 @@ static void interface_bss_removed(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network == NULL)
+       if (!network)
                return;
 
        g_hash_table_remove(bss_mapping, path);
@@ -1659,12 +1754,12 @@ static void interface_property(const char *key, DBusMessageIter *iter,
 {
        GSupplicantInterface *interface = user_data;
 
-       if (interface == NULL)
+       if (!interface)
                return;
 
        SUPPLICANT_DBG("%s", key);
 
-       if (key == NULL) {
+       if (!key) {
                debug_strvalmap("KeyMgmt capability", keymgmt_map,
                                                interface->keymgmt_capa);
                debug_strvalmap("AuthAlg capability", authalg_capa_map,
@@ -1680,7 +1775,9 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                debug_strvalmap("Mode capability", mode_capa_map,
                                                interface->mode_capa);
 
-               callback_interface_added(interface);
+               if (interface->ready)
+                       callback_interface_added(interface);
+
                return;
        }
 
@@ -1691,7 +1788,7 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL)
+               if (str)
                        if (string2state(str) != interface->state) {
                                interface->state = string2state(str);
                                callback_interface_state(interface);
@@ -1708,8 +1805,8 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                dbus_message_iter_get_basic(iter, &scanning);
                interface->scanning = scanning;
 
-               if (interface->ready == TRUE) {
-                       if (interface->scanning == TRUE)
+               if (interface->ready) {
+                       if (interface->scanning)
                                callback_scan_started(interface);
                        else
                                callback_scan_finished(interface);
@@ -1723,7 +1820,7 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL) {
+               if (str) {
                        g_free(interface->ifname);
                        interface->ifname = g_strdup(str);
                }
@@ -1731,7 +1828,7 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL) {
+               if (str) {
                        g_free(interface->driver);
                        interface->driver = g_strdup(str);
                }
@@ -1739,7 +1836,7 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL) {
+               if (str) {
                        g_free(interface->bridge);
                        interface->bridge = g_strdup(str);
                }
@@ -1748,8 +1845,9 @@ static void interface_property(const char *key, DBusMessageIter *iter,
        } else if (g_strcmp0(key, "CurrentNetwork") == 0) {
                interface_network_added(iter, interface);
        } else if (g_strcmp0(key, "BSSs") == 0) {
-               supplicant_dbus_array_foreach(iter, interface_bss_added_without_keys,
-                                                               interface);
+               supplicant_dbus_array_foreach(iter,
+                                       interface_bss_added_without_keys,
+                                       interface);
        } else if (g_strcmp0(key, "Blobs") == 0) {
                /* Nothing */
        } else if (g_strcmp0(key, "Networks") == 0) {
@@ -1766,12 +1864,12 @@ static void scan_network_update(DBusMessageIter *iter, void *user_data)
        GSupplicantNetwork *network;
        char *path;
 
-       if (iter == NULL)
+       if (!iter)
                return;
 
        dbus_message_iter_get_basic(iter, &path);
 
-       if (path == NULL)
+       if (!path)
                return;
 
        if (g_strcmp0(path, "/") == 0)
@@ -1779,7 +1877,7 @@ static void scan_network_update(DBusMessageIter *iter, void *user_data)
 
        /* Update the network details based on scan BSS data */
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network != NULL)
+       if (network)
                callback_network_added(network);
 }
 
@@ -1792,7 +1890,7 @@ static void scan_bss_data(const char *key, DBusMessageIter *iter,
                supplicant_dbus_array_foreach(iter, scan_network_update,
                                                interface);
 
-       if (interface->scan_callback != NULL)
+       if (interface->scan_callback)
                interface->scan_callback(0, interface, interface->scan_data);
 
        interface->scan_callback = NULL;
@@ -1804,14 +1902,15 @@ static GSupplicantInterface *interface_alloc(const char *path)
        GSupplicantInterface *interface;
 
        interface = g_try_new0(GSupplicantInterface, 1);
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        interface->path = g_strdup(path);
 
        interface->network_table = g_hash_table_new_full(g_str_hash,
                                        g_str_equal, NULL, remove_network);
-
+       interface->peer_table = g_hash_table_new_full(g_str_hash,
+                                       g_str_equal, NULL, remove_peer);
        interface->net_mapping = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                                NULL, NULL);
        interface->bss_mapping = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -1822,6 +1921,25 @@ static GSupplicantInterface *interface_alloc(const char *path)
        return interface;
 }
 
+static void interface_p2p_flush(const char *error,
+                               DBusMessageIter *iter, void *user_data)
+{
+       GSupplicantInterface *interface = user_data;
+
+       if (error) {
+               if (!g_strcmp0(error,
+                               "org.freedesktop.DBus.Error.UnknownMethod")) {
+                       SUPPLICANT_DBG("wpa_supplicant does not support P2P");
+               } else {
+                       SUPPLICANT_DBG("interface %s does not support P2P",
+                                                       interface->ifname);
+               }
+       } else
+               interface->p2p_support = true;
+
+       callback_p2p_support(interface);
+}
+
 static void interface_added(DBusMessageIter *iter, void *user_data)
 {
        GSupplicantInterface *interface;
@@ -1830,20 +1948,24 @@ static void interface_added(DBusMessageIter *iter, void *user_data)
        SUPPLICANT_DBG("");
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        if (g_strcmp0(path, "/") == 0)
                return;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface != NULL)
+       if (interface)
                return;
 
        interface = interface_alloc(path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
+       supplicant_dbus_method_call(path,
+                       SUPPLICANT_INTERFACE ".Interface.P2PDevice", "Flush",
+                       NULL, interface_p2p_flush, interface, NULL);
+
        dbus_message_iter_next(iter);
        if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
                supplicant_dbus_property_foreach(iter, interface_property,
@@ -1860,11 +1982,16 @@ static void interface_added(DBusMessageIter *iter, void *user_data)
 static void interface_removed(DBusMessageIter *iter, void *user_data)
 {
        const char *path = NULL;
+       GSupplicantInterface *interface = user_data;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
+       interface = g_hash_table_lookup(interface_table, path);
+       SUPPLICANT_DBG("Cancelling any pending DBus calls");
+       supplicant_dbus_method_call_cancel_all(interface);
+
        g_hash_table_remove(interface_table, path);
 }
 
@@ -1874,10 +2001,10 @@ static void eap_method(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; eap_method_map[i].str != NULL; i++)
+       for (i = 0; eap_method_map[i].str; i++)
                if (strcmp(str, eap_method_map[i].str) == 0) {
                        eap_methods |= eap_method_map[i].val;
                        break;
@@ -1887,7 +2014,7 @@ static void eap_method(DBusMessageIter *iter, void *user_data)
 static void service_property(const char *key, DBusMessageIter *iter,
                                                        void *user_data)
 {
-       if (key == NULL) {
+       if (!key) {
                callback_system_ready();
                return;
        }
@@ -1897,7 +2024,7 @@ static void service_property(const char *key, DBusMessageIter *iter,
                int i;
 
                dbus_message_iter_get_basic(iter, &str);
-               for (i = 0; debug_strings[i] != NULL; i++)
+               for (i = 0; debug_strings[i]; i++)
                        if (g_strcmp0(debug_strings[i], str) == 0) {
                                debug_level = i;
                                break;
@@ -1934,7 +2061,7 @@ static void signal_name_owner_changed(const char *path, DBusMessageIter *iter)
                return;
 
        dbus_message_iter_get_basic(iter, &name);
-       if (name == NULL)
+       if (!name)
                return;
 
        if (g_strcmp0(name, SUPPLICANT_SERVICE) != 0)
@@ -1945,7 +2072,7 @@ static void signal_name_owner_changed(const char *path, DBusMessageIter *iter)
        dbus_message_iter_next(iter);
        dbus_message_iter_get_basic(iter, &new);
 
-       if (old == NULL || new == NULL)
+       if (!old || !new)
                return;
 
        if (strlen(old) > 0 && strlen(new) == 0) {
@@ -1996,7 +2123,7 @@ static void signal_interface_changed(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        supplicant_dbus_property_foreach(iter, interface_property, interface);
@@ -2010,17 +2137,22 @@ static void signal_scan_done(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        dbus_message_iter_get_basic(iter, &success);
 
+       if (interface->scanning) {
+               callback_scan_finished(interface);
+               interface->scanning = FALSE;
+       }
+
        /*
         * If scan is unsuccessful return -EIO else get the scanned BSSs
         * and update the network details accordingly
         */
-       if (success == FALSE) {
-               if (interface->scan_callback != NULL)
+       if (!success) {
+               if (interface->scan_callback)
                        interface->scan_callback(-EIO, interface,
                                                interface->scan_data);
 
@@ -2041,7 +2173,7 @@ static void signal_bss_added(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_bss_added_with_keys(iter, interface);
@@ -2054,7 +2186,7 @@ static void signal_bss_removed(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_bss_removed(iter, interface);
@@ -2067,7 +2199,7 @@ static void signal_network_added(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_network_added(iter, interface);
@@ -2080,7 +2212,7 @@ static void signal_network_removed(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_network_removed(iter, interface);
@@ -2096,15 +2228,15 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(bss_mapping, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network == NULL)
+       if (!network)
                return;
 
        bss = g_hash_table_lookup(network->bss_table, path);
-       if (bss == NULL)
+       if (!bss)
                return;
 
        supplicant_dbus_property_foreach(iter, bss_property, bss);
@@ -2129,7 +2261,7 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter)
                 * plugin about it. */
 
                new_bss = g_try_new0(struct g_supplicant_bss, 1);
-               if (new_bss == NULL)
+               if (!new_bss)
                        return;
 
                memcpy(new_bss, bss, sizeof(struct g_supplicant_bss));
@@ -2159,7 +2291,8 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter)
                network->best_bss = bss;
        }
 
-       SUPPLICANT_DBG("New network signal for %s %d dBm", network->ssid, network->signal);
+       SUPPLICANT_DBG("New network signal for %s %d dBm", network->ssid,
+                       network->signal);
 
        callback_network_changed(network, "Signal");
 }
@@ -2169,7 +2302,7 @@ static void wps_credentials(const char *key, DBusMessageIter *iter,
 {
        GSupplicantInterface *interface = user_data;
 
-       if (key == NULL)
+       if (!key)
                return;
 
        SUPPLICANT_DBG("key %s", key);
@@ -2186,7 +2319,7 @@ static void wps_credentials(const char *key, DBusMessageIter *iter,
                interface->wps_cred.key = g_try_malloc0(
                                                sizeof(char) * key_len + 1);
 
-               if (interface->wps_cred.key == NULL)
+               if (!interface->wps_cred.key)
                        return;
 
                memcpy(interface->wps_cred.key, key_val,
@@ -2218,7 +2351,7 @@ static void signal_wps_credentials(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        supplicant_dbus_property_foreach(iter, wps_credentials, interface);
@@ -2229,7 +2362,7 @@ static void wps_event_args(const char *key, DBusMessageIter *iter,
 {
        GSupplicantInterface *interface = user_data;
 
-       if (key == NULL || interface == NULL)
+       if (!key || !interface)
                return;
 
        SUPPLICANT_DBG("Arg Key %s", key);
@@ -2243,7 +2376,7 @@ static void signal_wps_event(const char *path, DBusMessageIter *iter)
        SUPPLICANT_DBG("");
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        dbus_message_iter_get_basic(iter, &name);
@@ -2252,7 +2385,7 @@ static void signal_wps_event(const char *path, DBusMessageIter *iter)
 
        if (g_strcmp0(name, "success") == 0)
                interface->wps_state = G_SUPPLICANT_WPS_STATE_SUCCESS;
-       else if (g_strcmp0(name, "failed") == 0)
+       else if (g_strcmp0(name, "fail") == 0)
                interface->wps_state = G_SUPPLICANT_WPS_STATE_FAIL;
        else
                interface->wps_state = G_SUPPLICANT_WPS_STATE_UNKNOWN;
@@ -2265,6 +2398,129 @@ static void signal_wps_event(const char *path, DBusMessageIter *iter)
        supplicant_dbus_property_foreach(iter, wps_event_args, interface);
 }
 
+static void create_peer_identifier(GSupplicantPeer *peer)
+{
+       const unsigned char test[6] = {};
+
+       if (!peer)
+               return;
+
+       if (!memcmp(peer->device_address, test, 6)) {
+               peer->identifier = g_strdup(peer->name);
+               return;
+       }
+
+       peer->identifier = g_malloc0(19);
+       snprintf(peer->identifier, 19, "%02x%02x%02x%02x%02x%02x",
+                                               peer->device_address[0],
+                                               peer->device_address[1],
+                                               peer->device_address[2],
+                                               peer->device_address[3],
+                                               peer->device_address[4],
+                                               peer->device_address[5]);
+}
+
+static void peer_property(const char *key, DBusMessageIter *iter,
+                                                       void *user_data)
+{
+       GSupplicantPeer *peer = user_data;
+
+       SUPPLICANT_DBG("key: %s", key);
+
+       if (!peer->interface)
+               return;
+
+       if (!key) {
+               if (peer->name) {
+                       create_peer_identifier(peer);
+                       callback_peer_found(peer);
+               }
+
+               return;
+       }
+
+       if (g_strcmp0(key, "DeviceAddress") == 0) {
+               unsigned char *dev_addr;
+               DBusMessageIter array;
+               int len;
+
+               dbus_message_iter_recurse(iter, &array);
+               dbus_message_iter_get_fixed_array(&array, &dev_addr, &len);
+
+               if (len == 6)
+                       memcpy(peer->device_address, dev_addr, len);
+       } else if (g_strcmp0(key, "DeviceName") == 0) {
+               const char *str = NULL;
+
+               dbus_message_iter_get_basic(iter, &str);
+               if (str)
+                       peer->name = g_strdup(str);
+       }
+}
+
+static void signal_peer_found(const char *path, DBusMessageIter *iter)
+{
+       GSupplicantInterface *interface;
+       const char *obj_path = NULL;
+       GSupplicantPeer *peer;
+
+       SUPPLICANT_DBG("");
+
+       interface = g_hash_table_lookup(interface_table, path);
+       if (!interface)
+               return;
+
+       dbus_message_iter_get_basic(iter, &obj_path);
+       if (!obj_path || g_strcmp0(obj_path, "/") == 0)
+               return;
+
+       peer = g_hash_table_lookup(interface->peer_table, obj_path);
+       if (peer)
+               return;
+
+       peer = g_try_new0(GSupplicantPeer, 1);
+       if (!peer)
+               return;
+
+       peer->interface = interface;
+       peer->path = g_strdup(obj_path);
+       g_hash_table_insert(interface->peer_table, peer->path, peer);
+
+       dbus_message_iter_next(iter);
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
+               supplicant_dbus_property_foreach(iter, peer_property, peer);
+               peer_property(NULL, NULL, peer);
+               return;
+       }
+
+       supplicant_dbus_property_get_all(obj_path,
+                       SUPPLICANT_INTERFACE ".Peer", peer_property, peer);
+}
+
+static void signal_peer_lost(const char *path, DBusMessageIter *iter)
+{
+       GSupplicantInterface *interface;
+       const char *obj_path = NULL;
+       GSupplicantPeer *peer;
+
+       SUPPLICANT_DBG("");
+
+       interface = g_hash_table_lookup(interface_table, path);
+       if (!interface)
+               return;
+
+       dbus_message_iter_get_basic(iter, &obj_path);
+       if (!obj_path || g_strcmp0(obj_path, "/") == 0)
+               return;
+
+       peer = g_hash_table_lookup(interface->peer_table, obj_path);
+       if (!peer)
+               return;
+
+       callback_peer_lost(peer);
+       g_hash_table_remove(interface->peer_table, obj_path);
+}
+
 static struct {
        const char *interface;
        const char *member;
@@ -2289,6 +2545,9 @@ static struct {
        { SUPPLICANT_INTERFACE ".Interface.WPS", "Credentials", signal_wps_credentials },
        { SUPPLICANT_INTERFACE ".Interface.WPS", "Event",       signal_wps_event       },
 
+       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "DeviceFound", signal_peer_found },
+       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "DeviceLost",  signal_peer_lost  },
+
        { }
 };
 
@@ -2300,19 +2559,17 @@ static DBusHandlerResult g_supplicant_filter(DBusConnection *conn,
        int i;
 
        path = dbus_message_get_path(message);
-       if (path == NULL)
+       if (!path)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       for (i = 0; signal_map[i].interface != NULL; i++) {
-               if (dbus_message_has_interface(message,
-                                       signal_map[i].interface) == FALSE)
+       for (i = 0; signal_map[i].interface; i++) {
+               if (!dbus_message_has_interface(message, signal_map[i].interface))
                        continue;
 
-               if (dbus_message_has_member(message,
-                                       signal_map[i].member) == FALSE)
+               if (!dbus_message_has_member(message, signal_map[i].member))
                        continue;
 
                signal_map[i].function(path, &iter);
@@ -2336,10 +2593,10 @@ static void country_result(const char *error,
 
        SUPPLICANT_DBG("Country setting result");
 
-       if (user_data == NULL)
+       if (!user_data)
                return;
 
-       if (error != NULL) {
+       if (error) {
                SUPPLICANT_DBG("Country setting failure %s", error);
                result = -EINVAL;
        }
@@ -2367,11 +2624,11 @@ int g_supplicant_set_country(const char *alpha2,
 
        SUPPLICANT_DBG("Country setting %s", alpha2);
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        regdom = dbus_malloc0(sizeof(*regdom));
-       if (regdom == NULL)
+       if (!regdom)
                return -ENOMEM;
 
        regdom->callback = callback;
@@ -2392,7 +2649,7 @@ int g_supplicant_interface_set_country(GSupplicantInterface *interface,
        struct supplicant_regdom *regdom;
 
        regdom = dbus_malloc0(sizeof(*regdom));
-       if (regdom == NULL)
+       if (!regdom)
                return -ENOMEM;
 
        regdom->callback = callback;
@@ -2406,16 +2663,24 @@ int g_supplicant_interface_set_country(GSupplicantInterface *interface,
                                        regdom);
 }
 
+bool g_supplicant_interface_has_p2p(GSupplicantInterface *interface)
+{
+       return interface->p2p_support;
+}
+
 struct interface_data {
        GSupplicantInterface *interface;
+       char *path; /* Interface path cannot be taken from interface (above) as
+                    * it might have been freed already.
+                    */
        GSupplicantInterfaceCallback callback;
        void *user_data;
 };
 
 struct interface_create_data {
-       const char *ifname;
-       const char *driver;
-       const char *bridge;
+       char *ifname;
+       char *driver;
+       char *bridge;
        GSupplicantInterface *interface;
        GSupplicantInterfaceCallback callback;
        void *user_data;
@@ -2423,6 +2688,7 @@ struct interface_create_data {
 
 struct interface_connect_data {
        GSupplicantInterface *interface;
+       char *path;
        GSupplicantInterfaceCallback callback;
        GSupplicantSSID *ssid;
        void *user_data;
@@ -2430,6 +2696,7 @@ struct interface_connect_data {
 
 struct interface_scan_data {
        GSupplicantInterface *interface;
+       char *path;
        GSupplicantInterfaceCallback callback;
        GSupplicantScanParams *scan_params;
        void *user_data;
@@ -2437,22 +2704,43 @@ struct interface_scan_data {
 
 struct interface_autoscan_data {
        GSupplicantInterface *interface;
+       char *path;
        GSupplicantInterfaceCallback callback;
        const char *autoscan_params;
        void *user_data;
 };
 
+static void interface_create_data_free(struct interface_create_data *data)
+{
+       g_free(data->ifname);
+       g_free(data->driver);
+       g_free(data->bridge);
+       dbus_free(data);
+}
+
+static bool interface_exists(GSupplicantInterface *interface,
+                               const char *path)
+{
+       GSupplicantInterface *tmp;
+
+       tmp = g_hash_table_lookup(interface_table, path);
+       if (tmp && tmp == interface)
+               return true;
+
+       return false;
+}
+
 static void interface_create_property(const char *key, DBusMessageIter *iter,
                                                        void *user_data)
 {
        struct interface_create_data *data = user_data;
        GSupplicantInterface *interface = data->interface;
 
-       if (key == NULL) {
-               if (data->callback != NULL)
+       if (!key) {
+               if (data->callback)
                        data->callback(0, data->interface, data->user_data);
 
-               dbus_free(data);
+               interface_create_data_free(data);
        }
 
        interface_property(key, iter, interface);
@@ -2467,27 +2755,27 @@ static void interface_create_result(const char *error,
 
        SUPPLICANT_DBG("");
 
-       if (error != NULL) {
+       if (error) {
                g_warning("error %s", error);
                err = -EIO;
                goto done;
        }
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL) {
+       if (!path) {
                err = -EINVAL;
                goto done;
        }
 
-       if (system_available == FALSE) {
+       if (!system_available) {
                err = -EFAULT;
                goto done;
        }
 
        data->interface = g_hash_table_lookup(interface_table, path);
-       if (data->interface == NULL) {
+       if (!data->interface) {
                data->interface = interface_alloc(path);
-               if (data->interface == NULL) {
+               if (!data->interface) {
                        err = -ENOMEM;
                        goto done;
                }
@@ -2500,10 +2788,10 @@ static void interface_create_result(const char *error,
                return;
 
 done:
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(err, NULL, data->user_data);
 
-       dbus_free(data);
+       interface_create_data_free(data);
 }
 
 static void interface_create_params(DBusMessageIter *iter, void *user_data)
@@ -2518,11 +2806,11 @@ static void interface_create_params(DBusMessageIter *iter, void *user_data)
        supplicant_dbus_dict_append_basic(&dict, "Ifname",
                                        DBUS_TYPE_STRING, &data->ifname);
 
-       if (data->driver != NULL)
+       if (data->driver)
                supplicant_dbus_dict_append_basic(&dict, "Driver",
                                        DBUS_TYPE_STRING, &data->driver);
 
-       if (data->bridge != NULL)
+       if (data->bridge)
                supplicant_dbus_dict_append_basic(&dict, "BridgeIfname",
                                        DBUS_TYPE_STRING, &data->bridge);
 
@@ -2539,32 +2827,32 @@ static void interface_get_result(const char *error,
 
        SUPPLICANT_DBG("");
 
-       if (error != NULL) {
+       if (error) {
                SUPPLICANT_DBG("Interface not created yet");
                goto create;
        }
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL) {
+       if (!path) {
                err = -EINVAL;
                goto done;
        }
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL) {
+       if (!interface) {
                err = -ENOENT;
                goto done;
        }
 
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(0, interface, data->user_data);
 
-       dbus_free(data);
+       interface_create_data_free(data);
 
        return;
 
 create:
-       if (system_available == FALSE) {
+       if (!system_available) {
                err = -EFAULT;
                goto done;
        }
@@ -2575,15 +2863,16 @@ create:
                                                SUPPLICANT_INTERFACE,
                                                "CreateInterface",
                                                interface_create_params,
-                                               interface_create_result, data);
+                                               interface_create_result, data,
+                                               NULL);
        if (err == 0)
                return;
 
 done:
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(err, NULL, data->user_data);
 
-       dbus_free(data);
+       interface_create_data_free(data);
 }
 
 static void interface_get_params(DBusMessageIter *iter, void *user_data)
@@ -2601,30 +2890,36 @@ int g_supplicant_interface_create(const char *ifname, const char *driver,
                                                        void *user_data)
 {
        struct interface_create_data *data;
+       int ret;
 
        SUPPLICANT_DBG("ifname %s", ifname);
 
-       if (ifname == NULL)
+       if (!ifname)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
-       data->ifname = ifname;
-       data->driver = driver;
-       data->bridge = bridge;
+       data->ifname = g_strdup(ifname);
+       data->driver = g_strdup(driver);
+       data->bridge = g_strdup(bridge);
        data->callback = callback;
        data->user_data = user_data;
 
-       return supplicant_dbus_method_call(SUPPLICANT_PATH,
+       ret = supplicant_dbus_method_call(SUPPLICANT_PATH,
                                                SUPPLICANT_INTERFACE,
                                                "GetInterface",
                                                interface_get_params,
-                                               interface_get_result, data);
+                                               interface_get_result, data,
+                                               NULL);
+       if (ret < 0)
+               interface_create_data_free(data);
+
+       return ret;
 }
 
 static void interface_remove_result(const char *error,
@@ -2633,12 +2928,12 @@ static void interface_remove_result(const char *error,
        struct interface_data *data = user_data;
        int err;
 
-       if (error != NULL) {
+       if (error) {
                err = -EIO;
                goto done;
        }
 
-       if (system_available == FALSE) {
+       if (!system_available) {
                err = -EFAULT;
                goto done;
        }
@@ -2650,7 +2945,9 @@ static void interface_remove_result(const char *error,
        err = 0;
 
 done:
-       if (data->callback != NULL)
+       g_free(data->path);
+
+       if (data->callback)
                data->callback(err, NULL, data->user_data);
 
        dbus_free(data);
@@ -2671,26 +2968,37 @@ int g_supplicant_interface_remove(GSupplicantInterface *interface,
                                                        void *user_data)
 {
        struct interface_data *data;
+       int ret;
 
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
+       SUPPLICANT_DBG("Cancelling any pending DBus calls");
+       supplicant_dbus_method_call_cancel_all(interface);
+
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->interface = interface;
+       data->path = g_strdup(interface->path);
        data->callback = callback;
        data->user_data = user_data;
 
-       return supplicant_dbus_method_call(SUPPLICANT_PATH,
+       ret = supplicant_dbus_method_call(SUPPLICANT_PATH,
                                                SUPPLICANT_INTERFACE,
                                                "RemoveInterface",
                                                interface_remove_params,
-                                               interface_remove_result, data);
+                                               interface_remove_result, data,
+                                               NULL);
+       if (ret < 0) {
+               g_free(data->path);
+               dbus_free(data);
+       }
+       return ret;
 }
 
 static void interface_scan_result(const char *error,
@@ -2699,24 +3007,28 @@ static void interface_scan_result(const char *error,
        struct interface_scan_data *data = user_data;
        int err = 0;
 
-       if (error != NULL) {
+       if (error) {
                SUPPLICANT_DBG("error %s", error);
                err = -EIO;
        }
 
        /* A non ready interface cannot send/receive anything */
-       if (data->interface->ready == FALSE)
-               err = -ENOLINK;
+       if (interface_exists(data->interface, data->path)) {
+               if (!data->interface->ready)
+                       err = -ENOLINK;
+       }
+
+       g_free(data->path);
 
        if (err != 0) {
-               if (data->callback != NULL)
+               if (data->callback)
                        data->callback(err, data->interface, data->user_data);
        } else {
                data->interface->scan_callback = data->callback;
                data->interface->scan_data = data->user_data;
        }
 
-       if (data != NULL && data->scan_params != NULL)
+       if (data->scan_params)
                g_supplicant_free_scan_params(data->scan_params);
 
        dbus_free(data);
@@ -2842,21 +3154,15 @@ static void interface_scan_params(DBusMessageIter *iter, void *user_data)
        supplicant_dbus_dict_close(iter, &dict);
 }
 
-int g_supplicant_interface_scan(GSupplicantInterface *interface,
-                               GSupplicantScanParams *scan_data,
-                               GSupplicantInterfaceCallback callback,
-                                                       void *user_data)
+static int interface_ready_to_scan(GSupplicantInterface *interface)
 {
-       struct interface_scan_data *data;
-       int ret;
-
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
-       if (interface->scanning == TRUE)
+       if (interface->scanning)
                return -EALREADY;
 
        switch (interface->state) {
@@ -2875,11 +3181,27 @@ int g_supplicant_interface_scan(GSupplicantInterface *interface,
                break;
        }
 
+       return 0;
+}
+
+int g_supplicant_interface_scan(GSupplicantInterface *interface,
+                               GSupplicantScanParams *scan_data,
+                               GSupplicantInterfaceCallback callback,
+                                                       void *user_data)
+{
+       struct interface_scan_data *data;
+       int ret;
+
+       ret = interface_ready_to_scan(interface);
+       if (ret)
+               return ret;
+
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->interface = interface;
+       data->path = g_strdup(interface->path);
        data->callback = callback;
        data->user_data = user_data;
        data->scan_params = scan_data;
@@ -2889,10 +3211,13 @@ int g_supplicant_interface_scan(GSupplicantInterface *interface,
 
        ret = supplicant_dbus_method_call(interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "Scan",
-                       interface_scan_params, interface_scan_result, data);
+                       interface_scan_params, interface_scan_result, data,
+                       interface);
 
-       if (ret < 0)
+       if (ret < 0) {
+               g_free(data->path);
                dbus_free(data);
+       }
 
        return ret;
 }
@@ -2903,12 +3228,14 @@ static void interface_autoscan_result(const char *error,
        struct interface_autoscan_data *data = user_data;
        int err = 0;
 
-       if (error != NULL) {
+       if (error) {
                SUPPLICANT_DBG("error %s", error);
                err = -EIO;
        }
 
-       if (data != NULL && data->callback != NULL)
+       g_free(data->path);
+
+       if (data->callback)
                data->callback(err, data->interface, data->user_data);
 
        dbus_free(data);
@@ -2931,10 +3258,11 @@ int g_supplicant_interface_autoscan(GSupplicantInterface *interface,
        int ret;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->interface = interface;
+       data->path = g_strdup(interface->path);
        data->callback = callback;
        data->autoscan_params = autoscan_data;
        data->user_data = user_data;
@@ -2942,9 +3270,12 @@ int g_supplicant_interface_autoscan(GSupplicantInterface *interface,
        ret = supplicant_dbus_method_call(interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "AutoScan",
                        interface_autoscan_params,
-                       interface_autoscan_result, data);
-       if (ret < 0)
+                       interface_autoscan_result, data,
+                       interface);
+       if (ret < 0) {
+               g_free(data->path);
                dbus_free(data);
+       }
 
        return ret;
 }
@@ -2981,12 +3312,14 @@ static void interface_select_network_result(const char *error,
        SUPPLICANT_DBG("");
 
        err = 0;
-       if (error != NULL) {
+       if (error) {
                SUPPLICANT_DBG("SelectNetwork error %s", error);
                err = parse_supplicant_error(iter);
        }
 
-       if (data->callback != NULL)
+       g_free(data->path);
+
+       if (data->callback)
                data->callback(err, data->interface, data->user_data);
 
        g_free(data->ssid);
@@ -3011,11 +3344,11 @@ static void interface_add_network_result(const char *error,
        const char *path;
        int err;
 
-       if (error != NULL)
+       if (error)
                goto error;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                goto error;
 
        SUPPLICANT_DBG("PATH: %s", path);
@@ -3026,18 +3359,24 @@ static void interface_add_network_result(const char *error,
        supplicant_dbus_method_call(data->interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "SelectNetwork",
                        interface_select_network_params,
-                       interface_select_network_result, data);
+                       interface_select_network_result, data,
+                       interface);
 
        return;
 
 error:
        SUPPLICANT_DBG("AddNetwork error %s", error);
-       err = parse_supplicant_error(iter);
-       if (data->callback != NULL)
-               data->callback(err, data->interface, data->user_data);
 
-       g_free(interface->network_path);
-       interface->network_path = NULL;
+       if (interface_exists(data->interface, data->interface->path)) {
+               err = parse_supplicant_error(iter);
+               if (data->callback)
+                       data->callback(err, data->interface, data->user_data);
+
+               g_free(interface->network_path);
+               interface->network_path = NULL;
+       }
+
+       g_free(data->path);
        g_free(data->ssid);
        g_free(data);
 }
@@ -3046,7 +3385,7 @@ static void add_network_security_wep(DBusMessageIter *dict,
                                        GSupplicantSSID *ssid)
 {
        const char *auth_alg = "OPEN SHARED";
-       const char *key_index = "0";
+       dbus_uint32_t key_index = 0;
 
        supplicant_dbus_dict_append_basic(dict, "auth_alg",
                                        DBUS_TYPE_STRING, &auth_alg);
@@ -3059,7 +3398,7 @@ static void add_network_security_wep(DBusMessageIter *dict,
                        int i;
 
                        memset(tmp, 0, sizeof(tmp));
-                       if (key == NULL)
+                       if (!key)
                                size = 0;
 
                        for (i = 0; i < size / 2; i++) {
@@ -3076,7 +3415,7 @@ static void add_network_security_wep(DBusMessageIter *dict,
                        unsigned char *key = g_try_malloc(13);
                        int i;
 
-                       if (key == NULL)
+                       if (!key)
                                size = 0;
 
                        for (i = 0; i < size; i++)
@@ -3094,7 +3433,7 @@ static void add_network_security_wep(DBusMessageIter *dict,
                                                        &ssid->passphrase);
 
                supplicant_dbus_dict_append_basic(dict, "wep_tx_keyidx",
-                                       DBUS_TYPE_STRING, &key_index);
+                                       DBUS_TYPE_UINT32, &key_index);
        }
 }
 
@@ -3126,7 +3465,8 @@ static unsigned char hexchar2bin(char c)
                return c;
 }
 
-static void hexstring2bin(const char *string, unsigned char *data, size_t data_len)
+static void hexstring2bin(const char *string, unsigned char *data,
+                               size_t data_len)
 {
        size_t i;
 
@@ -3141,7 +3481,7 @@ static void add_network_security_psk(DBusMessageIter *dict,
        if (ssid->passphrase && strlen(ssid->passphrase) > 0) {
                const char *key = "psk";
 
-               if (is_psk_raw_key(ssid->passphrase) == TRUE) {
+               if (is_psk_raw_key(ssid->passphrase)) {
                        unsigned char data[32];
                        unsigned char *datap = data;
 
@@ -3172,13 +3512,13 @@ static void add_network_security_tls(DBusMessageIter *dict,
         *
         * The Authority certificate is optional.
         */
-       if (ssid->client_cert_path == NULL)
+       if (!ssid->client_cert_path)
                return;
 
-       if (ssid->private_key_path == NULL)
+       if (!ssid->private_key_path)
                return;
 
-       if (ssid->private_key_passphrase == NULL)
+       if (!ssid->private_key_passphrase)
                return;
 
        if (ssid->ca_cert_path)
@@ -3212,17 +3552,17 @@ static void add_network_security_peap(DBusMessageIter *dict,
         *              The Client private key file
         *              The Client private key file password
         */
-       if (ssid->passphrase == NULL)
+       if (!ssid->passphrase)
                return;
 
-       if (ssid->phase2_auth == NULL)
+       if (!ssid->phase2_auth)
                return;
 
        if (ssid->client_cert_path) {
-               if (ssid->private_key_path == NULL)
+               if (!ssid->private_key_path)
                        return;
 
-               if (ssid->private_key_passphrase == NULL)
+               if (!ssid->private_key_passphrase)
                        return;
 
                supplicant_dbus_dict_append_basic(dict, "client_cert",
@@ -3239,7 +3579,7 @@ static void add_network_security_peap(DBusMessageIter *dict,
 
        }
 
-       if (g_str_has_prefix(ssid->phase2_auth, "EAP-") == TRUE) {
+       if (g_str_has_prefix(ssid->phase2_auth, "EAP-")) {
                phase2_auth = g_strdup_printf("autheap=%s",
                                        ssid->phase2_auth + strlen("EAP-"));
        } else
@@ -3266,7 +3606,7 @@ static void add_network_security_eap(DBusMessageIter *dict,
 {
        char *eap_value;
 
-       if (ssid->eap == NULL || ssid->identity == NULL)
+       if (!ssid->eap || !ssid->identity)
                return;
 
        if (g_strcmp0(ssid->eap, "tls") == 0) {
@@ -3448,7 +3788,7 @@ static void interface_add_network_params(DBusMessageIter *iter, void *user_data)
                supplicant_dbus_dict_append_basic(&dict, "frequency",
                                         DBUS_TYPE_UINT32, &ssid->freq);
 
-       if (ssid->bgscan != NULL)
+       if (ssid->bgscan)
                supplicant_dbus_dict_append_basic(&dict, "bgscan",
                                        DBUS_TYPE_STRING, &ssid->bgscan);
 
@@ -3469,9 +3809,10 @@ static void interface_wps_start_result(const char *error,
        struct interface_connect_data *data = user_data;
 
        SUPPLICANT_DBG("");
-       if (error != NULL)
+       if (error)
                SUPPLICANT_DBG("error: %s", error);
 
+       g_free(data->path);
        g_free(data->ssid);
        dbus_free(data);
 }
@@ -3491,7 +3832,7 @@ static void interface_add_wps_params(DBusMessageIter *iter, void *user_data)
                                                DBUS_TYPE_STRING, &role);
 
        type = "pbc";
-       if (ssid->pin_wps != NULL) {
+       if (ssid->pin_wps) {
                type = "pin";
                supplicant_dbus_dict_append_basic(&dict, "Pin",
                                        DBUS_TYPE_STRING, &ssid->pin_wps);
@@ -3509,8 +3850,9 @@ static void wps_start(const char *error, DBusMessageIter *iter, void *user_data)
 
        SUPPLICANT_DBG("");
 
-       if (error != NULL) {
+       if (error) {
                SUPPLICANT_DBG("error: %s", error);
+               g_free(data->path);
                g_free(data->ssid);
                dbus_free(data);
                return;
@@ -3519,7 +3861,7 @@ static void wps_start(const char *error, DBusMessageIter *iter, void *user_data)
        supplicant_dbus_method_call(data->interface->path,
                        SUPPLICANT_INTERFACE ".Interface.WPS", "Start",
                        interface_add_wps_params,
-                       interface_wps_start_result, data);
+                       interface_wps_start_result, data, NULL);
 }
 
 static void wps_process_credentials(DBusMessageIter *iter, void *user_data)
@@ -3540,24 +3882,25 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface,
        struct interface_connect_data *data;
        int ret;
 
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        /* TODO: Check if we're already connected and switch */
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->interface = interface;
+       data->path = g_strdup(interface->path);
        data->callback = callback;
        data->ssid = ssid;
        data->user_data = user_data;
 
-       if (ssid->use_wps == TRUE) {
+       if (ssid->use_wps) {
                g_free(interface->wps_cred.key);
                memset(&interface->wps_cred, 0,
                                sizeof(struct _GSupplicantWpsCredentials));
@@ -3570,10 +3913,14 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface,
                ret = supplicant_dbus_method_call(interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "AddNetwork",
                        interface_add_network_params,
-                       interface_add_network_result, data);
+                       interface_add_network_result, data,
+                       interface);
 
-       if (ret < 0)
+       if (ret < 0) {
+               g_free(data->path);
+               dbus_free(data);
                return ret;
+       }
 
        return -EINPROGRESS;
 }
@@ -3586,14 +3933,16 @@ static void network_remove_result(const char *error,
 
        SUPPLICANT_DBG("");
 
-       if (error != NULL) {
+       if (error) {
                result = -EIO;
                if (g_strcmp0("org.freedesktop.DBus.Error.UnknownMethod",
                                                error) == 0)
                        result = -ECONNABORTED;
        }
 
-       if (data->callback != NULL)
+       g_free(data->path);
+
+       if (data->callback)
                data->callback(result, data->interface, data->user_data);
 
        dbus_free(data);
@@ -3617,7 +3966,8 @@ static int network_remove(struct interface_data *data)
 
        return supplicant_dbus_method_call(interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "RemoveNetwork",
-                       network_remove_params, network_remove_result, data);
+                       network_remove_params, network_remove_result, data,
+                       interface);
 }
 
 static void interface_disconnect_result(const char *error,
@@ -3628,14 +3978,14 @@ static void interface_disconnect_result(const char *error,
 
        SUPPLICANT_DBG("");
 
-       if (error != NULL) {
+       if (error) {
                result = -EIO;
                if (g_strcmp0("org.freedesktop.DBus.Error.UnknownMethod",
                                                error) == 0)
                        result = -ECONNABORTED;
        }
 
-       if (result < 0 && data->callback != NULL) {
+       if (result < 0 && data->callback) {
                data->callback(result, data->interface, data->user_data);
                data->callback = NULL;
        }
@@ -3643,15 +3993,21 @@ static void interface_disconnect_result(const char *error,
        /* If we are disconnecting from previous WPS successful
         * association. i.e.: it did not went through AddNetwork,
         * and interface->network_path was never set. */
-       if (data->interface->network_path == NULL) {
+       if (!data->interface->network_path) {
+               g_free(data->path);
                dbus_free(data);
                return;
        }
 
-       if (result != -ECONNABORTED)
-               network_remove(data);
-       else
+       if (result != -ECONNABORTED) {
+               if (network_remove(data) < 0) {
+                       g_free(data->path);
+                       dbus_free(data);
+               }
+       } else {
+               g_free(data->path);
                dbus_free(data);
+       }
 }
 
 int g_supplicant_interface_disconnect(GSupplicantInterface *interface,
@@ -3659,28 +4015,119 @@ int g_supplicant_interface_disconnect(GSupplicantInterface *interface,
                                                        void *user_data)
 {
        struct interface_data *data;
+       int ret;
 
        SUPPLICANT_DBG("");
 
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->interface = interface;
+       data->path = g_strdup(interface->path);
        data->callback = callback;
        data->user_data = user_data;
 
-       return supplicant_dbus_method_call(interface->path,
+       ret = supplicant_dbus_method_call(interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "Disconnect",
-                               NULL, interface_disconnect_result, data);
+                       NULL, interface_disconnect_result, data,
+                       interface);
+
+       if (ret < 0) {
+               g_free(data->path);
+               dbus_free(data);
+       }
+
+       return ret;
 }
 
+static void interface_p2p_find_result(const char *error,
+                                       DBusMessageIter *iter, void *user_data)
+{
+       struct interface_scan_data *data = user_data;
+       int err = 0;
+
+       SUPPLICANT_DBG("error %s", error);
+
+       if (error)
+               err = -EIO;
+
+       if (interface_exists(data->interface, data->path)) {
+               if (!data->interface->ready)
+                       err = -ENOLINK;
+               if (!err)
+                       data->interface->p2p_finding = true;
+       }
+
+       if (data->callback)
+               data->callback(err, data->interface, data->user_data);
+
+       g_free(data->path);
+       dbus_free(data);
+}
+
+static void interface_p2p_find_params(DBusMessageIter *iter, void *user_data)
+{
+       DBusMessageIter dict;
+
+       supplicant_dbus_dict_open(iter, &dict);
+       supplicant_dbus_dict_close(iter, &dict);
+}
+
+int g_supplicant_interface_p2p_find(GSupplicantInterface *interface,
+                                       GSupplicantInterfaceCallback callback,
+                                                       void *user_data)
+{
+       struct interface_scan_data *data;
+       int ret;
+
+       if (!interface->p2p_support)
+               return -ENOTSUP;
+
+       ret = interface_ready_to_scan(interface);
+       if (ret)
+               return ret;
+
+       data = dbus_malloc0(sizeof(*data));
+       if (!data)
+               return -ENOMEM;
+
+       data->interface = interface;
+       data->path = g_strdup(interface->path);
+       data->callback = callback;
+       data->user_data = user_data;
+
+       ret = supplicant_dbus_method_call(interface->path,
+                       SUPPLICANT_INTERFACE ".Interface.P2PDevice", "Find",
+                       interface_p2p_find_params, interface_p2p_find_result,
+                       data, interface);
+       if (ret < 0) {
+               g_free(data->path);
+               dbus_free(data);
+       }
+
+       return ret;
+}
+
+int g_supplicant_interface_p2p_stop_find(GSupplicantInterface *interface)
+{
+       if (!interface->p2p_finding)
+               return 0;
+
+       SUPPLICANT_DBG("");
+
+       interface->p2p_finding = false;
+
+       return supplicant_dbus_method_call(interface->path,
+               SUPPLICANT_INTERFACE ".Interface.P2PDevice", "StopFind",
+               NULL, NULL, NULL, NULL);
+}
 
 static const char *g_supplicant_rule0 = "type=signal,"
                                        "path=" DBUS_PATH_DBUS ","
@@ -3698,6 +4145,8 @@ static const char *g_supplicant_rule4 = "type=signal,"
                        "interface=" SUPPLICANT_INTERFACE ".BSS";
 static const char *g_supplicant_rule5 = "type=signal,"
                        "interface=" SUPPLICANT_INTERFACE ".Network";
+static const char *g_supplicant_rule6 = "type=signal,"
+               "interface=" SUPPLICANT_INTERFACE ".Interface.P2PDevice";
 
 static void invoke_introspect_method(void)
 {
@@ -3708,7 +4157,7 @@ static void invoke_introspect_method(void)
                                        DBUS_INTERFACE_INTROSPECTABLE,
                                        "Introspect");
 
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_no_reply(message, TRUE);
@@ -3719,11 +4168,11 @@ static void invoke_introspect_method(void)
 int g_supplicant_register(const GSupplicantCallbacks *callbacks)
 {
        connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
-       if (dbus_connection_add_filter(connection,
-                               g_supplicant_filter, NULL, NULL) == FALSE) {
+       if (!dbus_connection_add_filter(connection, g_supplicant_filter,
+                                               NULL, NULL)) {
                dbus_connection_unref(connection);
                connection = NULL;
                return -EIO;
@@ -3746,10 +4195,11 @@ int g_supplicant_register(const GSupplicantCallbacks *callbacks)
        dbus_bus_add_match(connection, g_supplicant_rule3, NULL);
        dbus_bus_add_match(connection, g_supplicant_rule4, NULL);
        dbus_bus_add_match(connection, g_supplicant_rule5, NULL);
+       dbus_bus_add_match(connection, g_supplicant_rule6, NULL);
        dbus_connection_flush(connection);
 
        if (dbus_bus_name_has_owner(connection,
-                                       SUPPLICANT_SERVICE, NULL) == TRUE) {
+                                       SUPPLICANT_SERVICE, NULL)) {
                system_available = TRUE;
                supplicant_dbus_property_get_all(SUPPLICANT_PATH,
                                                SUPPLICANT_INTERFACE,
@@ -3779,14 +4229,14 @@ static void unregister_remove_interface(gpointer key, gpointer value,
                                        SUPPLICANT_INTERFACE,
                                        "RemoveInterface",
                                        unregister_interface_remove_params,
-                                               NULL, interface->path);
+                                       NULL, interface->path, NULL);
 }
 
 void g_supplicant_unregister(const GSupplicantCallbacks *callbacks)
 {
        SUPPLICANT_DBG("");
 
-       if (connection != NULL) {
+       if (connection) {
                dbus_bus_remove_match(connection, g_supplicant_rule5, NULL);
                dbus_bus_remove_match(connection, g_supplicant_rule4, NULL);
                dbus_bus_remove_match(connection, g_supplicant_rule3, NULL);
@@ -3799,22 +4249,22 @@ void g_supplicant_unregister(const GSupplicantCallbacks *callbacks)
                                                g_supplicant_filter, NULL);
        }
 
-       if (bss_mapping != NULL) {
+       if (bss_mapping) {
                g_hash_table_destroy(bss_mapping);
                bss_mapping = NULL;
        }
 
-       if (system_available == TRUE)
+       if (system_available)
                callback_system_killed();
 
-       if (interface_table != NULL) {
+       if (interface_table) {
                g_hash_table_foreach(interface_table,
                                        unregister_remove_interface, NULL);
                g_hash_table_destroy(interface_table);
                interface_table = NULL;
        }
 
-       if (connection != NULL) {
+       if (connection) {
                dbus_connection_unref(connection);
                connection = NULL;
        }
index 47ff8c4..09dc9e7 100644 (file)
@@ -43,8 +43,8 @@ struct _GIOGnuTLSChannel {
        gint fd;
        gnutls_certificate_credentials_t cred;
        gnutls_session_t session;
-       gboolean established;
-       gboolean again;
+       bool established;
+       bool again;
 };
 
 struct _GIOGnuTLSWatch {
@@ -58,7 +58,7 @@ static volatile int global_init_done = 0;
 
 static inline void g_io_gnutls_global_init(void)
 {
-       if (__sync_bool_compare_and_swap(&global_init_done, 0, 1) == TRUE)
+       if (__sync_bool_compare_and_swap(&global_init_done, 0, 1))
                gnutls_global_init();
 }
 
@@ -69,7 +69,7 @@ static GIOStatus check_handshake(GIOChannel *channel, GError **err)
 
        DBG("channel %p", channel);
 
-       if (gnutls_channel->established == TRUE)
+       if (gnutls_channel->established)
                return G_IO_STATUS_NORMAL;
 
 again:
@@ -78,7 +78,7 @@ again:
        if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
                GIOFlags flags = g_io_channel_get_flags(channel);
 
-               if (gnutls_channel->again == TRUE)
+               if (gnutls_channel->again)
                        return G_IO_STATUS_AGAIN;
 
                if (flags & G_IO_FLAG_NONBLOCK)
@@ -93,7 +93,7 @@ again:
                return G_IO_STATUS_ERROR;
        }
 
-       gnutls_channel->established = TRUE;
+       gnutls_channel->established = true;
 
        DBG("handshake done");
 
@@ -121,14 +121,14 @@ again:
        DBG("result %zd", result);
 
        if (result == GNUTLS_E_REHANDSHAKE) {
-               gnutls_channel->established = FALSE;
+               gnutls_channel->established = false;
                goto again;
        }
 
        if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
                GIOFlags flags = g_io_channel_get_flags(channel);
 
-               if (gnutls_channel->again == TRUE)
+               if (gnutls_channel->again)
                        return G_IO_STATUS_AGAIN;
 
                if (flags & G_IO_FLAG_NONBLOCK)
@@ -172,14 +172,14 @@ again:
        DBG("result %zd", result);
 
        if (result == GNUTLS_E_REHANDSHAKE) {
-               gnutls_channel->established = FALSE;
+               gnutls_channel->established = false;
                goto again;
        }
 
        if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
                GIOFlags flags = g_io_channel_get_flags(channel);
 
-               if (gnutls_channel->again == TRUE)
+               if (gnutls_channel->again)
                        return G_IO_STATUS_AGAIN;
 
                if (flags & G_IO_FLAG_NONBLOCK)
@@ -215,7 +215,7 @@ static GIOStatus g_io_gnutls_close(GIOChannel *channel, GError **err)
 
        DBG("channel %p", channel);
 
-       if (gnutls_channel->established == TRUE)
+       if (gnutls_channel->established)
                gnutls_bye(gnutls_channel->session, GNUTLS_SHUT_RDWR);
 
        if (close(gnutls_channel->fd) < 0) {
@@ -309,7 +309,7 @@ static gboolean g_io_gnutls_dispatch(GSource *source, GSourceFunc callback,
 
        DBG("source %p condition %u", source, condition);
 
-       if (func == NULL)
+       if (!func)
                return FALSE;
 
        return func(watch->channel, condition & watch->condition, user_data);
@@ -379,9 +379,9 @@ static ssize_t g_io_gnutls_push_func(gnutls_transport_ptr_t transport_data,
        result = write(gnutls_channel->fd, buf, count);
 
        if (result < 0 && errno == EAGAIN)
-               gnutls_channel->again = TRUE;
+               gnutls_channel->again = true;
        else
-               gnutls_channel->again = FALSE;
+               gnutls_channel->again = false;
 
        DBG("result %zd", result);
 
@@ -399,18 +399,18 @@ static ssize_t g_io_gnutls_pull_func(gnutls_transport_ptr_t transport_data,
        result = read(gnutls_channel->fd, buf, count);
 
        if (result < 0 && errno == EAGAIN)
-               gnutls_channel->again = TRUE;
+               gnutls_channel->again = true;
        else
-               gnutls_channel->again = FALSE;
+               gnutls_channel->again = false;
 
        DBG("result %zd", result);
 
        return result;
 }
 
-gboolean g_io_channel_supports_tls(void)
+bool g_io_channel_supports_tls(void)
 {
-       return TRUE;
+       return true;
 }
 
 GIOChannel *g_io_channel_gnutls_new(int fd)
index f16c75d..ea0df8f 100644 (file)
  *
  */
 
+#include <stdbool.h>
+
 #include <glib.h>
 
-gboolean g_io_channel_supports_tls(void);
+bool g_io_channel_supports_tls(void);
 
 GIOChannel *g_io_channel_gnutls_new(int fd);
index 88db3e4..2998895 100644 (file)
@@ -25,9 +25,9 @@
 
 #include "giognutls.h"
 
-gboolean g_io_channel_supports_tls(void)
+bool g_io_channel_supports_tls(void)
 {
-       return FALSE;
+       return false;
 }
 
 GIOChannel *g_io_channel_gnutls_new(int fd)
index 864d2ad..5cf7a9a 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Resolver library with GLib integration
  *
- *  Copyright (C) 2009-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2009-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -44,7 +44,7 @@ struct sort_result {
        int dst_scope;
        int src_label;
        int dst_label;
-       gboolean reachable;
+       bool reachable;
        union {
                struct sockaddr sa;
                struct sockaddr_in sin;
@@ -126,7 +126,7 @@ static void _debug(GResolv *resolv, const char *file, const char *caller,
        va_list ap;
        int len;
 
-       if (resolv->debug_func == NULL)
+       if (!resolv->debug_func)
                return;
 
        va_start(ap, format);
@@ -155,13 +155,13 @@ static void destroy_lookup(struct resolv_lookup *lookup)
        debug(lookup->resolv, "lookup %p id %d ipv4 %p ipv6 %p",
                lookup, lookup->id, lookup->ipv4_query, lookup->ipv6_query);
 
-       if (lookup->ipv4_query != NULL) {
+       if (lookup->ipv4_query) {
                g_queue_remove(lookup->resolv->query_queue,
                                                lookup->ipv4_query);
                destroy_query(lookup->ipv4_query);
        }
 
-       if (lookup->ipv6_query != NULL) {
+       if (lookup->ipv6_query) {
                g_queue_remove(lookup->resolv->query_queue,
                                                lookup->ipv6_query);
                destroy_query(lookup->ipv6_query);
@@ -191,7 +191,7 @@ static void find_srcaddr(struct sort_result *res)
                return;
        }
 
-       res->reachable = TRUE;
+       res->reachable = true;
        close(fd);
 }
 
@@ -280,21 +280,21 @@ static const struct gai_table gai_precedences[] = {
 static unsigned char v4mapped[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 };
 
-static gboolean mask_compare(const unsigned char *one,
+static bool mask_compare(const unsigned char *one,
                                        const unsigned char *two, int mask)
 {
        if (mask > 8) {
                if (memcmp(one, two, mask / 8))
-                       return FALSE;
+                       return false;
                one += mask / 8;
                two += mask / 8;
                mask %= 8;
        }
 
        if (mask && ((*one ^ *two) >> (8 - mask)))
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static int match_gai_table(struct sockaddr *sa, const struct gai_table *tbl)
@@ -485,14 +485,14 @@ static void sort_and_return_results(struct resolv_lookup *lookup)
 
        for (i = 0; i < lookup->nr_results; i++) {
                if (lookup->results[i].dst.sa.sa_family == AF_INET) {
-                       if (inet_ntop(AF_INET,
+                       if (!inet_ntop(AF_INET,
                                        &lookup->results[i].dst.sin.sin_addr,
-                                       buf, sizeof(buf) - 1) == NULL)
+                                       buf, sizeof(buf) - 1))
                                continue;
                } else if (lookup->results[i].dst.sa.sa_family == AF_INET6) {
-                       if (inet_ntop(AF_INET6,
+                       if (!inet_ntop(AF_INET6,
                                        &lookup->results[i].dst.sin6.sin6_addr,
-                                       buf, sizeof(buf) - 1) == NULL)
+                                       buf, sizeof(buf) - 1))
                                continue;
                } else
                        continue;
@@ -542,7 +542,7 @@ static gboolean query_timeout(gpointer user_data)
        g_queue_remove(resolv->query_queue, query);
        destroy_query(query);
 
-       if (lookup->ipv4_query == NULL && lookup->ipv6_query == NULL)
+       if (!lookup->ipv4_query && !lookup->ipv6_query)
                sort_and_return_results(lookup);
 
        return FALSE;
@@ -550,13 +550,13 @@ static gboolean query_timeout(gpointer user_data)
 
 static void free_nameserver(struct resolv_nameserver *nameserver)
 {
-       if (nameserver == NULL)
+       if (!nameserver)
                return;
 
        if (nameserver->udp_watch > 0)
                g_source_remove(nameserver->udp_watch);
 
-       if (nameserver->udp_channel != NULL) {
+       if (nameserver->udp_channel) {
                g_io_channel_shutdown(nameserver->udp_channel, TRUE, NULL);
                g_io_channel_unref(nameserver->udp_channel);
        }
@@ -582,7 +582,7 @@ static int send_query(GResolv *resolv, const unsigned char *buf, int len)
        GList *list;
        int nr_ns;
 
-       if (resolv->nameserver_list == NULL)
+       if (!resolv->nameserver_list)
                return -ENOENT;
 
        for (list = g_list_first(resolv->nameserver_list), nr_ns = 0;
@@ -590,7 +590,7 @@ static int send_query(GResolv *resolv, const unsigned char *buf, int len)
                struct resolv_nameserver *nameserver = list->data;
                int sk, sent;
 
-               if (nameserver->udp_channel == NULL)
+               if (!nameserver->udp_channel)
                        continue;
 
                sk = g_io_channel_unix_get_fd(nameserver->udp_channel);
@@ -637,7 +637,7 @@ static void add_result(struct resolv_lookup *lookup, int family,
        int n = lookup->nr_results++;
        lookup->results = g_try_realloc(lookup->results,
                                        sizeof(struct sort_result) * (n + 1));
-       if (lookup->results == NULL)
+       if (!lookup->results)
                return;
 
        memset(&lookup->results[n], 0, sizeof(struct sort_result));
@@ -665,7 +665,8 @@ static void parse_response(struct resolv_nameserver *nameserver,
 
        debug(resolv, "response from %s", nameserver->address);
 
-       ns_initparse(buf, len, &msg);
+       if (ns_initparse(buf, len, &msg) < 0)
+               return;
 
        list = g_queue_find_custom(resolv->query_queue,
                        GUINT_TO_POINTER(ns_msg_id(msg)), compare_query_msgid);
@@ -713,7 +714,8 @@ static void parse_response(struct resolv_nameserver *nameserver,
                lookup->ipv4_status = status;
 
        for (i = 0; i < count; i++) {
-               ns_parserr(&msg, ns_s_an, i, &rr);
+               if (ns_parserr(&msg, ns_s_an, i, &rr) < 0)
+                       continue;
 
                if (ns_rr_class(rr) != ns_c_in)
                        continue;
@@ -741,7 +743,7 @@ static void parse_response(struct resolv_nameserver *nameserver,
        g_queue_remove(resolv->query_queue, query);
        destroy_query(query);
 
-       if (lookup->ipv4_query == NULL && lookup->ipv6_query == NULL)
+       if (!lookup->ipv4_query && !lookup->ipv6_query)
                sort_and_return_results(lookup);
 }
 
@@ -807,8 +809,7 @@ static int connect_udp_channel(struct resolv_nameserver *nameserver)
                char interface[IF_NAMESIZE];
 
                memset(interface, 0, IF_NAMESIZE);
-               if (if_indextoname(nameserver->resolv->index,
-                                               interface) != NULL) {
+               if (if_indextoname(nameserver->resolv->index, interface)) {
                        if (setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE,
                                                interface, IF_NAMESIZE) < 0) {
                                close(sk);
@@ -827,7 +828,7 @@ static int connect_udp_channel(struct resolv_nameserver *nameserver)
        freeaddrinfo(rp);
 
        nameserver->udp_channel = g_io_channel_unix_new(sk);
-       if (nameserver->udp_channel == NULL) {
+       if (!nameserver->udp_channel) {
                close(sk);
                return -ENOMEM;
        }
@@ -849,7 +850,7 @@ GResolv *g_resolv_new(int index)
                return NULL;
 
        resolv = g_try_new0(GResolv, 1);
-       if (resolv == NULL)
+       if (!resolv)
                return NULL;
 
        resolv->ref_count = 1;
@@ -859,13 +860,13 @@ GResolv *g_resolv_new(int index)
        resolv->next_lookup_id = 1;
 
        resolv->query_queue = g_queue_new();
-       if (resolv->query_queue == NULL) {
+       if (!resolv->query_queue) {
                g_free(resolv);
                return NULL;
        }
 
        resolv->lookup_queue = g_queue_new();
-       if (resolv->lookup_queue == NULL) {
+       if (!resolv->lookup_queue) {
                g_queue_free(resolv->query_queue);
                g_free(resolv);
                return NULL;
@@ -881,7 +882,7 @@ GResolv *g_resolv_new(int index)
 
 GResolv *g_resolv_ref(GResolv *resolv)
 {
-       if (resolv == NULL)
+       if (!resolv)
                return NULL;
 
        __sync_fetch_and_add(&resolv->ref_count, 1);
@@ -894,7 +895,7 @@ void g_resolv_unref(GResolv *resolv)
        struct resolv_query *query;
        struct resolv_lookup *lookup;
 
-       if (resolv == NULL)
+       if (!resolv)
                return;
 
        if (__sync_fetch_and_sub(&resolv->ref_count, 1) != 1)
@@ -923,24 +924,24 @@ void g_resolv_unref(GResolv *resolv)
 void g_resolv_set_debug(GResolv *resolv, GResolvDebugFunc func,
                                                gpointer user_data)
 {
-       if (resolv == NULL)
+       if (!resolv)
                return;
 
        resolv->debug_func = func;
        resolv->debug_data = user_data;
 }
 
-gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address,
+bool g_resolv_add_nameserver(GResolv *resolv, const char *address,
                                        uint16_t port, unsigned long flags)
 {
        struct resolv_nameserver *nameserver;
 
-       if (resolv == NULL)
-               return FALSE;
+       if (!resolv)
+               return false;
 
        nameserver = g_try_new0(struct resolv_nameserver, 1);
-       if (nameserver == NULL)
-               return FALSE;
+       if (!nameserver)
+               return false;
 
        nameserver->address = g_strdup(address);
        nameserver->port = port;
@@ -949,7 +950,7 @@ gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address,
 
        if (connect_udp_channel(nameserver) < 0) {
                free_nameserver(nameserver);
-               return FALSE;
+               return false;
        }
 
        resolv->nameserver_list = g_list_append(resolv->nameserver_list,
@@ -957,12 +958,12 @@ gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address,
 
        debug(resolv, "setting nameserver %s", address);
 
-       return TRUE;
+       return true;
 }
 
 void g_resolv_flush_nameservers(GResolv *resolv)
 {
-       if (resolv == NULL)
+       if (!resolv)
                return;
 
        flush_nameservers(resolv);
@@ -974,7 +975,7 @@ static gint add_query(struct resolv_lookup *lookup, const char *hostname, int ty
        unsigned char buf[4096];
        int len;
 
-       if (query == NULL)
+       if (!query)
                return -ENOMEM;
 
        len = res_mkquery(ns_o_query, hostname, ns_c_in, type,
@@ -1013,12 +1014,12 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
 {
        struct resolv_lookup *lookup;
 
-       if (resolv == NULL)
+       if (!resolv)
                return 0;
 
        debug(resolv, "hostname %s", hostname);
 
-       if (resolv->nameserver_list == NULL) {
+       if (!resolv->nameserver_list) {
                int i;
 
                for (i = 0; i < resolv->res.nscount; i++) {
@@ -1039,12 +1040,12 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
                                g_resolv_add_nameserver(resolv, buf, 53, 0);
                }
 
-               if (resolv->nameserver_list == NULL)
+               if (!resolv->nameserver_list)
                        g_resolv_add_nameserver(resolv, "127.0.0.1", 53, 0);
        }
 
        lookup = g_try_new0(struct resolv_lookup, 1);
-       if (lookup == NULL)
+       if (!lookup)
                return 0;
 
        lookup->resolv = resolv;
@@ -1079,7 +1080,7 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
        return lookup->id;
 }
 
-gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id)
+bool g_resolv_cancel_lookup(GResolv *resolv, guint id)
 {
        struct resolv_lookup *lookup;
        GList *list;
@@ -1089,8 +1090,8 @@ gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id)
        list = g_queue_find_custom(resolv->lookup_queue,
                                GUINT_TO_POINTER(id), compare_lookup_id);
 
-       if (list == NULL)
-               return FALSE;
+       if (!list)
+               return false;
 
        lookup = list->data;
 
@@ -1099,18 +1100,18 @@ gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id)
        g_queue_remove(resolv->lookup_queue, lookup);
        destroy_lookup(lookup);
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_resolv_set_address_family(GResolv *resolv, int family)
+bool g_resolv_set_address_family(GResolv *resolv, int family)
 {
-       if (resolv == NULL)
-               return FALSE;
+       if (!resolv)
+               return false;
 
        if (family != AF_UNSPEC && family != AF_INET && family != AF_INET6)
-               return FALSE;
+               return false;
 
        resolv->result_family = family;
 
-       return TRUE;
+       return true;
 }
index 3402df9..fac14f5 100644 (file)
@@ -22,6 +22,7 @@
 #ifndef __G_RESOLV_H
 #define __G_RESOLV_H
 
+#include <stdbool.h>
 #include <stdint.h>
 
 #include <glib.h>
@@ -58,16 +59,16 @@ void g_resolv_unref(GResolv *resolv);
 void g_resolv_set_debug(GResolv *resolv,
                                GResolvDebugFunc func, gpointer user_data);
 
-gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address,
+bool g_resolv_add_nameserver(GResolv *resolv, const char *address,
                                        uint16_t port, unsigned long flags);
 void g_resolv_flush_nameservers(GResolv *resolv);
 
 guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
                                GResolvResultFunc func, gpointer user_data);
 
-gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id);
+bool g_resolv_cancel_lookup(GResolv *resolv, guint id);
 
-gboolean g_resolv_set_address_family(GResolv *resolv, int family);
+bool g_resolv_set_address_family(GResolv *resolv, int family);
 
 #ifdef __cplusplus
 }
index d35179a..f6828cf 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Web service library with GLib integration
  *
- *  Copyright (C) 2009-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2009-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -58,7 +58,7 @@ struct _GWebResult {
        guint16 status;
        const guint8 *buffer;
        gsize length;
-       gboolean use_chunk;
+       bool use_chunk;
        gchar *last_key;
        GHashTable *headers;
 };
@@ -79,16 +79,17 @@ struct web_session {
        guint send_watch;
 
        guint resolv_action;
+       guint address_action;
        char *request;
 
        guint8 *receive_buffer;
        gsize receive_space;
        GString *send_buffer;
        GString *current_header;
-       gboolean header_done;
-       gboolean body_done;
-       gboolean more_data;
-       gboolean request_started;
+       bool header_done;
+       bool body_done;
+       bool more_data;
+       bool request_started;
 
        enum chunk_state chunck_state;
        gsize chunk_size;
@@ -122,7 +123,7 @@ struct _GWeb {
        char *user_agent;
        char *user_agent_profile;
        char *http_version;
-       gboolean close_connection;
+       bool close_connection;
 
        GWebDebugFunc debug_func;
        gpointer debug_data;
@@ -138,7 +139,7 @@ static void _debug(GWeb *web, const char *file, const char *caller,
        va_list ap;
        int len;
 
-       if (web->debug_func == NULL)
+       if (!web->debug_func)
                return;
 
        va_start(ap, format);
@@ -156,12 +157,16 @@ static void free_session(struct web_session *session)
 {
        GWeb *web;
 
-       if (session == NULL)
+       if (!session)
                return;
 
        g_free(session->request);
 
        web = session->web;
+
+       if (session->address_action > 0)
+               g_source_remove(session->address_action);
+
        if (session->resolv_action > 0)
                g_resolv_cancel_lookup(web->resolv, session->resolv_action);
 
@@ -171,18 +176,18 @@ static void free_session(struct web_session *session)
        if (session->send_watch > 0)
                g_source_remove(session->send_watch);
 
-       if (session->transport_channel != NULL)
+       if (session->transport_channel)
                g_io_channel_unref(session->transport_channel);
 
        g_free(session->result.last_key);
 
-       if (session->result.headers != NULL)
+       if (session->result.headers)
                g_hash_table_destroy(session->result.headers);
 
-       if (session->send_buffer != NULL)
+       if (session->send_buffer)
                g_string_free(session->send_buffer, TRUE);
 
-       if (session->current_header != NULL)
+       if (session->current_header)
                g_string_free(session->current_header, TRUE);
 
        g_free(session->receive_buffer);
@@ -191,7 +196,7 @@ static void free_session(struct web_session *session)
 
        g_free(session->host);
        g_free(session->address);
-       if (session->addr != NULL)
+       if (session->addr)
                freeaddrinfo(session->addr);
 
        g_free(session);
@@ -217,7 +222,7 @@ GWeb *g_web_new(int index)
                return NULL;
 
        web = g_try_new0(GWeb, 1);
-       if (web == NULL)
+       if (!web)
                return NULL;
 
        web->ref_count = 1;
@@ -230,21 +235,21 @@ GWeb *g_web_new(int index)
        web->session_list = NULL;
 
        web->resolv = g_resolv_new(index);
-       if (web->resolv == NULL) {
+       if (!web->resolv) {
                g_free(web);
                return NULL;
        }
 
        web->accept_option = g_strdup("*/*");
        web->user_agent = g_strdup_printf("GWeb/%s", VERSION);
-       web->close_connection = FALSE;
+       web->close_connection = false;
 
        return web;
 }
 
 GWeb *g_web_ref(GWeb *web)
 {
-       if (web == NULL)
+       if (!web)
                return NULL;
 
        __sync_fetch_and_add(&web->ref_count, 1);
@@ -254,7 +259,7 @@ GWeb *g_web_ref(GWeb *web)
 
 void g_web_unref(GWeb *web)
 {
-       if (web == NULL)
+       if (!web)
                return;
 
        if (__sync_fetch_and_sub(&web->ref_count, 1) != 1)
@@ -274,14 +279,14 @@ void g_web_unref(GWeb *web)
        g_free(web);
 }
 
-gboolean g_web_supports_tls(void)
+bool g_web_supports_tls(void)
 {
        return g_io_channel_supports_tls();
 }
 
 void g_web_set_debug(GWeb *web, GWebDebugFunc func, gpointer user_data)
 {
-       if (web == NULL)
+       if (!web)
                return;
 
        web->debug_func = func;
@@ -290,14 +295,14 @@ void g_web_set_debug(GWeb *web, GWebDebugFunc func, gpointer user_data)
        g_resolv_set_debug(web->resolv, func, user_data);
 }
 
-gboolean g_web_set_proxy(GWeb *web, const char *proxy)
+bool g_web_set_proxy(GWeb *web, const char *proxy)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        g_free(web->proxy);
 
-       if (proxy == NULL) {
+       if (!proxy) {
                web->proxy = NULL;
                debug(web, "clearing proxy");
        } else {
@@ -305,39 +310,39 @@ gboolean g_web_set_proxy(GWeb *web, const char *proxy)
                debug(web, "setting proxy %s", web->proxy);
        }
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_web_set_address_family(GWeb *web, int family)
+bool g_web_set_address_family(GWeb *web, int family)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        if (family != AF_UNSPEC && family != AF_INET && family != AF_INET6)
-               return FALSE;
+               return false;
 
        web->family = family;
 
        g_resolv_set_address_family(web->resolv, family);
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_web_add_nameserver(GWeb *web, const char *address)
+bool g_web_add_nameserver(GWeb *web, const char *address)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        g_resolv_add_nameserver(web->resolv, address, 53, 0);
 
-       return TRUE;
+       return true;
 }
 
-static gboolean set_accept_option(GWeb *web, const char *format, va_list args)
+static bool set_accept_option(GWeb *web, const char *format, va_list args)
 {
        g_free(web->accept_option);
 
-       if (format == NULL) {
+       if (!format) {
                web->accept_option = NULL;
                debug(web, "clearing accept option");
        } else {
@@ -345,16 +350,16 @@ static gboolean set_accept_option(GWeb *web, const char *format, va_list args)
                debug(web, "setting accept %s", web->accept_option);
        }
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_web_set_accept(GWeb *web, const char *format, ...)
+bool g_web_set_accept(GWeb *web, const char *format, ...)
 {
        va_list args;
-       gboolean result;
+       bool result;
 
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        va_start(args, format);
        result = set_accept_option(web, format, args);
@@ -363,11 +368,11 @@ gboolean g_web_set_accept(GWeb *web, const char *format, ...)
        return result;
 }
 
-static gboolean set_user_agent(GWeb *web, const char *format, va_list args)
+static bool set_user_agent(GWeb *web, const char *format, va_list args)
 {
        g_free(web->user_agent);
 
-       if (format == NULL) {
+       if (!format) {
                web->user_agent = NULL;
                debug(web, "clearing user agent");
        } else {
@@ -375,16 +380,16 @@ static gboolean set_user_agent(GWeb *web, const char *format, va_list args)
                debug(web, "setting user agent %s", web->user_agent);
        }
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_web_set_user_agent(GWeb *web, const char *format, ...)
+bool g_web_set_user_agent(GWeb *web, const char *format, ...)
 {
        va_list args;
-       gboolean result;
+       bool result;
 
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        va_start(args, format);
        result = set_user_agent(web, format, args);
@@ -393,27 +398,27 @@ gboolean g_web_set_user_agent(GWeb *web, const char *format, ...)
        return result;
 }
 
-gboolean g_web_set_ua_profile(GWeb *web, const char *profile)
+bool g_web_set_ua_profile(GWeb *web, const char *profile)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        g_free(web->user_agent_profile);
 
        web->user_agent_profile = g_strdup(profile);
        debug(web, "setting user agent profile %s", web->user_agent);
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_web_set_http_version(GWeb *web, const char *version)
+bool g_web_set_http_version(GWeb *web, const char *version)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        g_free(web->http_version);
 
-       if (version == NULL) {
+       if (!version) {
                web->http_version = NULL;
                debug(web, "clearing HTTP version");
        } else {
@@ -421,21 +426,21 @@ gboolean g_web_set_http_version(GWeb *web, const char *version)
                debug(web, "setting HTTP version %s", web->http_version);
        }
 
-       return TRUE;
+       return true;
 }
 
-void g_web_set_close_connection(GWeb *web, gboolean enabled)
+void g_web_set_close_connection(GWeb *web, bool enabled)
 {
-       if (web == NULL)
+       if (!web)
                return;
 
        web->close_connection = enabled;
 }
 
-gboolean g_web_get_close_connection(GWeb *web)
+bool g_web_get_close_connection(GWeb *web)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
        return web->close_connection;
 }
@@ -443,7 +448,7 @@ gboolean g_web_get_close_connection(GWeb *web)
 static inline void call_result_func(struct web_session *session, guint16 status)
 {
 
-       if (session->result_func == NULL)
+       if (!session->result_func)
                return;
 
        if (status != 0)
@@ -455,30 +460,30 @@ static inline void call_result_func(struct web_session *session, guint16 status)
 
 static inline void call_route_func(struct web_session *session)
 {
-       if (session->route_func != NULL)
+       if (session->route_func)
                session->route_func(session->address, session->addr->ai_family,
                                session->web->index, session->user_data);
 }
 
-static gboolean process_send_buffer(struct web_session *session)
+static bool process_send_buffer(struct web_session *session)
 {
        GString *buf;
        gsize count, bytes_written;
        GIOStatus status;
 
-       if (session == NULL)
-               return FALSE;
+       if (!session)
+               return false;
 
        buf = session->send_buffer;
        count = buf->len;
 
        if (count == 0) {
-               if (session->request_started == TRUE &&
-                                       session->more_data == FALSE &&
+               if (session->request_started &&
+                                       !session->more_data &&
                                        session->fd == -1)
-                       session->body_done = TRUE;
+                       session->body_done = true;
 
-               return FALSE;
+               return false;
        }
 
        status = g_io_channel_write_chars(session->transport_channel,
@@ -488,28 +493,28 @@ static gboolean process_send_buffer(struct web_session *session)
                                        status, count, bytes_written);
 
        if (status != G_IO_STATUS_NORMAL && status != G_IO_STATUS_AGAIN)
-               return FALSE;
+               return false;
 
        g_string_erase(buf, 0, bytes_written);
 
-       return TRUE;
+       return true;
 }
 
-static gboolean process_send_file(struct web_session *session)
+static bool process_send_file(struct web_session *session)
 {
        int sk;
        off_t offset;
        ssize_t bytes_sent;
 
        if (session->fd == -1)
-               return FALSE;
+               return false;
 
-       if (session->request_started == FALSE || session->more_data == TRUE)
-               return FALSE;
+       if (!session->request_started || session->more_data)
+               return false;
 
        sk = g_io_channel_unix_get_fd(session->transport_channel);
        if (sk < 0)
-               return FALSE;
+               return false;
 
        offset = session->offset;
 
@@ -519,17 +524,17 @@ static gboolean process_send_file(struct web_session *session)
                        errno, session->length, bytes_sent);
 
        if (bytes_sent < 0 && errno != EAGAIN)
-               return FALSE;
+               return false;
 
        session->offset = offset;
        session->length -= bytes_sent;
 
        if (session->length == 0) {
-               session->body_done = TRUE;
-               return FALSE;
+               session->body_done = true;
+               return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static void process_next_chunk(struct web_session *session)
@@ -538,8 +543,8 @@ static void process_next_chunk(struct web_session *session)
        const guint8 *body;
        gsize length;
 
-       if (session->input_func == NULL) {
-               session->more_data = FALSE;
+       if (!session->input_func) {
+               session->more_data = false;
                return;
        }
 
@@ -552,7 +557,7 @@ static void process_next_chunk(struct web_session *session)
                g_string_append(buf, "\r\n");
        }
 
-       if (session->more_data == FALSE)
+       if (!session->more_data)
                g_string_append(buf, "0\r\n\r\n");
 }
 
@@ -568,12 +573,12 @@ static void start_request(struct web_session *session)
 
        g_string_truncate(buf, 0);
 
-       if (session->web->http_version == NULL)
+       if (!session->web->http_version)
                version = "1.1";
        else
                version = session->web->http_version;
 
-       if (session->content_type == NULL)
+       if (!session->content_type)
                g_string_append_printf(buf, "GET %s HTTP/%s\r\n",
                                                session->request, version);
        else
@@ -582,42 +587,42 @@ static void start_request(struct web_session *session)
 
        g_string_append_printf(buf, "Host: %s\r\n", session->host);
 
-       if (session->web->user_agent != NULL)
+       if (session->web->user_agent)
                g_string_append_printf(buf, "User-Agent: %s\r\n",
                                                session->web->user_agent);
 
-       if (session->web->user_agent_profile != NULL) {
+       if (session->web->user_agent_profile) {
                g_string_append_printf(buf, "x-wap-profile: %s\r\n",
                                       session->web->user_agent_profile);
        }
 
-       if (session->web->accept_option != NULL)
+       if (session->web->accept_option)
                g_string_append_printf(buf, "Accept: %s\r\n",
                                                session->web->accept_option);
 
-       if (session->content_type != NULL) {
+       if (session->content_type) {
                g_string_append_printf(buf, "Content-Type: %s\r\n",
                                                        session->content_type);
-               if (session->input_func == NULL) {
-                       session->more_data = FALSE;
+               if (!session->input_func) {
+                       session->more_data = false;
                        length = session->length;
                } else
                        session->more_data = session->input_func(&body, &length,
                                                        session->user_data);
-               if (session->more_data == FALSE)
+               if (!session->more_data)
                        g_string_append_printf(buf, "Content-Length: %zu\r\n",
                                                                        length);
                else
                        g_string_append(buf, "Transfer-Encoding: chunked\r\n");
        }
 
-       if (session->web->close_connection == TRUE)
+       if (session->web->close_connection)
                g_string_append(buf, "Connection: close\r\n");
 
        g_string_append(buf, "\r\n");
 
-       if (session->content_type != NULL && length > 0) {
-               if (session->more_data == TRUE) {
+       if (session->content_type && length > 0) {
+               if (session->more_data) {
                        g_string_append_printf(buf, "%zx\r\n", length);
                        g_string_append_len(buf, (char *) body, length);
                        g_string_append(buf, "\r\n");
@@ -636,21 +641,21 @@ static gboolean send_data(GIOChannel *channel, GIOCondition cond,
                return FALSE;
        }
 
-       if (process_send_buffer(session) == TRUE)
+       if (process_send_buffer(session))
                return TRUE;
 
-       if (process_send_file(session) == TRUE)
+       if (process_send_file(session))
                return TRUE;
 
-       if (session->request_started == FALSE) {
-               session->request_started = TRUE;
+       if (!session->request_started) {
+               session->request_started = true;
                start_request(session);
-       } else if (session->more_data == TRUE)
+       } else if (session->more_data)
                process_next_chunk(session);
 
        process_send_buffer(session);
 
-       if (session->body_done == TRUE) {
+       if (session->body_done) {
                session->send_watch = 0;
                return FALSE;
        }
@@ -672,7 +677,7 @@ static int decode_chunked(struct web_session *session,
                switch (session->chunck_state) {
                case CHUNK_SIZE:
                        pos = memchr(ptr, '\n', len);
-                       if (pos == NULL) {
+                       if (!pos) {
                                g_string_append_len(session->current_header,
                                                (gchar *) ptr, len);
                                return 0;
@@ -760,7 +765,7 @@ static int handle_body(struct web_session *session,
 
        debug(session->web, "[body] length %zu", len);
 
-       if (session->result.use_chunk == FALSE) {
+       if (!session->result.use_chunk) {
                if (len > 0) {
                        session->result.buffer = buf;
                        session->result.length = len;
@@ -803,7 +808,7 @@ static void handle_multi_line(struct web_session *session)
 
        value = g_hash_table_lookup(session->result.headers,
                                        session->result.last_key);
-       if (value != NULL) {
+       if (value) {
                g_string_insert(session->current_header, 0, value);
 
                str = session->current_header->str;
@@ -825,7 +830,7 @@ static void add_header_field(struct web_session *session)
        str = session->current_header->str;
 
        pos = memchr(str, ':', session->current_header->len);
-       if (pos != NULL) {
+       if (pos) {
                *pos = '\0';
                pos++;
 
@@ -840,7 +845,7 @@ static void add_header_field(struct web_session *session)
                g_string_erase(session->current_header, 0, count);
 
                value = g_hash_table_lookup(session->result.headers, key);
-               if (value != NULL) {
+               if (value) {
                        g_string_insert_c(session->current_header, 0, ' ');
                        g_string_insert_c(session->current_header, 0, ';');
 
@@ -888,7 +893,7 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
 
        session->receive_buffer[bytes_read] = '\0';
 
-       if (session->header_done == TRUE) {
+       if (session->header_done) {
                if (handle_body(session, session->receive_buffer,
                                                        bytes_read) < 0) {
                        session->transport_watch = 0;
@@ -903,7 +908,7 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
                char *str;
 
                pos = memchr(ptr, '\n', bytes_read);
-               if (pos == NULL) {
+               if (!pos) {
                        g_string_append_len(session->current_header,
                                                (gchar *) ptr, bytes_read);
                        return TRUE;
@@ -928,14 +933,14 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
                if (session->current_header->len == 0) {
                        char *val;
 
-                       session->header_done = TRUE;
+                       session->header_done = true;
 
                        val = g_hash_table_lookup(session->result.headers,
                                                        "Transfer-Encoding");
-                       if (val != NULL) {
+                       if (val) {
                                val = g_strrstr(val, "chunked");
-                               if (val != NULL) {
-                                       session->result.use_chunk = TRUE;
+                               if (val) {
+                                       session->result.use_chunk = true;
 
                                        session->chunck_state = CHUNK_SIZE;
                                        session->chunk_left = 0;
@@ -981,11 +986,11 @@ static int bind_to_address(int sk, const char *interface, int family)
        if (getifaddrs(&ifaddr_list) < 0)
                return err;
 
-       for (ifaddr = ifaddr_list; ifaddr != NULL; ifaddr = ifaddr->ifa_next) {
+       for (ifaddr = ifaddr_list; ifaddr; ifaddr = ifaddr->ifa_next) {
                if (g_strcmp0(ifaddr->ifa_name, interface) != 0)
                        continue;
 
-               if (ifaddr->ifa_addr == NULL ||
+               if (!ifaddr->ifa_addr ||
                                ifaddr->ifa_addr->sa_family != family)
                        continue;
 
@@ -1013,7 +1018,7 @@ static inline int bind_socket(int sk, int index, int family)
        char interface[IF_NAMESIZE];
        int err;
 
-       if (if_indextoname(index, interface) == NULL)
+       if (!if_indextoname(index, interface))
                return -1;
 
        err = setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE,
@@ -1051,7 +1056,7 @@ static int connect_session_transport(struct web_session *session)
                session->transport_channel = g_io_channel_unix_new(sk);
        }
 
-       if (session->transport_channel == NULL) {
+       if (!session->transport_channel) {
                debug(session->web, "channel missing");
                close(sk);
                return -ENOMEM;
@@ -1106,11 +1111,11 @@ static int parse_url(struct web_session *session,
        char *scheme, *host, *port, *path;
 
        scheme = g_strdup(url);
-       if (scheme == NULL)
+       if (!scheme)
                return -EINVAL;
 
        host = strstr(scheme, "://");
-       if (host != NULL) {
+       if (host) {
                *host = '\0';
                host += 3;
 
@@ -1129,16 +1134,16 @@ static int parse_url(struct web_session *session,
        }
 
        path = strchr(host, '/');
-       if (path != NULL)
+       if (path)
                *(path++) = '\0';
 
-       if (proxy == NULL)
+       if (!proxy)
                session->request = g_strdup_printf("/%s", path ? path : "");
        else
                session->request = g_strdup(url);
 
        port = strrchr(host, ':');
-       if (port != NULL) {
+       if (port) {
                char *end;
                int tmp = strtol(port + 1, &end, 10);
 
@@ -1147,7 +1152,7 @@ static int parse_url(struct web_session *session,
                        session->port = tmp;
                }
 
-               if (proxy == NULL)
+               if (!proxy)
                        session->host = g_strdup(host);
                else
                        session->host = g_strdup_printf("%s:%u", host, tmp);
@@ -1156,15 +1161,15 @@ static int parse_url(struct web_session *session,
 
        g_free(scheme);
 
-       if (proxy == NULL)
+       if (!proxy)
                return 0;
 
        scheme = g_strdup(proxy);
-       if (scheme == NULL)
+       if (!scheme)
                return -EINVAL;
 
        host = strstr(proxy, "://");
-       if (host != NULL) {
+       if (host) {
                *host = '\0';
                host += 3;
 
@@ -1176,11 +1181,11 @@ static int parse_url(struct web_session *session,
                host = scheme;
 
        path = strchr(host, '/');
-       if (path != NULL)
+       if (path)
                *(path++) = '\0';
 
        port = strrchr(host, ':');
-       if (port != NULL) {
+       if (port) {
                char *end;
                int tmp = strtol(port + 1, &end, 10);
 
@@ -1197,39 +1202,31 @@ static int parse_url(struct web_session *session,
        return 0;
 }
 
-static void resolv_result(GResolvResultStatus status,
-                                       char **results, gpointer user_data)
+static void handle_resolved_address(struct web_session *session)
 {
-       struct web_session *session = user_data;
        struct addrinfo hints;
        char *port;
        int ret;
 
-       if (results == NULL || results[0] == NULL) {
-               call_result_func(session, 404);
-               return;
-       }
-
-       debug(session->web, "address %s", results[0]);
+       debug(session->web, "address %s", session->address);
 
        memset(&hints, 0, sizeof(struct addrinfo));
        hints.ai_flags = AI_NUMERICHOST;
        hints.ai_family = session->web->family;
 
-       if (session->addr != NULL) {
+       if (session->addr) {
                freeaddrinfo(session->addr);
                session->addr = NULL;
        }
 
        port = g_strdup_printf("%u", session->port);
-       ret = getaddrinfo(results[0], port, &hints, &session->addr);
+       ret = getaddrinfo(session->address, port, &hints, &session->addr);
        g_free(port);
-       if (ret != 0 || session->addr == NULL) {
+       if (ret != 0 || !session->addr) {
                call_result_func(session, 400);
                return;
        }
 
-       session->address = g_strdup(results[0]);
        call_route_func(session);
 
        if (create_transport(session) < 0) {
@@ -1238,20 +1235,63 @@ static void resolv_result(GResolvResultStatus status,
        }
 }
 
+static gboolean already_resolved(gpointer data)
+{
+       struct web_session *session = data;
+
+       session->address_action = 0;
+       handle_resolved_address(session);
+
+       return FALSE;
+}
+
+static void resolv_result(GResolvResultStatus status,
+                                       char **results, gpointer user_data)
+{
+       struct web_session *session = user_data;
+
+       if (!results || !results[0]) {
+               call_result_func(session, 404);
+               return;
+       }
+
+       g_free(session->address);
+       session->address = g_strdup(results[0]);
+
+       handle_resolved_address(session);
+}
+
+static bool is_ip_address(const char *host)
+{
+       struct addrinfo hints;
+       struct addrinfo *addr;
+       int result;
+
+       memset(&hints, 0, sizeof(struct addrinfo));
+       hints.ai_flags = AI_NUMERICHOST;
+       addr = NULL;
+
+       result = getaddrinfo(host, NULL, &hints, &addr);
+       freeaddrinfo(addr);
+
+       return result == 0;
+}
+
 static guint do_request(GWeb *web, const char *url,
                                const char *type, GWebInputFunc input,
                                int fd, gsize length, GWebResultFunc func,
                                GWebRouteFunc route, gpointer user_data)
 {
        struct web_session *session;
+       const gchar *host;
 
-       if (web == NULL || url == NULL)
+       if (!web || !url)
                return 0;
 
        debug(web, "request %s", url);
 
        session = g_try_new0(struct web_session, 1);
-       if (session == NULL)
+       if (!session)
                return 0;
 
        if (parse_url(session, url, web->proxy) < 0) {
@@ -1259,13 +1299,13 @@ static guint do_request(GWeb *web, const char *url,
                return 0;
        }
 
-       debug(web, "address %s", session->address);
+       debug(web, "proxy host %s", session->address);
        debug(web, "port %u", session->port);
        debug(web, "host %s", session->host);
        debug(web, "flags %lu", session->flags);
        debug(web, "request %s", session->request);
 
-       if (type != NULL) {
+       if (type) {
                session->content_type = g_strdup(type);
 
                debug(web, "content-type %s", session->content_type);
@@ -1282,14 +1322,14 @@ static guint do_request(GWeb *web, const char *url,
        session->user_data = user_data;
 
        session->receive_buffer = g_try_malloc(DEFAULT_BUFFER_SIZE);
-       if (session->receive_buffer == NULL) {
+       if (!session->receive_buffer) {
                free_session(session);
                return 0;
        }
 
        session->result.headers = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                        g_free, g_free);
-       if (session->result.headers == NULL) {
+       if (!session->result.headers) {
                free_session(session);
                return 0;
        }
@@ -1297,43 +1337,21 @@ static guint do_request(GWeb *web, const char *url,
        session->receive_space = DEFAULT_BUFFER_SIZE;
        session->send_buffer = g_string_sized_new(0);
        session->current_header = g_string_sized_new(0);
-       session->header_done = FALSE;
-       session->body_done = FALSE;
-
-       if (session->address == NULL && inet_aton(session->host, NULL) == 0) {
-               session->resolv_action = g_resolv_lookup_hostname(web->resolv,
-                                       session->host, resolv_result, session);
-               if (session->resolv_action == 0) {
-                       free_session(session);
-                       return 0;
+       session->header_done = false;
+       session->body_done = false;
+
+       host = session->address ? session->address : session->host;
+       if (is_ip_address(host)) {
+               if (session->address != host) {
+                       g_free(session->address);
+                       session->address = g_strdup(host);
                }
+               session->address_action = g_timeout_add(0, already_resolved,
+                                                       session);
        } else {
-               struct addrinfo hints;
-               char *port;
-               int ret;
-
-               if (session->address == NULL)
-                       session->address = g_strdup(session->host);
-
-               memset(&hints, 0, sizeof(struct addrinfo));
-               hints.ai_flags = AI_NUMERICHOST;
-               hints.ai_family = session->web->family;
-
-               if (session->addr != NULL) {
-                       freeaddrinfo(session->addr);
-                       session->addr = NULL;
-               }
-
-               port = g_strdup_printf("%u", session->port);
-               ret = getaddrinfo(session->address, port, &hints,
-                                                       &session->addr);
-               g_free(port);
-               if (ret != 0 || session->addr == NULL) {
-                       free_session(session);
-                       return 0;
-               }
-
-               if (create_transport(session) < 0) {
+               session->resolv_action = g_resolv_lookup_hostname(web->resolv,
+                                       host, resolv_result, session);
+               if (session->resolv_action == 0) {
                        free_session(session);
                        return 0;
                }
@@ -1380,54 +1398,54 @@ guint g_web_request_post_file(GWeb *web, const char *url,
        return ret;
 }
 
-gboolean g_web_cancel_request(GWeb *web, guint id)
+bool g_web_cancel_request(GWeb *web, guint id)
 {
-       if (web == NULL)
-               return FALSE;
+       if (!web)
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 guint16 g_web_result_get_status(GWebResult *result)
 {
-       if (result == NULL)
+       if (!result)
                return 0;
 
        return result->status;
 }
 
-gboolean g_web_result_get_chunk(GWebResult *result,
+bool g_web_result_get_chunk(GWebResult *result,
                                const guint8 **chunk, gsize *length)
 {
-       if (result == NULL)
-               return FALSE;
+       if (!result)
+               return false;
 
-       if (chunk == NULL)
-               return FALSE;
+       if (!chunk)
+               return false;
 
        *chunk = result->buffer;
 
-       if (length != NULL)
+       if (length)
                *length = result->length;
 
-       return TRUE;
+       return true;
 }
 
-gboolean g_web_result_get_header(GWebResult *result,
+bool g_web_result_get_header(GWebResult *result,
                                const char *header, const char **value)
 {
-       if (result == NULL)
-               return FALSE;
+       if (!result)
+               return false;
 
-       if (value == NULL)
-               return FALSE;
+       if (!value)
+               return false;
 
        *value = g_hash_table_lookup(result->headers, header);
 
-       if (*value == NULL)
-               return FALSE;
+       if (!*value)
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 struct _GWebParser {
@@ -1437,7 +1455,7 @@ struct _GWebParser {
        const char *token_str;
        size_t token_len;
        size_t token_pos;
-       gboolean intoken;
+       bool intoken;
        GString *content;
        GWebParserFunc func;
        gpointer user_data;
@@ -1449,7 +1467,7 @@ GWebParser *g_web_parser_new(const char *begin, const char *end,
        GWebParser *parser;
 
        parser = g_try_new0(GWebParser, 1);
-       if (parser == NULL)
+       if (!parser)
                return NULL;
 
        parser->ref_count = 1;
@@ -1457,7 +1475,7 @@ GWebParser *g_web_parser_new(const char *begin, const char *end,
        parser->begin_token = g_strdup(begin);
        parser->end_token = g_strdup(end);
 
-       if (parser->begin_token == NULL) {
+       if (!parser->begin_token) {
                g_free(parser);
                return NULL;
        }
@@ -1469,7 +1487,7 @@ GWebParser *g_web_parser_new(const char *begin, const char *end,
        parser->token_len = strlen(parser->token_str);
        parser->token_pos = 0;
 
-       parser->intoken = FALSE;
+       parser->intoken = false;
        parser->content = g_string_sized_new(0);
 
        return parser;
@@ -1477,7 +1495,7 @@ GWebParser *g_web_parser_new(const char *begin, const char *end,
 
 GWebParser *g_web_parser_ref(GWebParser *parser)
 {
-       if (parser == NULL)
+       if (!parser)
                return NULL;
 
        __sync_fetch_and_add(&parser->ref_count, 1);
@@ -1487,7 +1505,7 @@ GWebParser *g_web_parser_ref(GWebParser *parser)
 
 void g_web_parser_unref(GWebParser *parser)
 {
-       if (parser == NULL)
+       if (!parser)
                return;
 
        if (__sync_fetch_and_sub(&parser->ref_count, 1) != 1)
@@ -1505,7 +1523,7 @@ void g_web_parser_feed_data(GWebParser *parser,
 {
        const guint8 *ptr = data;
 
-       if (parser == NULL)
+       if (!parser)
                return;
 
        while (length > 0) {
@@ -1515,14 +1533,14 @@ void g_web_parser_feed_data(GWebParser *parser,
                        guint8 *pos;
 
                        pos = memchr(ptr, chr, length);
-                       if (pos == NULL) {
-                               if (parser->intoken == TRUE)
+                       if (!pos) {
+                               if (parser->intoken)
                                        g_string_append_len(parser->content,
                                                        (gchar *) ptr, length);
                                break;
                        }
 
-                       if (parser->intoken == TRUE)
+                       if (parser->intoken)
                                g_string_append_len(parser->content,
                                                (gchar *) ptr, (pos - ptr) + 1);
 
@@ -1533,7 +1551,7 @@ void g_web_parser_feed_data(GWebParser *parser,
                        continue;
                }
 
-               if (parser->intoken == TRUE)
+               if (parser->intoken)
                        g_string_append_c(parser->content, ptr[0]);
 
                if (ptr[0] != chr) {
@@ -1550,11 +1568,11 @@ void g_web_parser_feed_data(GWebParser *parser,
                parser->token_pos++;
 
                if (parser->token_pos == parser->token_len) {
-                       if (parser->intoken == FALSE) {
+                       if (!parser->intoken) {
                                g_string_append(parser->content,
                                                        parser->token_str);
 
-                               parser->intoken = TRUE;
+                               parser->intoken = true;
                                parser->token_str = parser->end_token;
                                parser->token_len = strlen(parser->end_token);
                                parser->token_pos = 0;
@@ -1566,7 +1584,7 @@ void g_web_parser_feed_data(GWebParser *parser,
                                        parser->func(str, parser->user_data);
                                g_free(str);
 
-                               parser->intoken = FALSE;
+                               parser->intoken = false;
                                parser->token_str = parser->begin_token;
                                parser->token_len = strlen(parser->begin_token);
                                parser->token_pos = 0;
@@ -1577,6 +1595,6 @@ void g_web_parser_feed_data(GWebParser *parser,
 
 void g_web_parser_end_data(GWebParser *parser)
 {
-       if (parser == NULL)
+       if (!parser)
                return;
 }
index 104345e..6c28542 100644 (file)
@@ -22,6 +22,7 @@
 #ifndef __G_WEB_H
 #define __G_WEB_H
 
+#include <stdbool.h>
 #include <stdint.h>
 
 #include <glib.h>
@@ -38,12 +39,12 @@ typedef struct _GWeb GWeb;
 typedef struct _GWebResult GWebResult;
 typedef struct _GWebParser GWebParser;
 
-typedef gboolean (*GWebResultFunc)(GWebResult *result, gpointer user_data);
+typedef bool (*GWebResultFunc)(GWebResult *result, gpointer user_data);
 
-typedef gboolean (*GWebRouteFunc)(const char *addr, int ai_family,
+typedef bool (*GWebRouteFunc)(const char *addr, int ai_family,
                int if_index, gpointer user_data);
 
-typedef gboolean (*GWebInputFunc)(const guint8 **data, gsize *length,
+typedef bool (*GWebInputFunc)(const guint8 **data, gsize *length,
                                                        gpointer user_data);
 
 typedef void (*GWebDebugFunc)(const char *str, gpointer user_data);
@@ -55,24 +56,24 @@ void g_web_unref(GWeb *web);
 
 void g_web_set_debug(GWeb *web, GWebDebugFunc func, gpointer user_data);
 
-gboolean g_web_supports_tls(void);
+bool g_web_supports_tls(void);
 
-gboolean g_web_set_proxy(GWeb *web, const char *proxy);
+bool g_web_set_proxy(GWeb *web, const char *proxy);
 
-gboolean g_web_set_address_family(GWeb *web, int family);
+bool g_web_set_address_family(GWeb *web, int family);
 
-gboolean g_web_add_nameserver(GWeb *web, const char *address);
+bool g_web_add_nameserver(GWeb *web, const char *address);
 
-gboolean g_web_set_accept(GWeb *web, const char *format, ...)
+bool g_web_set_accept(GWeb *web, const char *format, ...)
                                __attribute__((format(printf, 2, 3)));
-gboolean g_web_set_user_agent(GWeb *web, const char *format, ...)
+bool g_web_set_user_agent(GWeb *web, const char *format, ...)
                                __attribute__((format(printf, 2, 3)));
-gboolean g_web_set_ua_profile(GWeb *web, const char *profile);
+bool g_web_set_ua_profile(GWeb *web, const char *profile);
 
-gboolean g_web_set_http_version(GWeb *web, const char *version);
+bool g_web_set_http_version(GWeb *web, const char *version);
 
-void g_web_set_close_connection(GWeb *web, gboolean enabled);
-gboolean g_web_get_close_connection(GWeb *web);
+void g_web_set_close_connection(GWeb *web, bool enabled);
+bool g_web_get_close_connection(GWeb *web);
 
 guint g_web_request_get(GWeb *web, const char *url,
                                GWebResultFunc func, GWebRouteFunc route,
@@ -84,13 +85,13 @@ guint g_web_request_post_file(GWeb *web, const char *url,
                                const char *type, const char *file,
                                GWebResultFunc func, gpointer user_data);
 
-gboolean g_web_cancel_request(GWeb *web, guint id);
+bool g_web_cancel_request(GWeb *web, guint id);
 
 guint16 g_web_result_get_status(GWebResult *result);
 
-gboolean g_web_result_get_header(GWebResult *result,
+bool g_web_result_get_header(GWebResult *result,
                                const char *header, const char **value);
-gboolean g_web_result_get_chunk(GWebResult *result,
+bool g_web_result_get_chunk(GWebResult *result,
                                const guint8 **chunk, gsize *length);
 
 typedef void (*GWebParserFunc)(const char *str, gpointer user_data);
index a084194..05462df 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,6 +22,8 @@
 #ifndef __CONNMAN_AGENT_H
 #define __CONNMAN_AGENT_H
 
+#include <stdbool.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -48,11 +50,12 @@ int connman_agent_driver_register(struct connman_agent_driver *driver);
 void connman_agent_driver_unregister(struct connman_agent_driver *driver);
 
 typedef void (* report_error_cb_t) (void *user_context,
-                               gboolean retry, void *user_data);
+                               bool retry, void *user_data);
 
 int connman_agent_report_error(void *user_context, const char *path,
                                const char *error,
-                               report_error_cb_t callback, void *user_data);
+                               report_error_cb_t callback,
+                               const char *dbus_sender, void *user_data);
 
 int connman_agent_register(const char *sender, const char *path);
 int connman_agent_unregister(const char *sender, const char *path);
@@ -62,9 +65,11 @@ typedef void (*agent_queue_cb)(DBusMessage *reply, void *user_data);
 
 int connman_agent_queue_message(void *user_context,
                                DBusMessage *msg, int timeout,
-                               agent_queue_cb callback, void *user_data);
+                               agent_queue_cb callback, void *user_data,
+                               void *agent_data);
 
-void connman_agent_get_info(const char **sender, const char **path);
+void *connman_agent_get_info(const char *dbus_sender, const char **sender,
+                                                       const char **path);
 
 #ifdef __cplusplus
 }
index 85e8ede..253a23b 100644 (file)
@@ -46,6 +46,7 @@ extern "C" {
 #define CONNMAN_TECHNOLOGY_INTERFACE   CONNMAN_SERVICE ".Technology"
 #define CONNMAN_SESSION_INTERFACE      CONNMAN_SERVICE ".Session"
 #define CONNMAN_NOTIFICATION_INTERFACE CONNMAN_SERVICE ".Notification"
+#define CONNMAN_PEER_INTERFACE         CONNMAN_SERVICE ".Peer"
 
 #define CONNMAN_PRIVILEGE_MODIFY       1
 #define CONNMAN_PRIVILEGE_SECRET       2
index 3382575..57b925c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,8 +22,8 @@
 #ifndef __CONNMAN_DEVICE_H
 #define __CONNMAN_DEVICE_H
 
-#include <connman/types.h>
 #include <connman/network.h>
+#include <connman/service.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -78,16 +78,16 @@ void connman_device_set_ident(struct connman_device *device,
 const char *connman_device_get_ident(struct connman_device *device);
 
 int connman_device_set_powered(struct connman_device *device,
-                                               connman_bool_t powered);
-connman_bool_t connman_device_get_powered(struct connman_device *device);
+                                               bool powered);
+bool connman_device_get_powered(struct connman_device *device);
 int connman_device_set_scanning(struct connman_device *device,
-                                               connman_bool_t scanning);
-connman_bool_t connman_device_get_scanning(struct connman_device *device);
+                               enum connman_service_type type, bool scanning);
+bool connman_device_get_scanning(struct connman_device *device);
 void connman_device_reset_scanning(struct connman_device *device);
 
 int connman_device_set_disconnected(struct connman_device *device,
-                                               connman_bool_t disconnected);
-connman_bool_t connman_device_get_disconnected(struct connman_device *device);
+                                               bool disconnected);
+bool connman_device_get_disconnected(struct connman_device *device);
 
 int connman_device_set_string(struct connman_device *device,
                                        const char *key, const char *value);
@@ -100,7 +100,6 @@ struct connman_network *connman_device_get_network(struct connman_device *device
                                                        const char *identifier);
 int connman_device_remove_network(struct connman_device *device,
                                        struct connman_network *network);
-void connman_device_remove_all_networks(struct connman_device *device);
 
 int connman_device_register(struct connman_device *device);
 void connman_device_unregister(struct connman_device *device);
@@ -114,7 +113,6 @@ void connman_device_regdom_notify(struct connman_device *device,
                                        int result, const char *alpha2);
 struct connman_device *connman_device_create_from_index(int index);
 struct connman_device *connman_device_find_by_index(int index);
-int connman_device_disconnect_service(struct connman_device *device);
 int connman_device_reconnect_service(struct connman_device *device);
 
 struct connman_device_driver {
@@ -125,10 +123,11 @@ struct connman_device_driver {
        void (*remove) (struct connman_device *device);
        int (*enable) (struct connman_device *device);
        int (*disable) (struct connman_device *device);
-       int (*scan)(struct connman_device *device,
+       int (*scan)(enum connman_service_type type,
+                       struct connman_device *device,
                        const char *ssid, unsigned int ssid_len,
                        const char *identity, const char* passphrase,
-                       void *user_data);
+                       const char *security, void *user_data);
        int (*set_regdom) (struct connman_device *device,
                                                const char *alpha2);
 };
index 8f7a35c..a836a5b 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -41,7 +41,7 @@ short int connman_inet_ifflags(int index);
 int connman_inet_ifup(int index);
 int connman_inet_ifdown(int index);
 
-connman_bool_t connman_inet_is_cfg80211(int index);
+bool connman_inet_is_cfg80211(int index);
 
 int connman_inet_set_address(int index, struct connman_ipaddress *ipaddress);
 int connman_inet_clear_address(int index, struct connman_ipaddress *ipaddress);
@@ -50,11 +50,10 @@ int connman_inet_del_host_route(int index, const char *host);
 int connman_inet_add_network_route(int index, const char *host, const char *gateway,
                                        const char *netmask);
 int connman_inet_del_network_route(int index, const char *host);
-int connman_inet_set_gateway_address(int index, const char *gateway);
 int connman_inet_clear_gateway_address(int index, const char *gateway);
 int connman_inet_set_gateway_interface(int index);
 int connman_inet_clear_gateway_interface(int index);
-connman_bool_t connman_inet_compare_subnet(int index, const char *host);
+bool connman_inet_compare_subnet(int index, const char *host);
 int connman_inet_set_ipv6_address(int index,
                struct connman_ipaddress *ipaddress);
 int connman_inet_clear_ipv6_address(int index,
@@ -66,7 +65,6 @@ int connman_inet_add_ipv6_host_route(int index, const char *host,
 int connman_inet_del_ipv6_network_route(int index, const char *host,
                                        unsigned char prefix_len);
 int connman_inet_del_ipv6_host_route(int index, const char *host);
-int connman_inet_set_ipv6_gateway_address(int index, const char *gateway);
 int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway);
 int connman_inet_set_ipv6_gateway_interface(int index);
 int connman_inet_clear_ipv6_gateway_interface(int index);
@@ -80,8 +78,8 @@ int connman_inet_create_tunnel(char **iface);
 int connman_inet_get_dest_addr(int index, char **dest);
 int connman_inet_ipv6_get_dest_addr(int index, char **dest);
 int connman_inet_check_ipaddress(const char *host);
-connman_bool_t connman_inet_check_hostname(const char *ptr, size_t len);
-connman_bool_t connman_inet_is_ipv6_supported();
+bool connman_inet_check_hostname(const char *ptr, size_t len);
+bool connman_inet_is_ipv6_supported();
 
 #ifdef __cplusplus
 }
index cc6848e..4ced318 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
index 2a7de10..8b00e9d 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -41,6 +41,14 @@ void connman_error(const char *format, ...)
 void connman_debug(const char *format, ...)
                                __attribute__((format(printf, 1, 2)));
 
+#define connman_warn_once(fmt, arg...) do {            \
+       static bool printed;                            \
+       if (!printed) {                                 \
+               connman_warn(fmt, ## arg);              \
+               printed = true;                         \
+       }                                               \
+} while (0)
+
 struct connman_debug_desc {
        const char *name;
        const char *file;
index 6550493..fcb6905 100644 (file)
@@ -1,9 +1,8 @@
-
 /*
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -23,9 +22,9 @@
 #ifndef __CONNMAN_NETWORK_H
 #define __CONNMAN_NETWORK_H
 
+#include <stdbool.h>
 #include <stdint.h>
 
-#include <connman/types.h>
 #include <connman/device.h>
 #include <connman/ipconfig.h>
 
@@ -46,6 +45,7 @@ enum connman_network_type {
        CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN = 8,
        CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN = 9,
        CONNMAN_NETWORK_TYPE_CELLULAR      = 10,
+       CONNMAN_NETWORK_TYPE_GADGET        = 11,
        CONNMAN_NETWORK_TYPE_VENDOR        = 10000,
 };
 
@@ -88,20 +88,20 @@ void connman_network_set_group(struct connman_network *network,
                                                const char *group);
 const char *connman_network_get_group(struct connman_network *network);
 
-connman_bool_t connman_network_get_connecting(struct connman_network *network);
+bool connman_network_get_connecting(struct connman_network *network);
 int connman_network_set_available(struct connman_network *network,
-                                               connman_bool_t available);
-connman_bool_t connman_network_get_available(struct connman_network *network);
+                                               bool available);
+bool connman_network_get_available(struct connman_network *network);
 int connman_network_set_associating(struct connman_network *network,
-                                               connman_bool_t associating);
+                                               bool associating);
 void connman_network_set_error(struct connman_network *network,
                                        enum connman_network_error error);
 void connman_network_clear_error(struct connman_network *network);
 int connman_network_set_connected(struct connman_network *network,
-                                               connman_bool_t connected);
-connman_bool_t connman_network_get_connected(struct connman_network *network);
+                                               bool connected);
+bool connman_network_get_connected(struct connman_network *network);
 
-connman_bool_t connman_network_get_associating(struct connman_network *network);
+bool connman_network_get_associating(struct connman_network *network);
 
 void connman_network_clear_hidden(void *user_data);
 int connman_network_connect_hidden(struct connman_network *network,
@@ -134,8 +134,8 @@ int connman_network_set_string(struct connman_network *network,
 const char *connman_network_get_string(struct connman_network *network,
                                                        const char *key);
 int connman_network_set_bool(struct connman_network *network,
-                                       const char *key, connman_bool_t value);
-connman_bool_t connman_network_get_bool(struct connman_network *network,
+                                       const char *key, bool value);
+bool connman_network_get_bool(struct connman_network *network,
                                                        const char *key);
 int connman_network_set_blob(struct connman_network *network,
                        const char *key, const void *data, unsigned int size);
index 4412717..50b5fb4 100644 (file)
@@ -47,14 +47,14 @@ struct connman_notifier {
                                const char *name);
        void (*service_remove) (struct connman_service *service);
        void (*service_enabled) (enum connman_service_type type,
-                                               connman_bool_t enabled);
-       void (*offline_mode) (connman_bool_t enabled);
+                                               bool enabled);
+       void (*offline_mode) (bool enabled);
        void (*proxy_changed) (struct connman_service *service);
        void (*service_state_changed) (struct connman_service *service,
                                        enum connman_service_state state);
        void (*ipconfig_changed) (struct connman_service *service,
                                        struct connman_ipconfig *ipconfig);
-       void (*idle_state) (connman_bool_t idle);
+       void (*idle_state) (bool idle);
 };
 
 int connman_notifier_register(struct connman_notifier *notifier);
diff --git a/include/peer.h b/include/peer.h
new file mode 100644 (file)
index 0000000..807c945
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2014  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __CONNMAN_PEER_H
+#define __CONNMAN_PEER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct connman_peer;
+
+struct connman_peer *connman_peer_create(const char *identifier);
+void connman_peer_destroy(struct connman_peer *peer);
+
+void connman_peer_set_name(struct connman_peer *peer, const char *name);
+
+int connman_peer_register(struct connman_peer *peer);
+void connman_peer_unregister(struct connman_peer *peer);
+
+struct connman_peer *connman_peer_get(const char *identifier);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CONNMAN_PEER_H */
index 1f33552..d1a8983 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,8 +22,9 @@
 #ifndef __CONNMAN_PROVIDER_H
 #define __CONNMAN_PROVIDER_H
 
+#include <stdbool.h>
+
 #include <glib.h>
-#include <connman/types.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -103,7 +104,7 @@ int connman_provider_set_pac(struct connman_provider *provider,
                                const char *pac);
 int connman_provider_create_service(struct connman_provider *provider);
 int connman_provider_set_immutable(struct connman_provider *provider,
-                                               connman_bool_t immutable);
+                                               bool immutable);
 struct connman_provider *connman_provider_get(const char *identifier);
 void connman_provider_put(struct connman_provider *provider);
 int connman_provider_set_domain(struct connman_provider *provider,
@@ -133,7 +134,7 @@ struct connman_provider_driver {
        int (*create) (DBusMessage *msg, connection_ready_cb callback);
        int (*set_routes) (struct connman_provider *provider,
                                enum connman_provider_route_type type);
-       connman_bool_t (*check_routes) (struct connman_provider *provider);
+       bool (*check_routes) (struct connman_provider *provider);
 };
 
 int connman_provider_driver_register(struct connman_provider_driver *driver);
index b5f736e..3eb80a8 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,7 +22,7 @@
 #ifndef __CONNMAN_PROVISION_H
 #define __CONNMAN_PROVISION_H
 
-#include <connman/types.h>
+#include <stdbool.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -39,7 +39,7 @@ struct connman_config_entry {
        char *name;
        void *ssid;
        unsigned int ssid_len;
-       connman_bool_t hidden;
+       bool hidden;
 };
 
 int connman_config_provision_mutable_service(GKeyFile *keyfile);
index 5e646a0..31dfce7 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,7 +22,7 @@
 #ifndef __CONNMAN_SERVICE_H
 #define __CONNMAN_SERVICE_H
 
-#include <connman/types.h>
+#include <stdbool.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -44,7 +44,10 @@ enum connman_service_type {
        CONNMAN_SERVICE_TYPE_GPS       = 6,
        CONNMAN_SERVICE_TYPE_VPN       = 7,
        CONNMAN_SERVICE_TYPE_GADGET    = 8,
+       CONNMAN_SERVICE_TYPE_P2P       = 9,
 };
+#define        MAX_CONNMAN_SERVICE_TYPES        10
+
 
 enum connman_service_security {
        CONNMAN_SERVICE_SECURITY_UNKNOWN = 0,
@@ -85,6 +88,13 @@ enum connman_service_proxy_method {
        CONNMAN_SERVICE_PROXY_METHOD_AUTO        = 3,
 };
 
+enum connman_service_connect_reason {
+       CONNMAN_SERVICE_CONNECT_REASON_NONE     = 0,
+       CONNMAN_SERVICE_CONNECT_REASON_AUTO     = 1,
+       CONNMAN_SERVICE_CONNECT_REASON_USER     = 2,
+       CONNMAN_SERVICE_CONNECT_REASON_SESSION  = 3,
+};
+
 struct connman_service;
 struct connman_network;
 
@@ -115,7 +125,8 @@ char **connman_service_get_proxy_servers(struct connman_service *service);
 char **connman_service_get_proxy_excludes(struct connman_service *service);
 const char *connman_service_get_proxy_url(struct connman_service *service);
 const char *connman_service_get_proxy_autoconfig(struct connman_service *service);
-connman_bool_t connman_service_get_favorite(struct connman_service *service);
+bool connman_service_get_favorite(struct connman_service *service);
+bool connman_service_get_autoconnect(struct connman_service *service);
 
 struct connman_service *connman_service_lookup_from_network(struct connman_network *network);
 
index 61cc264..3f66664 100644 (file)
@@ -23,7 +23,6 @@
 #define __CONNMAN_SESSION_H
 
 #include <connman/service.h>
-#include <connman/types.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -56,32 +55,15 @@ enum connman_session_id_type {
        CONNMAN_SESSION_ID_TYPE_LSM     = 3,
 };
 
-struct cb_data {
-       void *cb;
-       void *user_data;
-       void *data;
-};
-
-static inline struct cb_data *cb_data_new(void *cb, void *user_data)
-{
-       struct cb_data *ret;
-
-       ret = g_new0(struct cb_data, 1);
-       ret->cb = cb;
-       ret->user_data = user_data;
-
-       return ret;
-}
-
 struct connman_session;
 
 struct connman_session_config {
        enum connman_session_id_type id_type;
        char *id;
-       connman_bool_t priority;
+       bool priority;
        enum connman_session_roaming_policy roaming_policy;
        enum connman_session_type type;
-       connman_bool_t ecall;
+       bool ecall;
        GSList *allowed_bearers;
 };
 
@@ -92,10 +74,15 @@ typedef int (* connman_session_config_func_t) (struct connman_session *session,
 struct connman_session_policy {
        const char *name;
        int priority;
+       bool (*autoconnect)(enum connman_service_connect_reason reason);
        int (*create)(struct connman_session *session,
                        connman_session_config_func_t cb,
                        void *user_data);
        void (*destroy)(struct connman_session *session);
+       void (*session_changed)(struct connman_session *session, bool active,
+                               GSList *bearers);
+       bool (*allowed)(struct connman_session *session,
+                       struct connman_service *service);
 };
 
 int connman_session_policy_register(struct connman_session_policy *config);
@@ -113,6 +100,9 @@ int connman_session_parse_bearers(const char *token, GSList **list);
 
 const char *connman_session_get_owner(struct connman_session *session);
 
+int connman_session_connect(struct connman_service *service);
+int connman_session_disconnect(struct connman_service *service);
+
 #ifdef __cplusplus
 }
 #endif
index e867a78..a882021 100644 (file)
 #ifndef __CONNMAN_SETTING_H
 #define __CONNMAN_SETTING_H
 
-#include <connman/types.h>
+#include <stdbool.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-connman_bool_t connman_setting_get_bool(const char *key);
+bool connman_setting_get_bool(const char *key);
 char **connman_setting_get_string_list(const char *key);
 unsigned int *connman_setting_get_uint_list(const char *key);
 
index 9fe994c..d7fcdde 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -37,14 +37,14 @@ extern "C" {
 struct connman_technology;
 
 void connman_technology_tethering_notify(struct connman_technology *technology,
-                                                       connman_bool_t enabled);
+                                                       bool enabled);
 int connman_technology_set_regdom(const char *alpha2);
 void connman_technology_regdom_notify(struct connman_technology *technology,
                                                        const char *alpha2);
 
-connman_bool_t connman_technology_get_wifi_tethering(const char **ssid,
+bool connman_technology_get_wifi_tethering(const char **ssid,
                                                        const char **psk);
-connman_bool_t connman_technology_is_tethering_allowed(enum connman_service_type type);
+bool connman_technology_is_tethering_allowed(enum connman_service_type type);
 
 struct connman_technology_driver {
        const char *name;
@@ -59,7 +59,7 @@ struct connman_technology_driver {
                                                                int index);
        int (*set_tethering) (struct connman_technology *technology,
                                const char *identifier, const char *passphrase,
-                               const char *bridge, connman_bool_t enabled);
+                               const char *bridge, bool enabled);
        int (*set_regdom) (struct connman_technology *technology,
                                                const char *alpha2);
 };
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..a9244eb
--- /dev/null
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-01-19.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""       $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+       # Protect names problematic for `test' and other utilities.
+       case $dst_arg in
+         -* | [=\(\)!]) dst_arg=./$dst_arg;;
+       esac
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for `test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
+       fi
+
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+           if (umask $mkdir_umask &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writeable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/d" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       [-=\(\)!]*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test X"$d" = X && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644 (file)
index 0000000..33f642a
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,9661 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:        $host
+#         shell:               $SHELL
+#         compiler:            $LTCC
+#         compiler flags:              $LTCFLAGS
+#         linker:              $LD (gnu? $with_gnu_ld)
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#         automake:    $automake_version
+#         autoconf:    $autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1.1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+         export $lt_var
+         lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+         lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+       fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77     # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS="  $lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+               s@/\./@/@g
+               t dotsl
+               s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+       # list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+       IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+       func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+       my_arg=`$ECHO "$1" | $SED \
+           -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+       eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+           $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+       eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+       :more
+       /\./!{
+         N
+         s/\n# / /
+         b more
+       }
+       :go
+       /^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+       s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+       s/^# *$//
+       s/\$progname/'$progname'/
+       p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+       :print
+        s/^# //
+       s/^# *$//
+       s*\$progname*'$progname'*
+       s*\$host*'"$host"'*
+       s*\$SHELL*'"$SHELL"'*
+       s*\$LTCC*'"$LTCC"'*
+       s*\$LTCFLAGS*'"$LTCFLAGS"'*
+       s*\$LD*'"$LD"'*
+       s/\$with_gnu_ld/'"$with_gnu_ld"'/
+       s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+       s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+       p
+       d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+       taglist="$taglist $tagname"
+
+       # Evaluate the configuration.  Be careful to quote the path
+       # and the sed script, to avoid splitting on whitespace, but
+       # also don't use non-portable quotes within backquotes within
+       # quotes we have to do it in 2 steps:
+       extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+       eval "$extractedcf"
+      else
+       func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)      opt_debug='set -x'
+                       func_echo "enabling shell trace mode"
+                       $opt_debug
+                       ;;
+      --dry-run|--dryrun|-n)
+                       opt_dry_run=:
+                       ;;
+      --config)
+                       opt_config=:
+func_config
+                       ;;
+      --dlopen|-dlopen)
+                       optarg="$1"
+                       opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+                       shift
+                       ;;
+      --preserve-dup-deps)
+                       opt_preserve_dup_deps=:
+                       ;;
+      --features)
+                       opt_features=:
+func_features
+                       ;;
+      --finish)
+                       opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+                       ;;
+      --help)
+                       opt_help=:
+                       ;;
+      --help-all)
+                       opt_help_all=:
+opt_help=': help-all'
+                       ;;
+      --mode)
+                       test $# = 0 && func_missing_arg $opt && break
+                       optarg="$1"
+                       opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+                       shift
+                       ;;
+      --no-silent|--no-quiet)
+                       opt_silent=false
+func_append preserve_args " $opt"
+                       ;;
+      --no-warning|--no-warn)
+                       opt_warning=false
+func_append preserve_args " $opt"
+                       ;;
+      --no-verbose)
+                       opt_verbose=false
+func_append preserve_args " $opt"
+                       ;;
+      --silent|--quiet)
+                       opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+                       ;;
+      --verbose|-v)
+                       opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+                       ;;
+      --tag)
+                       test $# = 0 && func_missing_arg $opt && break
+                       optarg="$1"
+                       opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+                       shift
+                       ;;
+
+      -\?|-h)          func_usage                              ;;
+      --help)          func_help                               ;;
+      --version)       func_version                            ;;
+
+      # Separate optargs to long options:
+      --*=*)
+                       func_split_long_opt "$opt"
+                       set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+                       shift
+                       ;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+                       func_split_short_opt "$opt"
+                       set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+                       shift
+                       ;;
+
+      --)              break                                   ;;
+      -*)              func_fatal_help "unrecognized option \`$opt'" ;;
+      *)               set dummy "$opt" ${1+"$@"};     shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+       for lalib_p_l in 1 2 3 4
+       do
+           read lalib_p_line
+           case "$lalib_p_line" in
+               \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+           esac
+       done
+       exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)        . "$1" ;;
+    *)         . "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+       func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+       for z in $available_tags; do
+         if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+           # Evaluate the configuration.
+           eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+           CC_quoted=
+           for arg in $CC; do
+             # Double-quote args containing other shell metacharacters.
+             func_append_quoted CC_quoted "$arg"
+           done
+           CC_expanded=`func_echo_all $CC`
+           CC_quoted_expanded=`func_echo_all $CC_quoted`
+           case "$@ " in
+           " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+           " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+             # The compiler in the base compile command matches
+             # the one in the tagged configuration.
+             # Assume this is the tagged configuration we want.
+             tagname=$z
+             break
+             ;;
+           esac
+         fi
+       done
+       # If $tagname still isn't set, then no tagged configuration
+       # was found and let the user know that the "--tag" command
+       # line option must be used.
+       if test -z "$tagname"; then
+         func_echo "unable to infer tagged configuration"
+         func_fatal_error "specify a tag with \`--tag'"
+#      else
+#        func_verbose "using $tagname tagged configuration"
+       fi
+       ;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+       # do not "continue".  Instead, add this to base_compile
+       lastarg="$arg"
+       arg_mode=normal
+       ;;
+
+      target )
+       libobj="$arg"
+       arg_mode=normal
+       continue
+       ;;
+
+      normal )
+       # Accept any command-line options.
+       case $arg in
+       -o)
+         test -n "$libobj" && \
+           func_fatal_error "you cannot specify \`-o' more than once"
+         arg_mode=target
+         continue
+         ;;
+
+       -pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+         continue
+         ;;
+
+       -shared | -static | -prefer-pic | -prefer-non-pic)
+         func_append later " $arg"
+         continue
+         ;;
+
+       -no-suppress)
+         suppress_opt=no
+         continue
+         ;;
+
+       -Xcompiler)
+         arg_mode=arg  #  the next one goes into the "base_compile" arg list
+         continue      #  The current "srcfile" will either be retained or
+         ;;            #  replaced later.  I would guess that would be a bug.
+
+       -Wc,*)
+         func_stripname '-Wc,' '' "$arg"
+         args=$func_stripname_result
+         lastarg=
+         save_ifs="$IFS"; IFS=','
+         for arg in $args; do
+           IFS="$save_ifs"
+           func_append_quoted lastarg "$arg"
+         done
+         IFS="$save_ifs"
+         func_stripname ' ' '' "$lastarg"
+         lastarg=$func_stripname_result
+
+         # Add the arguments to base_compile.
+         func_append base_compile " $lastarg"
+         continue
+         ;;
+
+       *)
+         # Accept the current argument as the source file.
+         # The previous "srcfile" becomes the current argument.
+         #
+         lastarg="$srcfile"
+         srcfile="$arg"
+         ;;
+       esac  #  case $arg
+       ;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+       func_basename "$srcfile"
+       libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+       test "$build_libtool_libs" != yes && \
+         func_fatal_configuration "can not build a shared library"
+       build_old_libs=no
+       continue
+       ;;
+
+      -static)
+       build_libtool_libs=no
+       build_old_libs=yes
+       continue
+       ;;
+
+      -prefer-pic)
+       pic_mode=yes
+       continue
+       ;;
+
+      -prefer-non-pic)
+       pic_mode=no
+       continue
+       ;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'   &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+       func_echo "Waiting for $lockfile to be removed"
+       sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+       $ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $opt_dry_run || $RM $removelist
+       exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+       command="$base_compile $qsrcfile $pic_flag"
+      else
+       # Don't build PIC code
+       command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+       # Place PIC objects in $objdir
+       func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command" \
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+        test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+       $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $opt_dry_run || $RM $removelist
+       exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+       func_show_eval '$MV "$output_obj" "$lobj"' \
+         'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+       suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+       # Don't build PIC code
+       command="$base_compile $qsrcfile$pie_flag"
+      else
+       command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+       func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+        test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+       $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $opt_dry_run || $RM $removelist
+       exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+       func_show_eval '$MV "$output_obj" "$obj"' \
+         'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+       removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+       func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+       echo
+       func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+       H
+       d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+       || func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+       func_resolve_sysroot "$file"
+       file=$func_resolve_sysroot_result
+
+       # Check to see that this really is a libtool archive.
+       func_lalib_unsafe_p "$file" \
+         || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+       # Read the libtool library.
+       dlname=
+       library_names=
+       func_source "$file"
+
+       # Skip this library if it cannot be dlopened.
+       if test -z "$dlname"; then
+         # Warn if it was a shared library.
+         test -n "$library_names" && \
+           func_warning "\`$file' was not linked with \`-export-dynamic'"
+         continue
+       fi
+
+       func_dirname "$file" "" "."
+       dir="$func_dirname_result"
+
+       if test -f "$dir/$objdir/$dlname"; then
+         func_append dir "/$objdir"
+       else
+         if test ! -f "$dir/$dlname"; then
+           func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+         fi
+       fi
+       ;;
+
+      *.lo)
+       # Just add the directory containing the .lo file.
+       func_dirname "$file" "" "."
+       dir="$func_dirname_result"
+       ;;
+
+      *)
+       func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+       continue
+       ;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+       eval "$shlibpath_var=\"\$dir\""
+      else
+       eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+       # Do a test to see if this is really a libtool program.
+       if func_ltwrapper_script_p "$file"; then
+         func_source "$file"
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
+       elif func_ltwrapper_executable_p "$file"; then
+         func_ltwrapper_scriptname "$file"
+         func_source "$func_ltwrapper_scriptname_result"
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
+       fi
+       ;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+       # Export the shlibpath_var.
+       eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+       eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+             else
+               $lt_unset $lt_var
+             fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+       eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+       echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+       func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+       if func_lalib_unsafe_p "$opt"; then
+         func_append libs " $opt"
+       else
+         func_warning "\`$opt' is not a valid libtool archive"
+       fi
+
+      else
+       func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+         sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+           > $tmpdir/tmp-la
+         mv -f $tmpdir/tmp-la $lib
+       done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+       if test -n "$finish_cmds"; then
+         # Do each command in the finish commands.
+         func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+       fi
+       if test -n "$finish_eval"; then
+         # Do the single finish_eval.
+         eval cmds=\"$finish_eval\"
+         $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+       fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+       $ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+       echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+       echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+       echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+       echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+       libdir=LIBDIR
+       eval flag=\"$hardcode_libdir_flag_spec\"
+
+       $ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+       $ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+       echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+       solaris2.[6789]|solaris2.1[0-9])
+         echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+         echo "pages."
+         ;;
+       *)
+         echo "more information, such as the ld(1) and ld.so(8) manual pages."
+         ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+       func_append files " $dest"
+       dest=$arg
+       continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+       if $install_cp; then :; else
+         prev=$arg
+       fi
+       ;;
+      -g | -m | -o)
+       prev=$arg
+       ;;
+      -s)
+       stripme=" -s"
+       continue
+       ;;
+      -*)
+       ;;
+      *)
+       # If the previous option needed an argument, then skip it.
+       if test -n "$prev"; then
+         if test "x$prev" = x-m && test -n "$install_override_mode"; then
+           arg2=$install_override_mode
+           no_mode=false
+         fi
+         prev=
+       else
+         dest=$arg
+         continue
+       fi
+       ;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+       func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+       func_quote_for_eval "$install_override_mode"
+       func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+       func_fatal_help "no file or destination specified"
+      else
+       func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+       func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+       case $file in
+       *.lo) ;;
+       *)
+         func_fatal_help "\`$destdir' must be an absolute directory name"
+         ;;
+       esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+       # Do the static libraries later.
+       func_append staticlibs " $file"
+       ;;
+
+      *.la)
+       func_resolve_sysroot "$file"
+       file=$func_resolve_sysroot_result
+
+       # Check to see that this really is a libtool archive.
+       func_lalib_unsafe_p "$file" \
+         || func_fatal_help "\`$file' is not a valid libtool archive"
+
+       library_names=
+       old_library=
+       relink_command=
+       func_source "$file"
+
+       # Add the libdir to current_libdirs if it is the destination.
+       if test "X$destdir" = "X$libdir"; then
+         case "$current_libdirs " in
+         *" $libdir "*) ;;
+         *) func_append current_libdirs " $libdir" ;;
+         esac
+       else
+         # Note the libdir as a future libdir.
+         case "$future_libdirs " in
+         *" $libdir "*) ;;
+         *) func_append future_libdirs " $libdir" ;;
+         esac
+       fi
+
+       func_dirname "$file" "/" ""
+       dir="$func_dirname_result"
+       func_append dir "$objdir"
+
+       if test -n "$relink_command"; then
+         # Determine the prefix the user has applied to our future dir.
+         inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+         # Don't allow the user to place us outside of our expected
+         # location b/c this prevents finding dependent libraries that
+         # are installed to the same prefix.
+         # At present, this check doesn't affect windows .dll's that
+         # are installed into $libdir/../bin (currently, that works fine)
+         # but it's something to keep an eye on.
+         test "$inst_prefix_dir" = "$destdir" && \
+           func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+         if test -n "$inst_prefix_dir"; then
+           # Stick the inst_prefix_dir data into the link command.
+           relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+         else
+           relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+         fi
+
+         func_warning "relinking \`$file'"
+         func_show_eval "$relink_command" \
+           'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+       fi
+
+       # See the names of the shared library.
+       set dummy $library_names; shift
+       if test -n "$1"; then
+         realname="$1"
+         shift
+
+         srcname="$realname"
+         test -n "$relink_command" && srcname="$realname"T
+
+         # Install the shared library and build the symlinks.
+         func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+             'exit $?'
+         tstripme="$stripme"
+         case $host_os in
+         cygwin* | mingw* | pw32* | cegcc*)
+           case $realname in
+           *.dll.a)
+             tstripme=""
+             ;;
+           esac
+           ;;
+         esac
+         if test -n "$tstripme" && test -n "$striplib"; then
+           func_show_eval "$striplib $destdir/$realname" 'exit $?'
+         fi
+
+         if test "$#" -gt 0; then
+           # Delete the old symlinks, and create new ones.
+           # Try `ln -sf' first, because the `ln' binary might depend on
+           # the symlink we replace!  Solaris /bin/ln does not understand -f,
+           # so we also need to try rm && ln -s.
+           for linkname
+           do
+             test "$linkname" != "$realname" \
+               && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+           done
+         fi
+
+         # Do each command in the postinstall commands.
+         lib="$destdir/$realname"
+         func_execute_cmds "$postinstall_cmds" 'exit $?'
+       fi
+
+       # Install the pseudo-library for information purposes.
+       func_basename "$file"
+       name="$func_basename_result"
+       instname="$dir/$name"i
+       func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+       # Maybe install the static library, too.
+       test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+       ;;
+
+      *.lo)
+       # Install (i.e. copy) a libtool object.
+
+       # Figure out destination file name, if it wasn't already specified.
+       if test -n "$destname"; then
+         destfile="$destdir/$destname"
+       else
+         func_basename "$file"
+         destfile="$func_basename_result"
+         destfile="$destdir/$destfile"
+       fi
+
+       # Deduce the name of the destination old-style object file.
+       case $destfile in
+       *.lo)
+         func_lo2o "$destfile"
+         staticdest=$func_lo2o_result
+         ;;
+       *.$objext)
+         staticdest="$destfile"
+         destfile=
+         ;;
+       *)
+         func_fatal_help "cannot copy a libtool object to \`$destfile'"
+         ;;
+       esac
+
+       # Install the libtool object if requested.
+       test -n "$destfile" && \
+         func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+       # Install the old object if enabled.
+       if test "$build_old_libs" = yes; then
+         # Deduce the name of the old-style object file.
+         func_lo2o "$file"
+         staticobj=$func_lo2o_result
+         func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+       fi
+       exit $EXIT_SUCCESS
+       ;;
+
+      *)
+       # Figure out destination file name, if it wasn't already specified.
+       if test -n "$destname"; then
+         destfile="$destdir/$destname"
+       else
+         func_basename "$file"
+         destfile="$func_basename_result"
+         destfile="$destdir/$destfile"
+       fi
+
+       # If the file is missing, and there is a .exe on the end, strip it
+       # because it is most likely a libtool script we actually want to
+       # install
+       stripped_ext=""
+       case $file in
+         *.exe)
+           if test ! -f "$file"; then
+             func_stripname '' '.exe' "$file"
+             file=$func_stripname_result
+             stripped_ext=".exe"
+           fi
+           ;;
+       esac
+
+       # Do a test to see if this is really a libtool program.
+       case $host in
+       *cygwin* | *mingw*)
+           if func_ltwrapper_executable_p "$file"; then
+             func_ltwrapper_scriptname "$file"
+             wrapper=$func_ltwrapper_scriptname_result
+           else
+             func_stripname '' '.exe' "$file"
+             wrapper=$func_stripname_result
+           fi
+           ;;
+       *)
+           wrapper=$file
+           ;;
+       esac
+       if func_ltwrapper_script_p "$wrapper"; then
+         notinst_deplibs=
+         relink_command=
+
+         func_source "$wrapper"
+
+         # Check the variables that should have been set.
+         test -z "$generated_by_libtool_version" && \
+           func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+         finalize=yes
+         for lib in $notinst_deplibs; do
+           # Check to see that each library is installed.
+           libdir=
+           if test -f "$lib"; then
+             func_source "$lib"
+           fi
+           libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+           if test -n "$libdir" && test ! -f "$libfile"; then
+             func_warning "\`$lib' has not been installed in \`$libdir'"
+             finalize=no
+           fi
+         done
+
+         relink_command=
+         func_source "$wrapper"
+
+         outputname=
+         if test "$fast_install" = no && test -n "$relink_command"; then
+           $opt_dry_run || {
+             if test "$finalize" = yes; then
+               tmpdir=`func_mktempdir`
+               func_basename "$file$stripped_ext"
+               file="$func_basename_result"
+               outputname="$tmpdir/$file"
+               # Replace the output file specification.
+               relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+               $opt_silent || {
+                 func_quote_for_expand "$relink_command"
+                 eval "func_echo $func_quote_for_expand_result"
+               }
+               if eval "$relink_command"; then :
+                 else
+                 func_error "error: relink \`$file' with the above command before installing it"
+                 $opt_dry_run || ${RM}r "$tmpdir"
+                 continue
+               fi
+               file="$outputname"
+             else
+               func_warning "cannot relink \`$file'"
+             fi
+           }
+         else
+           # Install the binary that we compiled earlier.
+           file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+         fi
+       fi
+
+       # remove .exe since cygwin /usr/bin/install will append another
+       # one anyway
+       case $install_prog,$host in
+       */usr/bin/install*,*cygwin*)
+         case $file:$destfile in
+         *.exe:*.exe)
+           # this is ok
+           ;;
+         *.exe:*)
+           destfile=$destfile.exe
+           ;;
+         *:*.exe)
+           func_stripname '' '.exe' "$destfile"
+           destfile=$func_stripname_result
+           ;;
+         esac
+         ;;
+       esac
+       func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+       $opt_dry_run || if test -n "$outputname"; then
+         ${RM}r "$tmpdir"
+       fi
+       ;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+       func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+       my_dlsyms="${my_outputname}S.c"
+      else
+       func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+       # Discover the nlist of each of the dlfiles.
+       nlist="$output_objdir/${my_outputname}.nm"
+
+       func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+       # Parse the name list into a source file.
+       func_verbose "creating $output_objdir/$my_dlsyms"
+
+       $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+       if test "$dlself" = yes; then
+         func_verbose "generating symbol list for \`$output'"
+
+         $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+         # Add our own program objects to the symbol list.
+         progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+         for progfile in $progfiles; do
+           func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+           func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+           $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+         done
+
+         if test -n "$exclude_expsyms"; then
+           $opt_dry_run || {
+             eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+             eval '$MV "$nlist"T "$nlist"'
+           }
+         fi
+
+         if test -n "$export_symbols_regex"; then
+           $opt_dry_run || {
+             eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+             eval '$MV "$nlist"T "$nlist"'
+           }
+         fi
+
+         # Prepare the list of exported symbols
+         if test -z "$export_symbols"; then
+           export_symbols="$output_objdir/$outputname.exp"
+           $opt_dry_run || {
+             $RM $export_symbols
+             eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+             case $host in
+             *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+               ;;
+             esac
+           }
+         else
+           $opt_dry_run || {
+             eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+             eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+             eval '$MV "$nlist"T "$nlist"'
+             case $host in
+               *cygwin* | *mingw* | *cegcc* )
+                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                 eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+                 ;;
+             esac
+           }
+         fi
+       fi
+
+       for dlprefile in $dlprefiles; do
+         func_verbose "extracting global C symbols from \`$dlprefile'"
+         func_basename "$dlprefile"
+         name="$func_basename_result"
+          case $host in
+           *cygwin* | *mingw* | *cegcc* )
+             # if an import library, we need to obtain dlname
+             if func_win32_import_lib_p "$dlprefile"; then
+               func_tr_sh "$dlprefile"
+               eval "curr_lafile=\$libfile_$func_tr_sh_result"
+               dlprefile_dlbasename=""
+               if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+                 # Use subshell, to avoid clobbering current variable values
+                 dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+                 if test -n "$dlprefile_dlname" ; then
+                   func_basename "$dlprefile_dlname"
+                   dlprefile_dlbasename="$func_basename_result"
+                 else
+                   # no lafile. user explicitly requested -dlpreopen <import library>.
+                   $sharedlib_from_linklib_cmd "$dlprefile"
+                   dlprefile_dlbasename=$sharedlib_from_linklib_result
+                 fi
+               fi
+               $opt_dry_run || {
+                 if test -n "$dlprefile_dlbasename" ; then
+                   eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+                 else
+                   func_warning "Could not compute DLL name from $name"
+                   eval '$ECHO ": $name " >> "$nlist"'
+                 fi
+                 func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+                 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+                   $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+               }
+             else # not an import lib
+               $opt_dry_run || {
+                 eval '$ECHO ": $name " >> "$nlist"'
+                 func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+                 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+               }
+             fi
+           ;;
+           *)
+             $opt_dry_run || {
+               eval '$ECHO ": $name " >> "$nlist"'
+               func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+               eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+             }
+           ;;
+          esac
+       done
+
+       $opt_dry_run || {
+         # Make sure we have at least an empty file.
+         test -f "$nlist" || : > "$nlist"
+
+         if test -n "$exclude_expsyms"; then
+           $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+           $MV "$nlist"T "$nlist"
+         fi
+
+         # Try sorting and uniquifying the output.
+         if $GREP -v "^: " < "$nlist" |
+             if sort -k 3 </dev/null >/dev/null 2>&1; then
+               sort -k 3
+             else
+               sort +2
+             fi |
+             uniq > "$nlist"S; then
+           :
+         else
+           $GREP -v "^: " < "$nlist" > "$nlist"S
+         fi
+
+         if test -f "$nlist"S; then
+           eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+         else
+           echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+         fi
+
+         echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+         case $need_lib_prefix in
+         no)
+           eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+           ;;
+         *)
+           eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+           ;;
+         esac
+         echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+       } # !$opt_dry_run
+
+       pic_flag_for_symtable=
+       case "$compile_command " in
+       *" -static "*) ;;
+       *)
+         case $host in
+         # compiling the symbol table file with pic_flag works around
+         # a FreeBSD bug that causes programs to crash when -lm is
+         # linked before any other PIC object.  But we must not use
+         # pic_flag when linking with -static.  The problem exists in
+         # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+         *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+           pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+         *-*-hpux*)
+           pic_flag_for_symtable=" $pic_flag"  ;;
+         *)
+           if test "X$my_pic_p" != Xno; then
+             pic_flag_for_symtable=" $pic_flag"
+           fi
+           ;;
+         esac
+         ;;
+       esac
+       symtab_cflags=
+       for arg in $LTCFLAGS; do
+         case $arg in
+         -pie | -fpie | -fPIE) ;;
+         *) func_append symtab_cflags " $arg" ;;
+         esac
+       done
+
+       # Now compile the dynamic symbol file.
+       func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+       # Clean up the generated files.
+       func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+       # Transform the symbol file into the correct name.
+       symfileobj="$output_objdir/${my_outputname}S.$objext"
+       case $host in
+       *cygwin* | *mingw* | *cegcc* )
+         if test -f "$output_objdir/$my_outputname.def"; then
+           compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+           finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+         else
+           compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+           finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         fi
+         ;;
+       *)
+         compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         ;;
+       esac
+       ;;
+      *)
+       func_fatal_error "unknown suffix for \`$my_dlsyms'"
+       ;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+       $SED -n -e '
+           1,100{
+               / I /{
+                   s,.*,import,
+                   p
+                   q
+               }
+           }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[         ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+       func_echo "Waiting for $lockfile to be removed"
+       sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+                  'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+       [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+       *) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+       *" $my_xlib_u "*)
+         func_arith $extracted_serial + 1
+         extracted_serial=$func_arith_result
+         my_xlib_u=lt$extracted_serial-$my_xlib ;;
+       *) break ;;
+       esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+       func_verbose "Extracting $my_xabs"
+       # Do not bother doing anything if just a dry run
+       $opt_dry_run || {
+         darwin_orig_dir=`pwd`
+         cd $my_xdir || exit $?
+         darwin_archive=$my_xabs
+         darwin_curdir=`pwd`
+         darwin_base_archive=`basename "$darwin_archive"`
+         darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+         if test -n "$darwin_arches"; then
+           darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+           darwin_arch=
+           func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+           for darwin_arch in  $darwin_arches ; do
+             func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+             $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+             cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+             func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+             cd "$darwin_curdir"
+             $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+           done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+           darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+           darwin_file=
+           darwin_files=
+           for darwin_file in $darwin_filelist; do
+             darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+             $LIPO -create -output "$darwin_file" $darwin_files
+           done # $darwin_filelist
+           $RM -rf unfat-$$
+           cd "$darwin_orig_dir"
+         else
+           cd $darwin_orig_dir
+           func_extract_an_archive "$my_xdir" "$my_xabs"
+         fi # $darwin_arches
+       } # !$opt_dry_run
+       ;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+       ;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+       func_emit_wrapper_arg1=${1-no}
+
+       $ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+       if test "$fast_install" = yes; then
+         $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+         $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+       $ECHO \"\$relink_command_output\" >&2
+       $RM \"\$progdir/\$file\"
+       exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+       else
+         $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+       fi
+
+       $ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+       # fixup the dll searchpath if we need to.
+       #
+       # Fix the DLL searchpath if we need to.  Do this before prepending
+       # to shlibpath, because on Windows, both are PATH and uninstalled
+       # libraries must come first.
+       if test -n "$dllsearchpath"; then
+         $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+       fi
+
+       # Export our shlibpath_var if we have one.
+       if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+         $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+       fi
+
+       $ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+       cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+           cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+       (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+           cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+           if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+             cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+           else
+             cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+           fi
+
+           if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+             cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+           else
+             cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+           fi
+
+           if test "$fast_install" = yes; then
+             cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+           else
+             cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+           fi
+
+
+           cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+       {
+EOF
+           case "$host" in
+             *mingw* | *cygwin* )
+               # make stdout use "unix" line endings
+               echo "          setmode(1,_O_BINARY);"
+               ;;
+             esac
+
+           cat <<"EOF"
+         lt_dump_script (stdout);
+         return 0;
+       }
+      if (strcmp (argv[i], debug_opt) == 0)
+       {
+          lt_debug = 1;
+          continue;
+       }
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+                   "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+           cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+           cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+                 tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+                 actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(main) libtool target name: %s\n",
+                 target_name);
+EOF
+
+           cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+                   strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+           cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+           case $host_os in
+             mingw*)
+           cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+       *p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+       *p = '/';
+      }
+  }
+EOF
+           ;;
+           esac
+
+           cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+                 nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+                     i, nonnull (newargz[i]));
+    }
+
+EOF
+
+           case $host_os in
+             mingw*)
+               cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+                     "(main) failed to launch target \"%s\": %s\n",
+                     lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+               ;;
+             *)
+               cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+               ;;
+           esac
+
+           cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+                         string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+       return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+       {
+         concat_name = xstrdup (wrapper);
+         if (check_executable (concat_name))
+           return concat_name;
+         XFREE (concat_name);
+       }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+       has_slash = 1;
+       break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+       {
+         for (p = path; *p; p = p_next)
+           {
+             const char *q;
+             size_t p_len;
+             for (q = p; *q; q++)
+               if (IS_PATH_SEPARATOR (*q))
+                 break;
+             p_len = q - p;
+             p_next = (*q == '\0' ? q : q + 1);
+             if (p_len == 0)
+               {
+                 /* empty path: current directory */
+                 if (getcwd (tmp, LT_PATHMAX) == NULL)
+                   lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+                 tmp_len = strlen (tmp);
+                 concat_name =
+                   XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+                 memcpy (concat_name, tmp, tmp_len);
+                 concat_name[tmp_len] = '/';
+                 strcpy (concat_name + tmp_len + 1, wrapper);
+               }
+             else
+               {
+                 concat_name =
+                   XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+                 memcpy (concat_name, p, p_len);
+                 concat_name[p_len] = '/';
+                 strcpy (concat_name + p_len + 1, wrapper);
+               }
+             if (check_executable (concat_name))
+               return concat_name;
+             XFREE (concat_name);
+           }
+       }
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+                     "checking path component for symlinks: %s\n",
+                     tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+       {
+         if (S_ISLNK (s.st_mode) != 0)
+           {
+             has_symlinks = 1;
+             break;
+           }
+
+         /* search backwards for last DIR_SEPARATOR */
+         p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+         while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+           p--;
+         if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+           {
+             /* no more DIR_SEPARATORS left */
+             break;
+           }
+         *p = '\0';
+       }
+      else
+       {
+         lt_fatal (__FILE__, __LINE__,
+                   "error accessing file \"%s\": %s",
+                   tmp_pathspec, nonnull (strerror (errno)));
+       }
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+               "could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+       *str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+              int line, const char *mode,
+              const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+           case $host_os in
+             mingw*)
+               cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+       new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+       {
+         int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+         size_t length;
+         unsigned int backslashes;
+         const char *s;
+         char *quoted_string;
+         char *p;
+
+         length = 0;
+         backslashes = 0;
+         if (quote_around)
+           length++;
+         for (s = string; *s != '\0'; s++)
+           {
+             char c = *s;
+             if (c == '"')
+               length += backslashes + 1;
+             length++;
+             if (c == '\\')
+               backslashes++;
+             else
+               backslashes = 0;
+           }
+         if (quote_around)
+           length += backslashes + 1;
+
+         quoted_string = XMALLOC (char, length + 1);
+
+         p = quoted_string;
+         backslashes = 0;
+         if (quote_around)
+           *p++ = '"';
+         for (s = string; *s != '\0'; s++)
+           {
+             char c = *s;
+             if (c == '"')
+               {
+                 unsigned int j;
+                 for (j = backslashes + 1; j > 0; j--)
+                   *p++ = '\\';
+               }
+             *p++ = c;
+             if (c == '\\')
+               backslashes++;
+             else
+               backslashes = 0;
+           }
+         if (quote_around)
+           {
+             unsigned int j;
+             for (j = backslashes; j > 0; j--)
+               *p++ = '\\';
+             *p++ = '"';
+           }
+         *p = '\0';
+
+         new_argv[i] = quoted_string;
+       }
+      else
+       new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+               ;;
+           esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+           func_emit_wrapper yes |
+             $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+       test "$build_libtool_libs" != yes && \
+         func_fatal_configuration "can not build a shared library"
+       build_old_libs=no
+       break
+       ;;
+      -all-static | -static | -static-libtool-libs)
+       case $arg in
+       -all-static)
+         if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+           func_warning "complete static linking is impossible in this configuration"
+         fi
+         if test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+         prefer_static_libs=yes
+         ;;
+       -static)
+         if test -z "$pic_flag" && test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+         prefer_static_libs=built
+         ;;
+       -static-libtool-libs)
+         if test -z "$pic_flag" && test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+         prefer_static_libs=yes
+         ;;
+       esac
+       build_libtool_libs=no
+       build_old_libs=yes
+       break
+       ;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+       case $prev in
+       output)
+         func_append compile_command " @OUTPUT@"
+         func_append finalize_command " @OUTPUT@"
+         ;;
+       esac
+
+       case $prev in
+       bindir)
+         bindir="$arg"
+         prev=
+         continue
+         ;;
+       dlfiles|dlprefiles)
+         if test "$preload" = no; then
+           # Add the symbol object into the linking commands.
+           func_append compile_command " @SYMFILE@"
+           func_append finalize_command " @SYMFILE@"
+           preload=yes
+         fi
+         case $arg in
+         *.la | *.lo) ;;  # We handle these cases below.
+         force)
+           if test "$dlself" = no; then
+             dlself=needless
+             export_dynamic=yes
+           fi
+           prev=
+           continue
+           ;;
+         self)
+           if test "$prev" = dlprefiles; then
+             dlself=yes
+           elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+             dlself=yes
+           else
+             dlself=needless
+             export_dynamic=yes
+           fi
+           prev=
+           continue
+           ;;
+         *)
+           if test "$prev" = dlfiles; then
+             func_append dlfiles " $arg"
+           else
+             func_append dlprefiles " $arg"
+           fi
+           prev=
+           continue
+           ;;
+         esac
+         ;;
+       expsyms)
+         export_symbols="$arg"
+         test -f "$arg" \
+           || func_fatal_error "symbol file \`$arg' does not exist"
+         prev=
+         continue
+         ;;
+       expsyms_regex)
+         export_symbols_regex="$arg"
+         prev=
+         continue
+         ;;
+       framework)
+         case $host in
+           *-*-darwin*)
+             case "$deplibs " in
+               *" $qarg.ltframework "*) ;;
+               *) func_append deplibs " $qarg.ltframework" # this is fixed later
+                  ;;
+             esac
+             ;;
+         esac
+         prev=
+         continue
+         ;;
+       inst_prefix)
+         inst_prefix_dir="$arg"
+         prev=
+         continue
+         ;;
+       objectlist)
+         if test -f "$arg"; then
+           save_arg=$arg
+           moreargs=
+           for fil in `cat "$save_arg"`
+           do
+#            func_append moreargs " $fil"
+             arg=$fil
+             # A libtool-controlled object.
+
+             # Check to see that this really is a libtool object.
+             if func_lalib_unsafe_p "$arg"; then
+               pic_object=
+               non_pic_object=
+
+               # Read the .lo file
+               func_source "$arg"
+
+               if test -z "$pic_object" ||
+                  test -z "$non_pic_object" ||
+                  test "$pic_object" = none &&
+                  test "$non_pic_object" = none; then
+                 func_fatal_error "cannot find name of object for \`$arg'"
+               fi
+
+               # Extract subdirectory from the argument.
+               func_dirname "$arg" "/" ""
+               xdir="$func_dirname_result"
+
+               if test "$pic_object" != none; then
+                 # Prepend the subdirectory the object is found in.
+                 pic_object="$xdir$pic_object"
+
+                 if test "$prev" = dlfiles; then
+                   if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+                     func_append dlfiles " $pic_object"
+                     prev=
+                     continue
+                   else
+                     # If libtool objects are unsupported, then we need to preload.
+                     prev=dlprefiles
+                   fi
+                 fi
+
+                 # CHECK ME:  I think I busted this.  -Ossama
+                 if test "$prev" = dlprefiles; then
+                   # Preload the old-style object.
+                   func_append dlprefiles " $pic_object"
+                   prev=
+                 fi
+
+                 # A PIC object.
+                 func_append libobjs " $pic_object"
+                 arg="$pic_object"
+               fi
+
+               # Non-PIC object.
+               if test "$non_pic_object" != none; then
+                 # Prepend the subdirectory the object is found in.
+                 non_pic_object="$xdir$non_pic_object"
+
+                 # A standard non-PIC object
+                 func_append non_pic_objects " $non_pic_object"
+                 if test -z "$pic_object" || test "$pic_object" = none ; then
+                   arg="$non_pic_object"
+                 fi
+               else
+                 # If the PIC object exists, use it instead.
+                 # $xdir was prepended to $pic_object above.
+                 non_pic_object="$pic_object"
+                 func_append non_pic_objects " $non_pic_object"
+               fi
+             else
+               # Only an error if not doing a dry-run.
+               if $opt_dry_run; then
+                 # Extract subdirectory from the argument.
+                 func_dirname "$arg" "/" ""
+                 xdir="$func_dirname_result"
+
+                 func_lo2o "$arg"
+                 pic_object=$xdir$objdir/$func_lo2o_result
+                 non_pic_object=$xdir$func_lo2o_result
+                 func_append libobjs " $pic_object"
+                 func_append non_pic_objects " $non_pic_object"
+               else
+                 func_fatal_error "\`$arg' is not a valid libtool object"
+               fi
+             fi
+           done
+         else
+           func_fatal_error "link input file \`$arg' does not exist"
+         fi
+         arg=$save_arg
+         prev=
+         continue
+         ;;
+       precious_regex)
+         precious_files_regex="$arg"
+         prev=
+         continue
+         ;;
+       release)
+         release="-$arg"
+         prev=
+         continue
+         ;;
+       rpath | xrpath)
+         # We need an absolute path.
+         case $arg in
+         [\\/]* | [A-Za-z]:[\\/]*) ;;
+         *)
+           func_fatal_error "only absolute run-paths are allowed"
+           ;;
+         esac
+         if test "$prev" = rpath; then
+           case "$rpath " in
+           *" $arg "*) ;;
+           *) func_append rpath " $arg" ;;
+           esac
+         else
+           case "$xrpath " in
+           *" $arg "*) ;;
+           *) func_append xrpath " $arg" ;;
+           esac
+         fi
+         prev=
+         continue
+         ;;
+       shrext)
+         shrext_cmds="$arg"
+         prev=
+         continue
+         ;;
+       weak)
+         func_append weak_libs " $arg"
+         prev=
+         continue
+         ;;
+       xcclinker)
+         func_append linker_flags " $qarg"
+         func_append compiler_flags " $qarg"
+         prev=
+         func_append compile_command " $qarg"
+         func_append finalize_command " $qarg"
+         continue
+         ;;
+       xcompiler)
+         func_append compiler_flags " $qarg"
+         prev=
+         func_append compile_command " $qarg"
+         func_append finalize_command " $qarg"
+         continue
+         ;;
+       xlinker)
+         func_append linker_flags " $qarg"
+         func_append compiler_flags " $wl$qarg"
+         prev=
+         func_append compile_command " $wl$qarg"
+         func_append finalize_command " $wl$qarg"
+         continue
+         ;;
+       *)
+         eval "$prev=\"\$arg\""
+         prev=
+         continue
+         ;;
+       esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+       if test -n "$link_static_flag"; then
+         # See comment for -static flag below, for more details.
+         func_append compile_command " $link_static_flag"
+         func_append finalize_command " $link_static_flag"
+       fi
+       continue
+       ;;
+
+      -allow-undefined)
+       # FIXME: remove this flag sometime in the future.
+       func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+       ;;
+
+      -avoid-version)
+       avoid_version=yes
+       continue
+       ;;
+
+      -bindir)
+       prev=bindir
+       continue
+       ;;
+
+      -dlopen)
+       prev=dlfiles
+       continue
+       ;;
+
+      -dlpreopen)
+       prev=dlprefiles
+       continue
+       ;;
+
+      -export-dynamic)
+       export_dynamic=yes
+       continue
+       ;;
+
+      -export-symbols | -export-symbols-regex)
+       if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+         func_fatal_error "more than one -exported-symbols argument is not allowed"
+       fi
+       if test "X$arg" = "X-export-symbols"; then
+         prev=expsyms
+       else
+         prev=expsyms_regex
+       fi
+       continue
+       ;;
+
+      -framework)
+       prev=framework
+       continue
+       ;;
+
+      -inst-prefix-dir)
+       prev=inst_prefix
+       continue
+       ;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+       case $with_gcc/$host in
+       no/*-*-irix* | /*-*-irix*)
+         func_append compile_command " $arg"
+         func_append finalize_command " $arg"
+         ;;
+       esac
+       continue
+       ;;
+
+      -L*)
+       func_stripname "-L" '' "$arg"
+       if test -z "$func_stripname_result"; then
+         if test "$#" -gt 0; then
+           func_fatal_error "require no space between \`-L' and \`$1'"
+         else
+           func_fatal_error "need path for \`-L' option"
+         fi
+       fi
+       func_resolve_sysroot "$func_stripname_result"
+       dir=$func_resolve_sysroot_result
+       # We need an absolute path.
+       case $dir in
+       [\\/]* | [A-Za-z]:[\\/]*) ;;
+       *)
+         absdir=`cd "$dir" && pwd`
+         test -z "$absdir" && \
+           func_fatal_error "cannot determine absolute directory name of \`$dir'"
+         dir="$absdir"
+         ;;
+       esac
+       case "$deplibs " in
+       *" -L$dir "* | *" $arg "*)
+         # Will only happen for absolute or sysroot arguments
+         ;;
+       *)
+         # Preserve sysroot, but never include relative directories
+         case $dir in
+           [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+           *) func_append deplibs " -L$dir" ;;
+         esac
+         func_append lib_search_path " $dir"
+         ;;
+       esac
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+         testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+         case :$dllsearchpath: in
+         *":$dir:"*) ;;
+         ::) dllsearchpath=$dir;;
+         *) func_append dllsearchpath ":$dir";;
+         esac
+         case :$dllsearchpath: in
+         *":$testbindir:"*) ;;
+         ::) dllsearchpath=$testbindir;;
+         *) func_append dllsearchpath ":$testbindir";;
+         esac
+         ;;
+       esac
+       continue
+       ;;
+
+      -l*)
+       if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+         case $host in
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+           # These systems don't actually have a C or math library (as such)
+           continue
+           ;;
+         *-*-os2*)
+           # These systems don't actually have a C library (as such)
+           test "X$arg" = "X-lc" && continue
+           ;;
+         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+           # Do not include libc due to us having libc/libc_r.
+           test "X$arg" = "X-lc" && continue
+           ;;
+         *-*-rhapsody* | *-*-darwin1.[012])
+           # Rhapsody C and math libraries are in the System framework
+           func_append deplibs " System.ltframework"
+           continue
+           ;;
+         *-*-sco3.2v5* | *-*-sco5v6*)
+           # Causes problems with __ctype
+           test "X$arg" = "X-lc" && continue
+           ;;
+         *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+           # Compiler inserts libc in the correct place for threads to work
+           test "X$arg" = "X-lc" && continue
+           ;;
+         esac
+       elif test "X$arg" = "X-lc_r"; then
+        case $host in
+        *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+          # Do not include libc_r directly, use -pthread flag.
+          continue
+          ;;
+        esac
+       fi
+       func_append deplibs " $arg"
+       continue
+       ;;
+
+      -module)
+       module=yes
+       continue
+       ;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+       func_append compiler_flags " $arg"
+       func_append compile_command " $arg"
+       func_append finalize_command " $arg"
+       prev=xcompiler
+       continue
+       ;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+       func_append compiler_flags " $arg"
+       func_append compile_command " $arg"
+       func_append finalize_command " $arg"
+       case "$new_inherited_linker_flags " in
+           *" $arg "*) ;;
+           * ) func_append new_inherited_linker_flags " $arg" ;;
+       esac
+       continue
+       ;;
+
+      -multi_module)
+       single_module="${wl}-multi_module"
+       continue
+       ;;
+
+      -no-fast-install)
+       fast_install=no
+       continue
+       ;;
+
+      -no-install)
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+         # The PATH hackery in wrapper scripts is required on Windows
+         # and Darwin in order for the loader to find any dlls it needs.
+         func_warning "\`-no-install' is ignored for $host"
+         func_warning "assuming \`-no-fast-install' instead"
+         fast_install=no
+         ;;
+       *) no_install=yes ;;
+       esac
+       continue
+       ;;
+
+      -no-undefined)
+       allow_undefined=no
+       continue
+       ;;
+
+      -objectlist)
+       prev=objectlist
+       continue
+       ;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+       prev=precious_regex
+       continue
+       ;;
+
+      -release)
+       prev=release
+       continue
+       ;;
+
+      -rpath)
+       prev=rpath
+       continue
+       ;;
+
+      -R)
+       prev=xrpath
+       continue
+       ;;
+
+      -R*)
+       func_stripname '-R' '' "$arg"
+       dir=$func_stripname_result
+       # We need an absolute path.
+       case $dir in
+       [\\/]* | [A-Za-z]:[\\/]*) ;;
+       =*)
+         func_stripname '=' '' "$dir"
+         dir=$lt_sysroot$func_stripname_result
+         ;;
+       *)
+         func_fatal_error "only absolute run-paths are allowed"
+         ;;
+       esac
+       case "$xrpath " in
+       *" $dir "*) ;;
+       *) func_append xrpath " $dir" ;;
+       esac
+       continue
+       ;;
+
+      -shared)
+       # The effects of -shared are defined in a previous loop.
+       continue
+       ;;
+
+      -shrext)
+       prev=shrext
+       continue
+       ;;
+
+      -static | -static-libtool-libs)
+       # The effects of -static are defined in a previous loop.
+       # We used to do the same as -all-static on platforms that
+       # didn't have a PIC flag, but the assumption that the effects
+       # would be equivalent was wrong.  It would break on at least
+       # Digital Unix and AIX.
+       continue
+       ;;
+
+      -thread-safe)
+       thread_safe=yes
+       continue
+       ;;
+
+      -version-info)
+       prev=vinfo
+       continue
+       ;;
+
+      -version-number)
+       prev=vinfo
+       vinfo_number=yes
+       continue
+       ;;
+
+      -weak)
+        prev=weak
+       continue
+       ;;
+
+      -Wc,*)
+       func_stripname '-Wc,' '' "$arg"
+       args=$func_stripname_result
+       arg=
+       save_ifs="$IFS"; IFS=','
+       for flag in $args; do
+         IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+         func_append arg " $func_quote_for_eval_result"
+         func_append compiler_flags " $func_quote_for_eval_result"
+       done
+       IFS="$save_ifs"
+       func_stripname ' ' '' "$arg"
+       arg=$func_stripname_result
+       ;;
+
+      -Wl,*)
+       func_stripname '-Wl,' '' "$arg"
+       args=$func_stripname_result
+       arg=
+       save_ifs="$IFS"; IFS=','
+       for flag in $args; do
+         IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+         func_append arg " $wl$func_quote_for_eval_result"
+         func_append compiler_flags " $wl$func_quote_for_eval_result"
+         func_append linker_flags " $func_quote_for_eval_result"
+       done
+       IFS="$save_ifs"
+       func_stripname ' ' '' "$arg"
+       arg=$func_stripname_result
+       ;;
+
+      -Xcompiler)
+       prev=xcompiler
+       continue
+       ;;
+
+      -Xlinker)
+       prev=xlinker
+       continue
+       ;;
+
+      -XCClinker)
+       prev=xcclinker
+       continue
+       ;;
+
+      # -msg_* for osf cc
+      -msg_*)
+       func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+       ;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+       ;;
+
+      *.$objext)
+       # A standard object.
+       func_append objs " $arg"
+       ;;
+
+      *.lo)
+       # A libtool-controlled object.
+
+       # Check to see that this really is a libtool object.
+       if func_lalib_unsafe_p "$arg"; then
+         pic_object=
+         non_pic_object=
+
+         # Read the .lo file
+         func_source "$arg"
+
+         if test -z "$pic_object" ||
+            test -z "$non_pic_object" ||
+            test "$pic_object" = none &&
+            test "$non_pic_object" = none; then
+           func_fatal_error "cannot find name of object for \`$arg'"
+         fi
+
+         # Extract subdirectory from the argument.
+         func_dirname "$arg" "/" ""
+         xdir="$func_dirname_result"
+
+         if test "$pic_object" != none; then
+           # Prepend the subdirectory the object is found in.
+           pic_object="$xdir$pic_object"
+
+           if test "$prev" = dlfiles; then
+             if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+               func_append dlfiles " $pic_object"
+               prev=
+               continue
+             else
+               # If libtool objects are unsupported, then we need to preload.
+               prev=dlprefiles
+             fi
+           fi
+
+           # CHECK ME:  I think I busted this.  -Ossama
+           if test "$prev" = dlprefiles; then
+             # Preload the old-style object.
+             func_append dlprefiles " $pic_object"
+             prev=
+           fi
+
+           # A PIC object.
+           func_append libobjs " $pic_object"
+           arg="$pic_object"
+         fi
+
+         # Non-PIC object.
+         if test "$non_pic_object" != none; then
+           # Prepend the subdirectory the object is found in.
+           non_pic_object="$xdir$non_pic_object"
+
+           # A standard non-PIC object
+           func_append non_pic_objects " $non_pic_object"
+           if test -z "$pic_object" || test "$pic_object" = none ; then
+             arg="$non_pic_object"
+           fi
+         else
+           # If the PIC object exists, use it instead.
+           # $xdir was prepended to $pic_object above.
+           non_pic_object="$pic_object"
+           func_append non_pic_objects " $non_pic_object"
+         fi
+       else
+         # Only an error if not doing a dry-run.
+         if $opt_dry_run; then
+           # Extract subdirectory from the argument.
+           func_dirname "$arg" "/" ""
+           xdir="$func_dirname_result"
+
+           func_lo2o "$arg"
+           pic_object=$xdir$objdir/$func_lo2o_result
+           non_pic_object=$xdir$func_lo2o_result
+           func_append libobjs " $pic_object"
+           func_append non_pic_objects " $non_pic_object"
+         else
+           func_fatal_error "\`$arg' is not a valid libtool object"
+         fi
+       fi
+       ;;
+
+      *.$libext)
+       # An archive.
+       func_append deplibs " $arg"
+       func_append old_deplibs " $arg"
+       continue
+       ;;
+
+      *.la)
+       # A libtool-controlled library.
+
+       func_resolve_sysroot "$arg"
+       if test "$prev" = dlfiles; then
+         # This library was specified with -dlopen.
+         func_append dlfiles " $func_resolve_sysroot_result"
+         prev=
+       elif test "$prev" = dlprefiles; then
+         # The library was specified with -dlpreopen.
+         func_append dlprefiles " $func_resolve_sysroot_result"
+         prev=
+       else
+         func_append deplibs " $func_resolve_sysroot_result"
+       fi
+       continue
+       ;;
+
+      # Some other compiler argument.
+      *)
+       # Unknown arguments in both finalize_command and compile_command need
+       # to be aesthetically quoted because they are evaled later.
+       func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+       ;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+       func_append compile_command " $arg"
+       func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+       case "$libs " in
+       *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+       esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+       for pre_post_dep in $predeps $postdeps; do
+         case "$pre_post_deps " in
+         *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+         esac
+         func_append pre_post_deps " $pre_post_dep"
+       done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+       passes="conv dlpreopen link"
+       for file in $dlfiles $dlprefiles; do
+         case $file in
+         *.la) ;;
+         *)
+           func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+           ;;
+         esac
+       done
+       ;;
+    prog)
+       compile_deplibs=
+       finalize_deplibs=
+       alldeplibs=no
+       newdlfiles=
+       newdlprefiles=
+       passes="conv scan dlopen dlpreopen link"
+       ;;
+    *)  passes="conv"
+       ;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+       ## FIXME: Find the place where the list is rebuilt in the wrong
+       ##        order, and fix it there properly
+        tmp_deplibs=
+       for deplib in $deplibs; do
+         tmp_deplibs="$deplib $tmp_deplibs"
+       done
+       deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+        test "$linkmode,$pass" = "prog,scan"; then
+       libs="$deplibs"
+       deplibs=
+      fi
+      if test "$linkmode" = prog; then
+       case $pass in
+       dlopen) libs="$dlfiles" ;;
+       dlpreopen) libs="$dlprefiles" ;;
+       link)
+         libs="$deplibs %DEPLIBS%"
+         test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+         ;;
+       esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+       # Collect and forward deplibs of preopened libtool libs
+       for lib in $dlprefiles; do
+         # Ignore non-libtool-libs
+         dependency_libs=
+         func_resolve_sysroot "$lib"
+         case $lib in
+         *.la) func_source "$func_resolve_sysroot_result" ;;
+         esac
+
+         # Collect preopened libtool deplibs, except any this library
+         # has declared as weak libs
+         for deplib in $dependency_libs; do
+           func_basename "$deplib"
+            deplib_base=$func_basename_result
+           case " $weak_libs " in
+           *" $deplib_base "*) ;;
+           *) func_append deplibs " $deplib" ;;
+           esac
+         done
+       done
+       libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+       # Collect dlpreopened libraries
+       save_deplibs="$deplibs"
+       deplibs=
+      fi
+
+      for deplib in $libs; do
+       lib=
+       found=no
+       case $deplib in
+       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+         if test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$deplib $compile_deplibs"
+           finalize_deplibs="$deplib $finalize_deplibs"
+         else
+           func_append compiler_flags " $deplib"
+           if test "$linkmode" = lib ; then
+               case "$new_inherited_linker_flags " in
+                   *" $deplib "*) ;;
+                   * ) func_append new_inherited_linker_flags " $deplib" ;;
+               esac
+           fi
+         fi
+         continue
+         ;;
+       -l*)
+         if test "$linkmode" != lib && test "$linkmode" != prog; then
+           func_warning "\`-l' is ignored for archives/objects"
+           continue
+         fi
+         func_stripname '-l' '' "$deplib"
+         name=$func_stripname_result
+         if test "$linkmode" = lib; then
+           searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+         else
+           searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+         fi
+         for searchdir in $searchdirs; do
+           for search_ext in .la $std_shrext .so .a; do
+             # Search the libtool library
+             lib="$searchdir/lib${name}${search_ext}"
+             if test -f "$lib"; then
+               if test "$search_ext" = ".la"; then
+                 found=yes
+               else
+                 found=no
+               fi
+               break 2
+             fi
+           done
+         done
+         if test "$found" != yes; then
+           # deplib doesn't seem to be a libtool library
+           if test "$linkmode,$pass" = "prog,link"; then
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           else
+             deplibs="$deplib $deplibs"
+             test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+           fi
+           continue
+         else # deplib is a libtool library
+           # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+           # We need to do some special things here, and not later.
+           if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+             case " $predeps $postdeps " in
+             *" $deplib "*)
+               if func_lalib_p "$lib"; then
+                 library_names=
+                 old_library=
+                 func_source "$lib"
+                 for l in $old_library $library_names; do
+                   ll="$l"
+                 done
+                 if test "X$ll" = "X$old_library" ; then # only static version available
+                   found=no
+                   func_dirname "$lib" "" "."
+                   ladir="$func_dirname_result"
+                   lib=$ladir/$old_library
+                   if test "$linkmode,$pass" = "prog,link"; then
+                     compile_deplibs="$deplib $compile_deplibs"
+                     finalize_deplibs="$deplib $finalize_deplibs"
+                   else
+                     deplibs="$deplib $deplibs"
+                     test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+                   fi
+                   continue
+                 fi
+               fi
+               ;;
+             *) ;;
+             esac
+           fi
+         fi
+         ;; # -l
+       *.ltframework)
+         if test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$deplib $compile_deplibs"
+           finalize_deplibs="$deplib $finalize_deplibs"
+         else
+           deplibs="$deplib $deplibs"
+           if test "$linkmode" = lib ; then
+               case "$new_inherited_linker_flags " in
+                   *" $deplib "*) ;;
+                   * ) func_append new_inherited_linker_flags " $deplib" ;;
+               esac
+           fi
+         fi
+         continue
+         ;;
+       -L*)
+         case $linkmode in
+         lib)
+           deplibs="$deplib $deplibs"
+           test "$pass" = conv && continue
+           newdependency_libs="$deplib $newdependency_libs"
+           func_stripname '-L' '' "$deplib"
+           func_resolve_sysroot "$func_stripname_result"
+           func_append newlib_search_path " $func_resolve_sysroot_result"
+           ;;
+         prog)
+           if test "$pass" = conv; then
+             deplibs="$deplib $deplibs"
+             continue
+           fi
+           if test "$pass" = scan; then
+             deplibs="$deplib $deplibs"
+           else
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           fi
+           func_stripname '-L' '' "$deplib"
+           func_resolve_sysroot "$func_stripname_result"
+           func_append newlib_search_path " $func_resolve_sysroot_result"
+           ;;
+         *)
+           func_warning "\`-L' is ignored for archives/objects"
+           ;;
+         esac # linkmode
+         continue
+         ;; # -L
+       -R*)
+         if test "$pass" = link; then
+           func_stripname '-R' '' "$deplib"
+           func_resolve_sysroot "$func_stripname_result"
+           dir=$func_resolve_sysroot_result
+           # Make sure the xrpath contains only unique directories.
+           case "$xrpath " in
+           *" $dir "*) ;;
+           *) func_append xrpath " $dir" ;;
+           esac
+         fi
+         deplibs="$deplib $deplibs"
+         continue
+         ;;
+       *.la)
+         func_resolve_sysroot "$deplib"
+         lib=$func_resolve_sysroot_result
+         ;;
+       *.$libext)
+         if test "$pass" = conv; then
+           deplibs="$deplib $deplibs"
+           continue
+         fi
+         case $linkmode in
+         lib)
+           # Linking convenience modules into shared libraries is allowed,
+           # but linking other static libraries is non-portable.
+           case " $dlpreconveniencelibs " in
+           *" $deplib "*) ;;
+           *)
+             valid_a_lib=no
+             case $deplibs_check_method in
+               match_pattern*)
+                 set dummy $deplibs_check_method; shift
+                 match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+                 if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+                   | $EGREP "$match_pattern_regex" > /dev/null; then
+                   valid_a_lib=yes
+                 fi
+               ;;
+               pass_all)
+                 valid_a_lib=yes
+               ;;
+             esac
+             if test "$valid_a_lib" != yes; then
+               echo
+               $ECHO "*** Warning: Trying to link with static lib archive $deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because the file extensions .$libext of this argument makes me believe"
+               echo "*** that it is just a static archive that I should not use here."
+             else
+               echo
+               $ECHO "*** Warning: Linking the shared library $output against the"
+               $ECHO "*** static library $deplib is not portable!"
+               deplibs="$deplib $deplibs"
+             fi
+             ;;
+           esac
+           continue
+           ;;
+         prog)
+           if test "$pass" != link; then
+             deplibs="$deplib $deplibs"
+           else
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           fi
+           continue
+           ;;
+         esac # linkmode
+         ;; # *.$libext
+       *.lo | *.$objext)
+         if test "$pass" = conv; then
+           deplibs="$deplib $deplibs"
+         elif test "$linkmode" = prog; then
+           if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+             # If there is no dlopen support or we're linking statically,
+             # we need to preload.
+             func_append newdlprefiles " $deplib"
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           else
+             func_append newdlfiles " $deplib"
+           fi
+         fi
+         continue
+         ;;
+       %DEPLIBS%)
+         alldeplibs=yes
+         continue
+         ;;
+       esac # case $deplib
+
+       if test "$found" = yes || test -f "$lib"; then :
+       else
+         func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+       fi
+
+       # Check to see that this really is a libtool archive.
+       func_lalib_unsafe_p "$lib" \
+         || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+       func_dirname "$lib" "" "."
+       ladir="$func_dirname_result"
+
+       dlname=
+       dlopen=
+       dlpreopen=
+       libdir=
+       library_names=
+       old_library=
+       inherited_linker_flags=
+       # If the library was installed with an old release of libtool,
+       # it will not redefine variables installed, or shouldnotlink
+       installed=yes
+       shouldnotlink=no
+       avoidtemprpath=
+
+
+       # Read the .la file
+       func_source "$lib"
+
+       # Convert "-framework foo" to "foo.ltframework"
+       if test -n "$inherited_linker_flags"; then
+         tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+         for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+           case " $new_inherited_linker_flags " in
+             *" $tmp_inherited_linker_flag "*) ;;
+             *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+           esac
+         done
+       fi
+       dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       if test "$linkmode,$pass" = "lib,link" ||
+          test "$linkmode,$pass" = "prog,scan" ||
+          { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+         test -n "$dlopen" && func_append dlfiles " $dlopen"
+         test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+       fi
+
+       if test "$pass" = conv; then
+         # Only check for convenience libraries
+         deplibs="$lib $deplibs"
+         if test -z "$libdir"; then
+           if test -z "$old_library"; then
+             func_fatal_error "cannot find name of link library for \`$lib'"
+           fi
+           # It is a libtool convenience library, so add in its objects.
+           func_append convenience " $ladir/$objdir/$old_library"
+           func_append old_convenience " $ladir/$objdir/$old_library"
+           tmp_libs=
+           for deplib in $dependency_libs; do
+             deplibs="$deplib $deplibs"
+             if $opt_preserve_dup_deps ; then
+               case "$tmp_libs " in
+               *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+               esac
+             fi
+             func_append tmp_libs " $deplib"
+           done
+         elif test "$linkmode" != prog && test "$linkmode" != lib; then
+           func_fatal_error "\`$lib' is not a convenience library"
+         fi
+         continue
+       fi # $pass = conv
+
+
+       # Get the name of the library we link against.
+       linklib=
+       if test -n "$old_library" &&
+          { test "$prefer_static_libs" = yes ||
+            test "$prefer_static_libs,$installed" = "built,no"; }; then
+         linklib=$old_library
+       else
+         for l in $old_library $library_names; do
+           linklib="$l"
+         done
+       fi
+       if test -z "$linklib"; then
+         func_fatal_error "cannot find name of link library for \`$lib'"
+       fi
+
+       # This library was specified with -dlopen.
+       if test "$pass" = dlopen; then
+         if test -z "$libdir"; then
+           func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+         fi
+         if test -z "$dlname" ||
+            test "$dlopen_support" != yes ||
+            test "$build_libtool_libs" = no; then
+           # If there is no dlname, no dlopen support or we're linking
+           # statically, we need to preload.  We also need to preload any
+           # dependent libraries so libltdl's deplib preloader doesn't
+           # bomb out in the load deplibs phase.
+           func_append dlprefiles " $lib $dependency_libs"
+         else
+           func_append newdlfiles " $lib"
+         fi
+         continue
+       fi # $pass = dlopen
+
+       # We need an absolute path.
+       case $ladir in
+       [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+       *)
+         abs_ladir=`cd "$ladir" && pwd`
+         if test -z "$abs_ladir"; then
+           func_warning "cannot determine absolute directory name of \`$ladir'"
+           func_warning "passing it literally to the linker, although it might fail"
+           abs_ladir="$ladir"
+         fi
+         ;;
+       esac
+       func_basename "$lib"
+       laname="$func_basename_result"
+
+       # Find the relevant object directory and library name.
+       if test "X$installed" = Xyes; then
+         if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+           func_warning "library \`$lib' was moved."
+           dir="$ladir"
+           absdir="$abs_ladir"
+           libdir="$abs_ladir"
+         else
+           dir="$lt_sysroot$libdir"
+           absdir="$lt_sysroot$libdir"
+         fi
+         test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+       else
+         if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+           dir="$ladir"
+           absdir="$abs_ladir"
+           # Remove this search path later
+           func_append notinst_path " $abs_ladir"
+         else
+           dir="$ladir/$objdir"
+           absdir="$abs_ladir/$objdir"
+           # Remove this search path later
+           func_append notinst_path " $abs_ladir"
+         fi
+       fi # $installed = yes
+       func_stripname 'lib' '.la' "$laname"
+       name=$func_stripname_result
+
+       # This library was specified with -dlpreopen.
+       if test "$pass" = dlpreopen; then
+         if test -z "$libdir" && test "$linkmode" = prog; then
+           func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+         fi
+         case "$host" in
+           # special handling for platforms with PE-DLLs.
+           *cygwin* | *mingw* | *cegcc* )
+             # Linker will automatically link against shared library if both
+             # static and shared are present.  Therefore, ensure we extract
+             # symbols from the import library if a shared library is present
+             # (otherwise, the dlopen module name will be incorrect).  We do
+             # this by putting the import library name into $newdlprefiles.
+             # We recover the dlopen module name by 'saving' the la file
+             # name in a special purpose variable, and (later) extracting the
+             # dlname from the la file.
+             if test -n "$dlname"; then
+               func_tr_sh "$dir/$linklib"
+               eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+               func_append newdlprefiles " $dir/$linklib"
+             else
+               func_append newdlprefiles " $dir/$old_library"
+               # Keep a list of preopened convenience libraries to check
+               # that they are being used correctly in the link pass.
+               test -z "$libdir" && \
+                 func_append dlpreconveniencelibs " $dir/$old_library"
+             fi
+           ;;
+           * )
+             # Prefer using a static library (so that no silly _DYNAMIC symbols
+             # are required to link).
+             if test -n "$old_library"; then
+               func_append newdlprefiles " $dir/$old_library"
+               # Keep a list of preopened convenience libraries to check
+               # that they are being used correctly in the link pass.
+               test -z "$libdir" && \
+                 func_append dlpreconveniencelibs " $dir/$old_library"
+             # Otherwise, use the dlname, so that lt_dlopen finds it.
+             elif test -n "$dlname"; then
+               func_append newdlprefiles " $dir/$dlname"
+             else
+               func_append newdlprefiles " $dir/$linklib"
+             fi
+           ;;
+         esac
+       fi # $pass = dlpreopen
+
+       if test -z "$libdir"; then
+         # Link the convenience library
+         if test "$linkmode" = lib; then
+           deplibs="$dir/$old_library $deplibs"
+         elif test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$dir/$old_library $compile_deplibs"
+           finalize_deplibs="$dir/$old_library $finalize_deplibs"
+         else
+           deplibs="$lib $deplibs" # used for prog,scan pass
+         fi
+         continue
+       fi
+
+
+       if test "$linkmode" = prog && test "$pass" != link; then
+         func_append newlib_search_path " $ladir"
+         deplibs="$lib $deplibs"
+
+         linkalldeplibs=no
+         if test "$link_all_deplibs" != no || test -z "$library_names" ||
+            test "$build_libtool_libs" = no; then
+           linkalldeplibs=yes
+         fi
+
+         tmp_libs=
+         for deplib in $dependency_libs; do
+           case $deplib in
+           -L*) func_stripname '-L' '' "$deplib"
+                func_resolve_sysroot "$func_stripname_result"
+                func_append newlib_search_path " $func_resolve_sysroot_result"
+                ;;
+           esac
+           # Need to link against all dependency_libs?
+           if test "$linkalldeplibs" = yes; then
+             deplibs="$deplib $deplibs"
+           else
+             # Need to hardcode shared library paths
+             # or/and link against static libraries
+             newdependency_libs="$deplib $newdependency_libs"
+           fi
+           if $opt_preserve_dup_deps ; then
+             case "$tmp_libs " in
+             *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+             esac
+           fi
+           func_append tmp_libs " $deplib"
+         done # for deplib
+         continue
+       fi # $linkmode = prog...
+
+       if test "$linkmode,$pass" = "prog,link"; then
+         if test -n "$library_names" &&
+            { { test "$prefer_static_libs" = no ||
+                test "$prefer_static_libs,$installed" = "built,yes"; } ||
+              test -z "$old_library"; }; then
+           # We need to hardcode the library path
+           if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+             # Make sure the rpath contains only unique directories.
+             case "$temp_rpath:" in
+             *"$absdir:"*) ;;
+             *) func_append temp_rpath "$absdir:" ;;
+             esac
+           fi
+
+           # Hardcode the library path.
+           # Skip directories that are in the system default run-time
+           # search path.
+           case " $sys_lib_dlsearch_path " in
+           *" $absdir "*) ;;
+           *)
+             case "$compile_rpath " in
+             *" $absdir "*) ;;
+             *) func_append compile_rpath " $absdir" ;;
+             esac
+             ;;
+           esac
+           case " $sys_lib_dlsearch_path " in
+           *" $libdir "*) ;;
+           *)
+             case "$finalize_rpath " in
+             *" $libdir "*) ;;
+             *) func_append finalize_rpath " $libdir" ;;
+             esac
+             ;;
+           esac
+         fi # $linkmode,$pass = prog,link...
+
+         if test "$alldeplibs" = yes &&
+            { test "$deplibs_check_method" = pass_all ||
+              { test "$build_libtool_libs" = yes &&
+                test -n "$library_names"; }; }; then
+           # We only need to search for static libraries
+           continue
+         fi
+       fi
+
+       link_static=no # Whether the deplib will be linked statically
+       use_static_libs=$prefer_static_libs
+       if test "$use_static_libs" = built && test "$installed" = yes; then
+         use_static_libs=no
+       fi
+       if test -n "$library_names" &&
+          { test "$use_static_libs" = no || test -z "$old_library"; }; then
+         case $host in
+         *cygwin* | *mingw* | *cegcc*)
+             # No point in relinking DLLs because paths are not encoded
+             func_append notinst_deplibs " $lib"
+             need_relink=no
+           ;;
+         *)
+           if test "$installed" = no; then
+             func_append notinst_deplibs " $lib"
+             need_relink=yes
+           fi
+           ;;
+         esac
+         # This is a shared library
+
+         # Warn about portability, can't link against -module's on some
+         # systems (darwin).  Don't bleat about dlopened modules though!
+         dlopenmodule=""
+         for dlpremoduletest in $dlprefiles; do
+           if test "X$dlpremoduletest" = "X$lib"; then
+             dlopenmodule="$dlpremoduletest"
+             break
+           fi
+         done
+         if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+           echo
+           if test "$linkmode" = prog; then
+             $ECHO "*** Warning: Linking the executable $output against the loadable module"
+           else
+             $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+           fi
+           $ECHO "*** $linklib is not portable!"
+         fi
+         if test "$linkmode" = lib &&
+            test "$hardcode_into_libs" = yes; then
+           # Hardcode the library path.
+           # Skip directories that are in the system default run-time
+           # search path.
+           case " $sys_lib_dlsearch_path " in
+           *" $absdir "*) ;;
+           *)
+             case "$compile_rpath " in
+             *" $absdir "*) ;;
+             *) func_append compile_rpath " $absdir" ;;
+             esac
+             ;;
+           esac
+           case " $sys_lib_dlsearch_path " in
+           *" $libdir "*) ;;
+           *)
+             case "$finalize_rpath " in
+             *" $libdir "*) ;;
+             *) func_append finalize_rpath " $libdir" ;;
+             esac
+             ;;
+           esac
+         fi
+
+         if test -n "$old_archive_from_expsyms_cmds"; then
+           # figure out the soname
+           set dummy $library_names
+           shift
+           realname="$1"
+           shift
+           libname=`eval "\\$ECHO \"$libname_spec\""`
+           # use dlname if we got it. it's perfectly good, no?
+           if test -n "$dlname"; then
+             soname="$dlname"
+           elif test -n "$soname_spec"; then
+             # bleh windows
+             case $host in
+             *cygwin* | mingw* | *cegcc*)
+               func_arith $current - $age
+               major=$func_arith_result
+               versuffix="-$major"
+               ;;
+             esac
+             eval soname=\"$soname_spec\"
+           else
+             soname="$realname"
+           fi
+
+           # Make a new name for the extract_expsyms_cmds to use
+           soroot="$soname"
+           func_basename "$soroot"
+           soname="$func_basename_result"
+           func_stripname 'lib' '.dll' "$soname"
+           newlib=libimp-$func_stripname_result.a
+
+           # If the library has no export list, then create one now
+           if test -f "$output_objdir/$soname-def"; then :
+           else
+             func_verbose "extracting exported symbol list from \`$soname'"
+             func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+           fi
+
+           # Create $newlib
+           if test -f "$output_objdir/$newlib"; then :; else
+             func_verbose "generating import library for \`$soname'"
+             func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+           fi
+           # make sure the library variables are pointing to the new library
+           dir=$output_objdir
+           linklib=$newlib
+         fi # test -n "$old_archive_from_expsyms_cmds"
+
+         if test "$linkmode" = prog || test "$opt_mode" != relink; then
+           add_shlibpath=
+           add_dir=
+           add=
+           lib_linked=yes
+           case $hardcode_action in
+           immediate | unsupported)
+             if test "$hardcode_direct" = no; then
+               add="$dir/$linklib"
+               case $host in
+                 *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+                 *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+                 *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+                   *-*-unixware7*) add_dir="-L$dir" ;;
+                 *-*-darwin* )
+                   # if the lib is a (non-dlopened) module then we can not
+                   # link against it, someone is ignoring the earlier warnings
+                   if /usr/bin/file -L $add 2> /dev/null |
+                        $GREP ": [^:]* bundle" >/dev/null ; then
+                     if test "X$dlopenmodule" != "X$lib"; then
+                       $ECHO "*** Warning: lib $linklib is a module, not a shared library"
+                       if test -z "$old_library" ; then
+                         echo
+                         echo "*** And there doesn't seem to be a static archive available"
+                         echo "*** The link will probably fail, sorry"
+                       else
+                         add="$dir/$old_library"
+                       fi
+                     elif test -n "$old_library"; then
+                       add="$dir/$old_library"
+                     fi
+                   fi
+               esac
+             elif test "$hardcode_minus_L" = no; then
+               case $host in
+               *-*-sunos*) add_shlibpath="$dir" ;;
+               esac
+               add_dir="-L$dir"
+               add="-l$name"
+             elif test "$hardcode_shlibpath_var" = no; then
+               add_shlibpath="$dir"
+               add="-l$name"
+             else
+               lib_linked=no
+             fi
+             ;;
+           relink)
+             if test "$hardcode_direct" = yes &&
+                test "$hardcode_direct_absolute" = no; then
+               add="$dir/$linklib"
+             elif test "$hardcode_minus_L" = yes; then
+               add_dir="-L$absdir"
+               # Try looking first in the location we're being installed to.
+               if test -n "$inst_prefix_dir"; then
+                 case $libdir in
+                   [\\/]*)
+                     func_append add_dir " -L$inst_prefix_dir$libdir"
+                     ;;
+                 esac
+               fi
+               add="-l$name"
+             elif test "$hardcode_shlibpath_var" = yes; then
+               add_shlibpath="$dir"
+               add="-l$name"
+             else
+               lib_linked=no
+             fi
+             ;;
+           *) lib_linked=no ;;
+           esac
+
+           if test "$lib_linked" != yes; then
+             func_fatal_configuration "unsupported hardcode properties"
+           fi
+
+           if test -n "$add_shlibpath"; then
+             case :$compile_shlibpath: in
+             *":$add_shlibpath:"*) ;;
+             *) func_append compile_shlibpath "$add_shlibpath:" ;;
+             esac
+           fi
+           if test "$linkmode" = prog; then
+             test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+             test -n "$add" && compile_deplibs="$add $compile_deplibs"
+           else
+             test -n "$add_dir" && deplibs="$add_dir $deplibs"
+             test -n "$add" && deplibs="$add $deplibs"
+             if test "$hardcode_direct" != yes &&
+                test "$hardcode_minus_L" != yes &&
+                test "$hardcode_shlibpath_var" = yes; then
+               case :$finalize_shlibpath: in
+               *":$libdir:"*) ;;
+               *) func_append finalize_shlibpath "$libdir:" ;;
+               esac
+             fi
+           fi
+         fi
+
+         if test "$linkmode" = prog || test "$opt_mode" = relink; then
+           add_shlibpath=
+           add_dir=
+           add=
+           # Finalize command for both is simple: just hardcode it.
+           if test "$hardcode_direct" = yes &&
+              test "$hardcode_direct_absolute" = no; then
+             add="$libdir/$linklib"
+           elif test "$hardcode_minus_L" = yes; then
+             add_dir="-L$libdir"
+             add="-l$name"
+           elif test "$hardcode_shlibpath_var" = yes; then
+             case :$finalize_shlibpath: in
+             *":$libdir:"*) ;;
+             *) func_append finalize_shlibpath "$libdir:" ;;
+             esac
+             add="-l$name"
+           elif test "$hardcode_automatic" = yes; then
+             if test -n "$inst_prefix_dir" &&
+                test -f "$inst_prefix_dir$libdir/$linklib" ; then
+               add="$inst_prefix_dir$libdir/$linklib"
+             else
+               add="$libdir/$linklib"
+             fi
+           else
+             # We cannot seem to hardcode it, guess we'll fake it.
+             add_dir="-L$libdir"
+             # Try looking first in the location we're being installed to.
+             if test -n "$inst_prefix_dir"; then
+               case $libdir in
+                 [\\/]*)
+                   func_append add_dir " -L$inst_prefix_dir$libdir"
+                   ;;
+               esac
+             fi
+             add="-l$name"
+           fi
+
+           if test "$linkmode" = prog; then
+             test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+             test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+           else
+             test -n "$add_dir" && deplibs="$add_dir $deplibs"
+             test -n "$add" && deplibs="$add $deplibs"
+           fi
+         fi
+       elif test "$linkmode" = prog; then
+         # Here we assume that one of hardcode_direct or hardcode_minus_L
+         # is not unsupported.  This is valid on all known static and
+         # shared platforms.
+         if test "$hardcode_direct" != unsupported; then
+           test -n "$old_library" && linklib="$old_library"
+           compile_deplibs="$dir/$linklib $compile_deplibs"
+           finalize_deplibs="$dir/$linklib $finalize_deplibs"
+         else
+           compile_deplibs="-l$name -L$dir $compile_deplibs"
+           finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+         fi
+       elif test "$build_libtool_libs" = yes; then
+         # Not a shared library
+         if test "$deplibs_check_method" != pass_all; then
+           # We're trying link a shared library against a static one
+           # but the system doesn't support it.
+
+           # Just print a warning and add the library to dependency_libs so
+           # that the program can be linked against the static library.
+           echo
+           $ECHO "*** Warning: This system can not link to static lib archive $lib."
+           echo "*** I have the capability to make that library automatically link in when"
+           echo "*** you link to this library.  But I can only do this if you have a"
+           echo "*** shared version of the library, which you do not appear to have."
+           if test "$module" = yes; then
+             echo "*** But as you try to build a module library, libtool will still create "
+             echo "*** a static module, that should work as long as the dlopening application"
+             echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+             if test -z "$global_symbol_pipe"; then
+               echo
+               echo "*** However, this would only work if libtool was able to extract symbol"
+               echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+               echo "*** not find such a program.  So, this module is probably useless."
+               echo "*** \`nm' from GNU binutils and a full rebuild may help."
+             fi
+             if test "$build_old_libs" = no; then
+               build_libtool_libs=module
+               build_old_libs=yes
+             else
+               build_libtool_libs=no
+             fi
+           fi
+         else
+           deplibs="$dir/$old_library $deplibs"
+           link_static=yes
+         fi
+       fi # link shared/static library?
+
+       if test "$linkmode" = lib; then
+         if test -n "$dependency_libs" &&
+            { test "$hardcode_into_libs" != yes ||
+              test "$build_old_libs" = yes ||
+              test "$link_static" = yes; }; then
+           # Extract -R from dependency_libs
+           temp_deplibs=
+           for libdir in $dependency_libs; do
+             case $libdir in
+             -R*) func_stripname '-R' '' "$libdir"
+                  temp_xrpath=$func_stripname_result
+                  case " $xrpath " in
+                  *" $temp_xrpath "*) ;;
+                  *) func_append xrpath " $temp_xrpath";;
+                  esac;;
+             *) func_append temp_deplibs " $libdir";;
+             esac
+           done
+           dependency_libs="$temp_deplibs"
+         fi
+
+         func_append newlib_search_path " $absdir"
+         # Link against this library
+         test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+         # ... and its dependency_libs
+         tmp_libs=
+         for deplib in $dependency_libs; do
+           newdependency_libs="$deplib $newdependency_libs"
+           case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+           if $opt_preserve_dup_deps ; then
+             case "$tmp_libs " in
+             *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+             esac
+           fi
+           func_append tmp_libs " $func_resolve_sysroot_result"
+         done
+
+         if test "$link_all_deplibs" != no; then
+           # Add the search paths of all dependency libraries
+           for deplib in $dependency_libs; do
+             path=
+             case $deplib in
+             -L*) path="$deplib" ;;
+             *.la)
+               func_resolve_sysroot "$deplib"
+               deplib=$func_resolve_sysroot_result
+               func_dirname "$deplib" "" "."
+               dir=$func_dirname_result
+               # We need an absolute path.
+               case $dir in
+               [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+               *)
+                 absdir=`cd "$dir" && pwd`
+                 if test -z "$absdir"; then
+                   func_warning "cannot determine absolute directory name of \`$dir'"
+                   absdir="$dir"
+                 fi
+                 ;;
+               esac
+               if $GREP "^installed=no" $deplib > /dev/null; then
+               case $host in
+               *-*-darwin*)
+                 depdepl=
+                 eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+                 if test -n "$deplibrary_names" ; then
+                   for tmp in $deplibrary_names ; do
+                     depdepl=$tmp
+                   done
+                   if test -f "$absdir/$objdir/$depdepl" ; then
+                     depdepl="$absdir/$objdir/$depdepl"
+                     darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+                     func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+                     func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+                     path=
+                   fi
+                 fi
+                 ;;
+               *)
+                 path="-L$absdir/$objdir"
+                 ;;
+               esac
+               else
+                 eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+                 test -z "$libdir" && \
+                   func_fatal_error "\`$deplib' is not a valid libtool archive"
+                 test "$absdir" != "$libdir" && \
+                   func_warning "\`$deplib' seems to be moved"
+
+                 path="-L$absdir"
+               fi
+               ;;
+             esac
+             case " $deplibs " in
+             *" $path "*) ;;
+             *) deplibs="$path $deplibs" ;;
+             esac
+           done
+         fi # link_all_deplibs != no
+       fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+       if test "$linkmode" = "prog"; then
+         compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+         finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+       else
+         compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+       # Link the dlpreopened libraries before other libraries
+       for deplib in $save_deplibs; do
+         deplibs="$deplib $deplibs"
+       done
+      fi
+      if test "$pass" != dlopen; then
+       if test "$pass" != conv; then
+         # Make sure lib_search_path contains only unique directories.
+         lib_search_path=
+         for dir in $newlib_search_path; do
+           case "$lib_search_path " in
+           *" $dir "*) ;;
+           *) func_append lib_search_path " $dir" ;;
+           esac
+         done
+         newlib_search_path=
+       fi
+
+       if test "$linkmode,$pass" != "prog,link"; then
+         vars="deplibs"
+       else
+         vars="compile_deplibs finalize_deplibs"
+       fi
+       for var in $vars dependency_libs; do
+         # Add libraries to $var in reverse order
+         eval tmp_libs=\"\$$var\"
+         new_libs=
+         for deplib in $tmp_libs; do
+           # FIXME: Pedantically, this is the right thing to do, so
+           #        that some nasty dependency loop isn't accidentally
+           #        broken:
+           #new_libs="$deplib $new_libs"
+           # Pragmatically, this seems to cause very few problems in
+           # practice:
+           case $deplib in
+           -L*) new_libs="$deplib $new_libs" ;;
+           -R*) ;;
+           *)
+             # And here is the reason: when a library appears more
+             # than once as an explicit dependence of a library, or
+             # is implicitly linked in more than once by the
+             # compiler, it is considered special, and multiple
+             # occurrences thereof are not removed.  Compare this
+             # with having the same library being listed as a
+             # dependency of multiple other libraries: in this case,
+             # we know (pedantically, we assume) the library does not
+             # need to be listed more than once, so we keep only the
+             # last copy.  This is not always right, but it is rare
+             # enough that we require users that really mean to play
+             # such unportable linking tricks to link the library
+             # using -Wl,-lname, so that libtool does not consider it
+             # for duplicate removal.
+             case " $specialdeplibs " in
+             *" $deplib "*) new_libs="$deplib $new_libs" ;;
+             *)
+               case " $new_libs " in
+               *" $deplib "*) ;;
+               *) new_libs="$deplib $new_libs" ;;
+               esac
+               ;;
+             esac
+             ;;
+           esac
+         done
+         tmp_libs=
+         for deplib in $new_libs; do
+           case $deplib in
+           -L*)
+             case " $tmp_libs " in
+             *" $deplib "*) ;;
+             *) func_append tmp_libs " $deplib" ;;
+             esac
+             ;;
+           *) func_append tmp_libs " $deplib" ;;
+           esac
+         done
+         eval $var=\"$tmp_libs\"
+       done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+       case " $predeps $postdeps $compiler_lib_search_path " in
+       *" $i "*)
+         i=""
+         ;;
+       esac
+       if test -n "$i" ; then
+         func_append tmp_libs " $i"
+       fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+       func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+       func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+       func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+       func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+       func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+       func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+       func_stripname 'lib' '.la' "$outputname"
+       name=$func_stripname_result
+       eval shared_ext=\"$shrext_cmds\"
+       eval libname=\"$libname_spec\"
+       ;;
+      *)
+       test "$module" = no && \
+         func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+       if test "$need_lib_prefix" != no; then
+         # Add the "lib" prefix for modules if required
+         func_stripname '' '.la' "$outputname"
+         name=$func_stripname_result
+         eval shared_ext=\"$shrext_cmds\"
+         eval libname=\"$libname_spec\"
+       else
+         func_stripname '' '.la' "$outputname"
+         libname=$func_stripname_result
+       fi
+       ;;
+      esac
+
+      if test -n "$objs"; then
+       if test "$deplibs_check_method" != pass_all; then
+         func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+       else
+         echo
+         $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+         $ECHO "*** objects $objs is not portable!"
+         func_append libobjs " $objs"
+       fi
+      fi
+
+      test "$dlself" != no && \
+       func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+       func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+       if test "$build_libtool_libs" = yes; then
+         # Building a libtool convenience library.
+         # Some compilers have problems with a `.al' extension so
+         # convenience libraries should have the same extension an
+         # archive normally would.
+         oldlibs="$output_objdir/$libname.$libext $oldlibs"
+         build_libtool_libs=convenience
+         build_old_libs=yes
+       fi
+
+       test -n "$vinfo" && \
+         func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+       test -n "$release" && \
+         func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+       # Parse the version information argument.
+       save_ifs="$IFS"; IFS=':'
+       set dummy $vinfo 0 0 0
+       shift
+       IFS="$save_ifs"
+
+       test -n "$7" && \
+         func_fatal_help "too many parameters to \`-version-info'"
+
+       # convert absolute version numbers to libtool ages
+       # this retains compatibility with .la files and attempts
+       # to make the code below a bit more comprehensible
+
+       case $vinfo_number in
+       yes)
+         number_major="$1"
+         number_minor="$2"
+         number_revision="$3"
+         #
+         # There are really only two kinds -- those that
+         # use the current revision as the major version
+         # and those that subtract age and use age as
+         # a minor version.  But, then there is irix
+         # which has an extra 1 added just for fun
+         #
+         case $version_type in
+         # correct linux to gnu/linux during the next big refactor
+         darwin|linux|osf|windows|none)
+           func_arith $number_major + $number_minor
+           current=$func_arith_result
+           age="$number_minor"
+           revision="$number_revision"
+           ;;
+         freebsd-aout|freebsd-elf|qnx|sunos)
+           current="$number_major"
+           revision="$number_minor"
+           age="0"
+           ;;
+         irix|nonstopux)
+           func_arith $number_major + $number_minor
+           current=$func_arith_result
+           age="$number_minor"
+           revision="$number_minor"
+           lt_irix_increment=no
+           ;;
+         *)
+           func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+           ;;
+         esac
+         ;;
+       no)
+         current="$1"
+         revision="$2"
+         age="$3"
+         ;;
+       esac
+
+       # Check that each of the things are valid numbers.
+       case $current in
+       0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+       *)
+         func_error "CURRENT \`$current' must be a nonnegative integer"
+         func_fatal_error "\`$vinfo' is not valid version information"
+         ;;
+       esac
+
+       case $revision in
+       0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+       *)
+         func_error "REVISION \`$revision' must be a nonnegative integer"
+         func_fatal_error "\`$vinfo' is not valid version information"
+         ;;
+       esac
+
+       case $age in
+       0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+       *)
+         func_error "AGE \`$age' must be a nonnegative integer"
+         func_fatal_error "\`$vinfo' is not valid version information"
+         ;;
+       esac
+
+       if test "$age" -gt "$current"; then
+         func_error "AGE \`$age' is greater than the current interface number \`$current'"
+         func_fatal_error "\`$vinfo' is not valid version information"
+       fi
+
+       # Calculate the version variables.
+       major=
+       versuffix=
+       verstring=
+       case $version_type in
+       none) ;;
+
+       darwin)
+         # Like Linux, but with the current version available in
+         # verstring for coding it into the library header
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix="$major.$age.$revision"
+         # Darwin ld doesn't like 0 for these options...
+         func_arith $current + 1
+         minor_current=$func_arith_result
+         xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+         verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+         ;;
+
+       freebsd-aout)
+         major=".$current"
+         versuffix=".$current.$revision";
+         ;;
+
+       freebsd-elf)
+         major=".$current"
+         versuffix=".$current"
+         ;;
+
+       irix | nonstopux)
+         if test "X$lt_irix_increment" = "Xno"; then
+           func_arith $current - $age
+         else
+           func_arith $current - $age + 1
+         fi
+         major=$func_arith_result
+
+         case $version_type in
+           nonstopux) verstring_prefix=nonstopux ;;
+           *)         verstring_prefix=sgi ;;
+         esac
+         verstring="$verstring_prefix$major.$revision"
+
+         # Add in all the interfaces that we are compatible with.
+         loop=$revision
+         while test "$loop" -ne 0; do
+           func_arith $revision - $loop
+           iface=$func_arith_result
+           func_arith $loop - 1
+           loop=$func_arith_result
+           verstring="$verstring_prefix$major.$iface:$verstring"
+         done
+
+         # Before this point, $major must not contain `.'.
+         major=.$major
+         versuffix="$major.$revision"
+         ;;
+
+       linux) # correct to gnu/linux during the next big refactor
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix="$major.$age.$revision"
+         ;;
+
+       osf)
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix=".$current.$age.$revision"
+         verstring="$current.$age.$revision"
+
+         # Add in all the interfaces that we are compatible with.
+         loop=$age
+         while test "$loop" -ne 0; do
+           func_arith $current - $loop
+           iface=$func_arith_result
+           func_arith $loop - 1
+           loop=$func_arith_result
+           verstring="$verstring:${iface}.0"
+         done
+
+         # Make executables depend on our current version.
+         func_append verstring ":${current}.0"
+         ;;
+
+       qnx)
+         major=".$current"
+         versuffix=".$current"
+         ;;
+
+       sunos)
+         major=".$current"
+         versuffix=".$current.$revision"
+         ;;
+
+       windows)
+         # Use '-' rather than '.', since we only want one
+         # extension on DOS 8.3 filesystems.
+         func_arith $current - $age
+         major=$func_arith_result
+         versuffix="-$major"
+         ;;
+
+       *)
+         func_fatal_configuration "unknown library version type \`$version_type'"
+         ;;
+       esac
+
+       # Clear the version info if we defaulted, and they specified a release.
+       if test -z "$vinfo" && test -n "$release"; then
+         major=
+         case $version_type in
+         darwin)
+           # we can't check for "0.0" in archive_cmds due to quoting
+           # problems, so we reset it completely
+           verstring=
+           ;;
+         *)
+           verstring="0.0"
+           ;;
+         esac
+         if test "$need_version" = no; then
+           versuffix=
+         else
+           versuffix=".0.0"
+         fi
+       fi
+
+       # Remove version info from name if versioning should be avoided
+       if test "$avoid_version" = yes && test "$need_version" = no; then
+         major=
+         versuffix=
+         verstring=""
+       fi
+
+       # Check to see if the archive will have undefined symbols.
+       if test "$allow_undefined" = yes; then
+         if test "$allow_undefined_flag" = unsupported; then
+           func_warning "undefined symbols not allowed in $host shared libraries"
+           build_libtool_libs=no
+           build_old_libs=yes
+         fi
+       else
+         # Don't allow undefined symbols.
+         allow_undefined_flag="$no_undefined_flag"
+       fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+       # Remove our outputs, but don't remove object files since they
+       # may have been created when compiling PIC objects.
+       removelist=
+       tempremovelist=`$ECHO "$output_objdir/*"`
+       for p in $tempremovelist; do
+         case $p in
+           *.$objext | *.gcno)
+              ;;
+           $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+              if test "X$precious_files_regex" != "X"; then
+                if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+                then
+                  continue
+                fi
+              fi
+              func_append removelist " $p"
+              ;;
+           *) ;;
+         esac
+       done
+       test -n "$removelist" && \
+         func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+       func_append oldlibs " $output_objdir/$libname.$libext"
+
+       # Transform .lo files to .o files.
+       oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #        lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #        deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #        dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+       # If the user specified any rpath flags, then add them.
+       temp_xrpath=
+       for libdir in $xrpath; do
+         func_replace_sysroot "$libdir"
+         func_append temp_xrpath " -R$func_replace_sysroot_result"
+         case "$finalize_rpath " in
+         *" $libdir "*) ;;
+         *) func_append finalize_rpath " $libdir" ;;
+         esac
+       done
+       if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+         dependency_libs="$temp_xrpath $dependency_libs"
+       fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+       case " $dlprefiles $dlfiles " in
+       *" $lib "*) ;;
+       *) func_append dlfiles " $lib" ;;
+       esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+       case "$dlprefiles " in
+       *" $lib "*) ;;
+       *) func_append dlprefiles " $lib" ;;
+       esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+       if test -n "$rpath"; then
+         case $host in
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+           # these systems don't actually have a c library (as such)!
+           ;;
+         *-*-rhapsody* | *-*-darwin1.[012])
+           # Rhapsody C library is in the System framework
+           func_append deplibs " System.ltframework"
+           ;;
+         *-*-netbsd*)
+           # Don't link with libc until the a.out ld.so is fixed.
+           ;;
+         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+           # Do not include libc due to us having libc/libc_r.
+           ;;
+         *-*-sco3.2v5* | *-*-sco5v6*)
+           # Causes problems with __ctype
+           ;;
+         *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+           # Compiler inserts libc in the correct place for threads to work
+           ;;
+         *)
+           # Add libc to deplibs on all other systems if necessary.
+           if test "$build_libtool_need_lc" = "yes"; then
+             func_append deplibs " -lc"
+           fi
+           ;;
+         esac
+       fi
+
+       # Transform deplibs into only deplibs that can be linked in shared.
+       name_save=$name
+       libname_save=$libname
+       release_save=$release
+       versuffix_save=$versuffix
+       major_save=$major
+       # I'm not sure if I'm treating the release correctly.  I think
+       # release should show up in the -l (ie -lgmp5) so we don't want to
+       # add it in twice.  Is that correct?
+       release=""
+       versuffix=""
+       major=""
+       newdeplibs=
+       droppeddeps=no
+       case $deplibs_check_method in
+       pass_all)
+         # Don't check for shared/static.  Everything works.
+         # This might be a little naive.  We might want to check
+         # whether the library exists or not.  But this is on
+         # osf3 & osf4 and I'm not really sure... Just
+         # implementing what was already the behavior.
+         newdeplibs=$deplibs
+         ;;
+       test_compile)
+         # This code stresses the "libraries are programs" paradigm to its
+         # limits. Maybe even breaks it.  We compile a program, linking it
+         # against the deplibs as a proxy for the library.  Then we can check
+         # whether they linked in statically or dynamically with ldd.
+         $opt_dry_run || $RM conftest.c
+         cat > conftest.c <<EOF
+         int main() { return 0; }
+EOF
+         $opt_dry_run || $RM conftest
+         if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+           ldd_output=`ldd conftest`
+           for i in $deplibs; do
+             case $i in
+             -l*)
+               func_stripname -l '' "$i"
+               name=$func_stripname_result
+               if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+                 case " $predeps $postdeps " in
+                 *" $i "*)
+                   func_append newdeplibs " $i"
+                   i=""
+                   ;;
+                 esac
+               fi
+               if test -n "$i" ; then
+                 libname=`eval "\\$ECHO \"$libname_spec\""`
+                 deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+                 set dummy $deplib_matches; shift
+                 deplib_match=$1
+                 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                   func_append newdeplibs " $i"
+                 else
+                   droppeddeps=yes
+                   echo
+                   $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+                   echo "*** I have the capability to make that library automatically link in when"
+                   echo "*** you link to this library.  But I can only do this if you have a"
+                   echo "*** shared version of the library, which I believe you do not have"
+                   echo "*** because a test_compile did reveal that the linker did not use it for"
+                   echo "*** its dynamic dependency list that programs get resolved with at runtime."
+                 fi
+               fi
+               ;;
+             *)
+               func_append newdeplibs " $i"
+               ;;
+             esac
+           done
+         else
+           # Error occurred in the first compile.  Let's try to salvage
+           # the situation: Compile a separate program for each library.
+           for i in $deplibs; do
+             case $i in
+             -l*)
+               func_stripname -l '' "$i"
+               name=$func_stripname_result
+               $opt_dry_run || $RM conftest
+               if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+                 ldd_output=`ldd conftest`
+                 if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+                   case " $predeps $postdeps " in
+                   *" $i "*)
+                     func_append newdeplibs " $i"
+                     i=""
+                     ;;
+                   esac
+                 fi
+                 if test -n "$i" ; then
+                   libname=`eval "\\$ECHO \"$libname_spec\""`
+                   deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+                   set dummy $deplib_matches; shift
+                   deplib_match=$1
+                   if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                     func_append newdeplibs " $i"
+                   else
+                     droppeddeps=yes
+                     echo
+                     $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+                     echo "*** I have the capability to make that library automatically link in when"
+                     echo "*** you link to this library.  But I can only do this if you have a"
+                     echo "*** shared version of the library, which you do not appear to have"
+                     echo "*** because a test_compile did reveal that the linker did not use this one"
+                     echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+                   fi
+                 fi
+               else
+                 droppeddeps=yes
+                 echo
+                 $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+                 echo "*** make it link in!  You will probably need to install it or some"
+                 echo "*** library that it depends on before this library will be fully"
+                 echo "*** functional.  Installing it before continuing would be even better."
+               fi
+               ;;
+             *)
+               func_append newdeplibs " $i"
+               ;;
+             esac
+           done
+         fi
+         ;;
+       file_magic*)
+         set dummy $deplibs_check_method; shift
+         file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+         for a_deplib in $deplibs; do
+           case $a_deplib in
+           -l*)
+             func_stripname -l '' "$a_deplib"
+             name=$func_stripname_result
+             if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+               case " $predeps $postdeps " in
+               *" $a_deplib "*)
+                 func_append newdeplibs " $a_deplib"
+                 a_deplib=""
+                 ;;
+               esac
+             fi
+             if test -n "$a_deplib" ; then
+               libname=`eval "\\$ECHO \"$libname_spec\""`
+               if test -n "$file_magic_glob"; then
+                 libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+               else
+                 libnameglob=$libname
+               fi
+               test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+               for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+                 if test "$want_nocaseglob" = yes; then
+                   shopt -s nocaseglob
+                   potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+                   $nocaseglob
+                 else
+                   potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+                 fi
+                 for potent_lib in $potential_libs; do
+                     # Follow soft links.
+                     if ls -lLd "$potent_lib" 2>/dev/null |
+                        $GREP " -> " >/dev/null; then
+                       continue
+                     fi
+                     # The statement above tries to avoid entering an
+                     # endless loop below, in case of cyclic links.
+                     # We might still enter an endless loop, since a link
+                     # loop can be closed while we follow links,
+                     # but so what?
+                     potlib="$potent_lib"
+                     while test -h "$potlib" 2>/dev/null; do
+                       potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+                       case $potliblink in
+                       [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+                       *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+                       esac
+                     done
+                     if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+                        $SED -e 10q |
+                        $EGREP "$file_magic_regex" > /dev/null; then
+                       func_append newdeplibs " $a_deplib"
+                       a_deplib=""
+                       break 2
+                     fi
+                 done
+               done
+             fi
+             if test -n "$a_deplib" ; then
+               droppeddeps=yes
+               echo
+               $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because I did check the linker path looking for a file starting"
+               if test -z "$potlib" ; then
+                 $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+               else
+                 $ECHO "*** with $libname and none of the candidates passed a file format test"
+                 $ECHO "*** using a file magic. Last file checked: $potlib"
+               fi
+             fi
+             ;;
+           *)
+             # Add a -L argument.
+             func_append newdeplibs " $a_deplib"
+             ;;
+           esac
+         done # Gone through all deplibs.
+         ;;
+       match_pattern*)
+         set dummy $deplibs_check_method; shift
+         match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+         for a_deplib in $deplibs; do
+           case $a_deplib in
+           -l*)
+             func_stripname -l '' "$a_deplib"
+             name=$func_stripname_result
+             if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+               case " $predeps $postdeps " in
+               *" $a_deplib "*)
+                 func_append newdeplibs " $a_deplib"
+                 a_deplib=""
+                 ;;
+               esac
+             fi
+             if test -n "$a_deplib" ; then
+               libname=`eval "\\$ECHO \"$libname_spec\""`
+               for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+                 potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+                 for potent_lib in $potential_libs; do
+                   potlib="$potent_lib" # see symlink-check above in file_magic test
+                   if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+                      $EGREP "$match_pattern_regex" > /dev/null; then
+                     func_append newdeplibs " $a_deplib"
+                     a_deplib=""
+                     break 2
+                   fi
+                 done
+               done
+             fi
+             if test -n "$a_deplib" ; then
+               droppeddeps=yes
+               echo
+               $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because I did check the linker path looking for a file starting"
+               if test -z "$potlib" ; then
+                 $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+               else
+                 $ECHO "*** with $libname and none of the candidates passed a file format test"
+                 $ECHO "*** using a regex pattern. Last file checked: $potlib"
+               fi
+             fi
+             ;;
+           *)
+             # Add a -L argument.
+             func_append newdeplibs " $a_deplib"
+             ;;
+           esac
+         done # Gone through all deplibs.
+         ;;
+       none | unknown | *)
+         newdeplibs=""
+         tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+         if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+           for i in $predeps $postdeps ; do
+             # can't use Xsed below, because $i might contain '/'
+             tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+           done
+         fi
+         case $tmp_deplibs in
+         *[!\  \ ]*)
+           echo
+           if test "X$deplibs_check_method" = "Xnone"; then
+             echo "*** Warning: inter-library dependencies are not supported in this platform."
+           else
+             echo "*** Warning: inter-library dependencies are not known to be supported."
+           fi
+           echo "*** All declared inter-library dependencies are being dropped."
+           droppeddeps=yes
+           ;;
+         esac
+         ;;
+       esac
+       versuffix=$versuffix_save
+       major=$major_save
+       release=$release_save
+       libname=$libname_save
+       name=$name_save
+
+       case $host in
+       *-*-rhapsody* | *-*-darwin1.[012])
+         # On Rhapsody replace the C library with the System framework
+         newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+         ;;
+       esac
+
+       if test "$droppeddeps" = yes; then
+         if test "$module" = yes; then
+           echo
+           echo "*** Warning: libtool could not satisfy all declared inter-library"
+           $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+           echo "*** a static module, that should work as long as the dlopening"
+           echo "*** application is linked with the -dlopen flag."
+           if test -z "$global_symbol_pipe"; then
+             echo
+             echo "*** However, this would only work if libtool was able to extract symbol"
+             echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+             echo "*** not find such a program.  So, this module is probably useless."
+             echo "*** \`nm' from GNU binutils and a full rebuild may help."
+           fi
+           if test "$build_old_libs" = no; then
+             oldlibs="$output_objdir/$libname.$libext"
+             build_libtool_libs=module
+             build_old_libs=yes
+           else
+             build_libtool_libs=no
+           fi
+         else
+           echo "*** The inter-library dependencies that have been dropped here will be"
+           echo "*** automatically added whenever a program is linked with this library"
+           echo "*** or is declared to -dlopen it."
+
+           if test "$allow_undefined" = no; then
+             echo
+             echo "*** Since this library must not contain undefined symbols,"
+             echo "*** because either the platform does not support them or"
+             echo "*** it was explicitly requested with -no-undefined,"
+             echo "*** libtool will only create a static version of it."
+             if test "$build_old_libs" = no; then
+               oldlibs="$output_objdir/$libname.$libext"
+               build_libtool_libs=module
+               build_old_libs=yes
+             else
+               build_libtool_libs=no
+             fi
+           fi
+         fi
+       fi
+       # Done checking deplibs!
+       deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+       *-*-darwin*)
+         newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+       case " $new_libs " in
+       *" -L$path/$objdir "*) ;;
+       *)
+         case " $deplibs " in
+         *" -L$path/$objdir "*)
+           func_append new_libs " -L$path/$objdir" ;;
+         esac
+         ;;
+       esac
+      done
+      for deplib in $deplibs; do
+       case $deplib in
+       -L*)
+         case " $new_libs " in
+         *" $deplib "*) ;;
+         *) func_append new_libs " $deplib" ;;
+         esac
+         ;;
+       *) func_append new_libs " $deplib" ;;
+       esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+       # Remove ${wl} instances when linking with ld.
+       # FIXME: should test the right _cmds variable.
+       case $archive_cmds in
+         *\$LD\ *) wl= ;;
+        esac
+       if test "$hardcode_into_libs" = yes; then
+         # Hardcode the library paths
+         hardcode_libdirs=
+         dep_rpath=
+         rpath="$finalize_rpath"
+         test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+         for libdir in $rpath; do
+           if test -n "$hardcode_libdir_flag_spec"; then
+             if test -n "$hardcode_libdir_separator"; then
+               func_replace_sysroot "$libdir"
+               libdir=$func_replace_sysroot_result
+               if test -z "$hardcode_libdirs"; then
+                 hardcode_libdirs="$libdir"
+               else
+                 # Just accumulate the unique libdirs.
+                 case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+                 *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+                   ;;
+                 *)
+                   func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+                   ;;
+                 esac
+               fi
+             else
+               eval flag=\"$hardcode_libdir_flag_spec\"
+               func_append dep_rpath " $flag"
+             fi
+           elif test -n "$runpath_var"; then
+             case "$perm_rpath " in
+             *" $libdir "*) ;;
+             *) func_append perm_rpath " $libdir" ;;
+             esac
+           fi
+         done
+         # Substitute the hardcoded libdirs into the rpath.
+         if test -n "$hardcode_libdir_separator" &&
+            test -n "$hardcode_libdirs"; then
+           libdir="$hardcode_libdirs"
+           eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+         fi
+         if test -n "$runpath_var" && test -n "$perm_rpath"; then
+           # We should set the runpath_var.
+           rpath=
+           for dir in $perm_rpath; do
+             func_append rpath "$dir:"
+           done
+           eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+         fi
+         test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+       fi
+
+       shlibpath="$finalize_shlibpath"
+       test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+       if test -n "$shlibpath"; then
+         eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+       fi
+
+       # Get the real and link names of the library.
+       eval shared_ext=\"$shrext_cmds\"
+       eval library_names=\"$library_names_spec\"
+       set dummy $library_names
+       shift
+       realname="$1"
+       shift
+
+       if test -n "$soname_spec"; then
+         eval soname=\"$soname_spec\"
+       else
+         soname="$realname"
+       fi
+       if test -z "$dlname"; then
+         dlname=$soname
+       fi
+
+       lib="$output_objdir/$realname"
+       linknames=
+       for link
+       do
+         func_append linknames " $link"
+       done
+
+       # Use standard objects if they are pic
+       test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+       test "X$libobjs" = "X " && libobjs=
+
+       delfiles=
+       if test -n "$export_symbols" && test -n "$include_expsyms"; then
+         $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+         export_symbols="$output_objdir/$libname.uexp"
+         func_append delfiles " $export_symbols"
+       fi
+
+       orig_export_symbols=
+       case $host_os in
+       cygwin* | mingw* | cegcc*)
+         if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+           # exporting using user supplied symfile
+           if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+             # and it's NOT already a .def file. Must figure out
+             # which of the given symbols are data symbols and tag
+             # them as such. So, trigger use of export_symbols_cmds.
+             # export_symbols gets reassigned inside the "prepare
+             # the list of exported symbols" if statement, so the
+             # include_expsyms logic still works.
+             orig_export_symbols="$export_symbols"
+             export_symbols=
+             always_export_symbols=yes
+           fi
+         fi
+         ;;
+       esac
+
+       # Prepare the list of exported symbols
+       if test -z "$export_symbols"; then
+         if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+           func_verbose "generating symbol list for \`$libname.la'"
+           export_symbols="$output_objdir/$libname.exp"
+           $opt_dry_run || $RM $export_symbols
+           cmds=$export_symbols_cmds
+           save_ifs="$IFS"; IFS='~'
+           for cmd1 in $cmds; do
+             IFS="$save_ifs"
+             # Take the normal branch if the nm_file_list_spec branch
+             # doesn't work or if tool conversion is not needed.
+             case $nm_file_list_spec~$to_tool_file_cmd in
+               *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+                 try_normal_branch=yes
+                 eval cmd=\"$cmd1\"
+                 func_len " $cmd"
+                 len=$func_len_result
+                 ;;
+               *)
+                 try_normal_branch=no
+                 ;;
+             esac
+             if test "$try_normal_branch" = yes \
+                && { test "$len" -lt "$max_cmd_len" \
+                     || test "$max_cmd_len" -le -1; }
+             then
+               func_show_eval "$cmd" 'exit $?'
+               skipped_export=false
+             elif test -n "$nm_file_list_spec"; then
+               func_basename "$output"
+               output_la=$func_basename_result
+               save_libobjs=$libobjs
+               save_output=$output
+               output=${output_objdir}/${output_la}.nm
+               func_to_tool_file "$output"
+               libobjs=$nm_file_list_spec$func_to_tool_file_result
+               func_append delfiles " $output"
+               func_verbose "creating $NM input file list: $output"
+               for obj in $save_libobjs; do
+                 func_to_tool_file "$obj"
+                 $ECHO "$func_to_tool_file_result"
+               done > "$output"
+               eval cmd=\"$cmd1\"
+               func_show_eval "$cmd" 'exit $?'
+               output=$save_output
+               libobjs=$save_libobjs
+               skipped_export=false
+             else
+               # The command line is too long to execute in one step.
+               func_verbose "using reloadable object file for export list..."
+               skipped_export=:
+               # Break out early, otherwise skipped_export may be
+               # set to false by a later but shorter cmd.
+               break
+             fi
+           done
+           IFS="$save_ifs"
+           if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+             func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+             func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+           fi
+         fi
+       fi
+
+       if test -n "$export_symbols" && test -n "$include_expsyms"; then
+         tmp_export_symbols="$export_symbols"
+         test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+         $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+       fi
+
+       if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+         # The given exports_symbols file has to be filtered, so filter it.
+         func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+         # FIXME: $output_objdir/$libname.filter potentially contains lots of
+         # 's' commands which not all seds can handle. GNU sed should be fine
+         # though. Also, the filter scales superlinearly with the number of
+         # global variables. join(1) would be nice here, but unfortunately
+         # isn't a blessed tool.
+         $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+         func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+         export_symbols=$output_objdir/$libname.def
+         $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+       fi
+
+       tmp_deplibs=
+       for test_deplib in $deplibs; do
+         case " $convenience " in
+         *" $test_deplib "*) ;;
+         *)
+           func_append tmp_deplibs " $test_deplib"
+           ;;
+         esac
+       done
+       deplibs="$tmp_deplibs"
+
+       if test -n "$convenience"; then
+         if test -n "$whole_archive_flag_spec" &&
+           test "$compiler_needs_object" = yes &&
+           test -z "$libobjs"; then
+           # extract the archives, so we have objects to list.
+           # TODO: could optimize this to just extract one archive.
+           whole_archive_flag_spec=
+         fi
+         if test -n "$whole_archive_flag_spec"; then
+           save_libobjs=$libobjs
+           eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+           test "X$libobjs" = "X " && libobjs=
+         else
+           gentop="$output_objdir/${outputname}x"
+           func_append generated " $gentop"
+
+           func_extract_archives $gentop $convenience
+           func_append libobjs " $func_extract_archives_result"
+           test "X$libobjs" = "X " && libobjs=
+         fi
+       fi
+
+       if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+         eval flag=\"$thread_safe_flag_spec\"
+         func_append linker_flags " $flag"
+       fi
+
+       # Make a backup of the uninstalled library when relinking
+       if test "$opt_mode" = relink; then
+         $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+       fi
+
+       # Do each of the archive commands.
+       if test "$module" = yes && test -n "$module_cmds" ; then
+         if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+           eval test_cmds=\"$module_expsym_cmds\"
+           cmds=$module_expsym_cmds
+         else
+           eval test_cmds=\"$module_cmds\"
+           cmds=$module_cmds
+         fi
+       else
+         if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+           eval test_cmds=\"$archive_expsym_cmds\"
+           cmds=$archive_expsym_cmds
+         else
+           eval test_cmds=\"$archive_cmds\"
+           cmds=$archive_cmds
+         fi
+       fi
+
+       if test "X$skipped_export" != "X:" &&
+          func_len " $test_cmds" &&
+          len=$func_len_result &&
+          test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+         :
+       else
+         # The command line is too long to link in one step, link piecewise
+         # or, if using GNU ld and skipped_export is not :, use a linker
+         # script.
+
+         # Save the value of $output and $libobjs because we want to
+         # use them later.  If we have whole_archive_flag_spec, we
+         # want to use save_libobjs as it was before
+         # whole_archive_flag_spec was expanded, because we can't
+         # assume the linker understands whole_archive_flag_spec.
+         # This may have to be revisited, in case too many
+         # convenience libraries get linked in and end up exceeding
+         # the spec.
+         if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+           save_libobjs=$libobjs
+         fi
+         save_output=$output
+         func_basename "$output"
+         output_la=$func_basename_result
+
+         # Clear the reloadable object creation command queue and
+         # initialize k to one.
+         test_cmds=
+         concat_cmds=
+         objlist=
+         last_robj=
+         k=1
+
+         if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+           output=${output_objdir}/${output_la}.lnkscript
+           func_verbose "creating GNU ld script: $output"
+           echo 'INPUT (' > $output
+           for obj in $save_libobjs
+           do
+             func_to_tool_file "$obj"
+             $ECHO "$func_to_tool_file_result" >> $output
+           done
+           echo ')' >> $output
+           func_append delfiles " $output"
+           func_to_tool_file "$output"
+           output=$func_to_tool_file_result
+         elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+           output=${output_objdir}/${output_la}.lnk
+           func_verbose "creating linker input file list: $output"
+           : > $output
+           set x $save_libobjs
+           shift
+           firstobj=
+           if test "$compiler_needs_object" = yes; then
+             firstobj="$1 "
+             shift
+           fi
+           for obj
+           do
+             func_to_tool_file "$obj"
+             $ECHO "$func_to_tool_file_result" >> $output
+           done
+           func_append delfiles " $output"
+           func_to_tool_file "$output"
+           output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+         else
+           if test -n "$save_libobjs"; then
+             func_verbose "creating reloadable object files..."
+             output=$output_objdir/$output_la-${k}.$objext
+             eval test_cmds=\"$reload_cmds\"
+             func_len " $test_cmds"
+             len0=$func_len_result
+             len=$len0
+
+             # Loop over the list of objects to be linked.
+             for obj in $save_libobjs
+             do
+               func_len " $obj"
+               func_arith $len + $func_len_result
+               len=$func_arith_result
+               if test "X$objlist" = X ||
+                  test "$len" -lt "$max_cmd_len"; then
+                 func_append objlist " $obj"
+               else
+                 # The command $test_cmds is almost too long, add a
+                 # command to the queue.
+                 if test "$k" -eq 1 ; then
+                   # The first file doesn't have a previous command to add.
+                   reload_objs=$objlist
+                   eval concat_cmds=\"$reload_cmds\"
+                 else
+                   # All subsequent reloadable object files will link in
+                   # the last one created.
+                   reload_objs="$objlist $last_robj"
+                   eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+                 fi
+                 last_robj=$output_objdir/$output_la-${k}.$objext
+                 func_arith $k + 1
+                 k=$func_arith_result
+                 output=$output_objdir/$output_la-${k}.$objext
+                 objlist=" $obj"
+                 func_len " $last_robj"
+                 func_arith $len0 + $func_len_result
+                 len=$func_arith_result
+               fi
+             done
+             # Handle the remaining objects by creating one last
+             # reloadable object file.  All subsequent reloadable object
+             # files will link in the last one created.
+             test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+             reload_objs="$objlist $last_robj"
+             eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+             if test -n "$last_robj"; then
+               eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+             fi
+             func_append delfiles " $output"
+
+           else
+             output=
+           fi
+
+           if ${skipped_export-false}; then
+             func_verbose "generating symbol list for \`$libname.la'"
+             export_symbols="$output_objdir/$libname.exp"
+             $opt_dry_run || $RM $export_symbols
+             libobjs=$output
+             # Append the command to create the export file.
+             test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+             eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+             if test -n "$last_robj"; then
+               eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+             fi
+           fi
+
+           test -n "$save_libobjs" &&
+             func_verbose "creating a temporary reloadable object file: $output"
+
+           # Loop through the commands generated above and execute them.
+           save_ifs="$IFS"; IFS='~'
+           for cmd in $concat_cmds; do
+             IFS="$save_ifs"
+             $opt_silent || {
+                 func_quote_for_expand "$cmd"
+                 eval "func_echo $func_quote_for_expand_result"
+             }
+             $opt_dry_run || eval "$cmd" || {
+               lt_exit=$?
+
+               # Restore the uninstalled library and exit
+               if test "$opt_mode" = relink; then
+                 ( cd "$output_objdir" && \
+                   $RM "${realname}T" && \
+                   $MV "${realname}U" "$realname" )
+               fi
+
+               exit $lt_exit
+             }
+           done
+           IFS="$save_ifs"
+
+           if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+             func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+             func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+           fi
+         fi
+
+          if ${skipped_export-false}; then
+           if test -n "$export_symbols" && test -n "$include_expsyms"; then
+             tmp_export_symbols="$export_symbols"
+             test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+             $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+           fi
+
+           if test -n "$orig_export_symbols"; then
+             # The given exports_symbols file has to be filtered, so filter it.
+             func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+             # FIXME: $output_objdir/$libname.filter potentially contains lots of
+             # 's' commands which not all seds can handle. GNU sed should be fine
+             # though. Also, the filter scales superlinearly with the number of
+             # global variables. join(1) would be nice here, but unfortunately
+             # isn't a blessed tool.
+             $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+             func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+             export_symbols=$output_objdir/$libname.def
+             $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+           fi
+         fi
+
+         libobjs=$output
+         # Restore the value of output.
+         output=$save_output
+
+         if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+           eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+           test "X$libobjs" = "X " && libobjs=
+         fi
+         # Expand the library linking commands again to reset the
+         # value of $libobjs for piecewise linking.
+
+         # Do each of the archive commands.
+         if test "$module" = yes && test -n "$module_cmds" ; then
+           if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+             cmds=$module_expsym_cmds
+           else
+             cmds=$module_cmds
+           fi
+         else
+           if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+             cmds=$archive_expsym_cmds
+           else
+             cmds=$archive_cmds
+           fi
+         fi
+       fi
+
+       if test -n "$delfiles"; then
+         # Append the command to remove temporary files to $cmds.
+         eval cmds=\"\$cmds~\$RM $delfiles\"
+       fi
+
+       # Add any objects from preloaded convenience libraries
+       if test -n "$dlprefiles"; then
+         gentop="$output_objdir/${outputname}x"
+         func_append generated " $gentop"
+
+         func_extract_archives $gentop $dlprefiles
+         func_append libobjs " $func_extract_archives_result"
+         test "X$libobjs" = "X " && libobjs=
+       fi
+
+       save_ifs="$IFS"; IFS='~'
+       for cmd in $cmds; do
+         IFS="$save_ifs"
+         eval cmd=\"$cmd\"
+         $opt_silent || {
+           func_quote_for_expand "$cmd"
+           eval "func_echo $func_quote_for_expand_result"
+         }
+         $opt_dry_run || eval "$cmd" || {
+           lt_exit=$?
+
+           # Restore the uninstalled library and exit
+           if test "$opt_mode" = relink; then
+             ( cd "$output_objdir" && \
+               $RM "${realname}T" && \
+               $MV "${realname}U" "$realname" )
+           fi
+
+           exit $lt_exit
+         }
+       done
+       IFS="$save_ifs"
+
+       # Restore the uninstalled library and exit
+       if test "$opt_mode" = relink; then
+         $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+         if test -n "$convenience"; then
+           if test -z "$whole_archive_flag_spec"; then
+             func_show_eval '${RM}r "$gentop"'
+           fi
+         fi
+
+         exit $EXIT_SUCCESS
+       fi
+
+       # Create links to the real library.
+       for linkname in $linknames; do
+         if test "$realname" != "$linkname"; then
+           func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+         fi
+       done
+
+       # If -module or -export-dynamic was specified, set the dlname.
+       if test "$module" = yes || test "$export_dynamic" = yes; then
+         # On all known operating systems, these are identical.
+         dlname="$soname"
+       fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+       func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+       func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+       func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+       func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+       func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+       test -n "$objs$old_deplibs" && \
+         func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+       libobj=$output
+       func_lo2o "$libobj"
+       obj=$func_lo2o_result
+       ;;
+      *)
+       libobj=
+       obj="$output"
+       ;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+       if test -n "$whole_archive_flag_spec"; then
+         eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+         reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+       else
+         gentop="$output_objdir/${obj}x"
+         func_append generated " $gentop"
+
+         func_extract_archives $gentop $convenience
+         reload_conv_objs="$reload_objs $func_extract_archives_result"
+       fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+       if test -n "$gentop"; then
+         func_show_eval '${RM}r "$gentop"'
+       fi
+
+       exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+       if test -n "$gentop"; then
+         func_show_eval '${RM}r "$gentop"'
+       fi
+
+       # Create an invalid libtool object if no PIC, so that we don't
+       # accidentally link it into a program.
+       # $show "echo timestamp > $libobj"
+       # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+       exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+       # Only do commands if we really have different PIC objects.
+       reload_objs="$libobjs $reload_conv_objs"
+       output="$libobj"
+       func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+       func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+       *cygwin*) func_stripname '' '.exe' "$output"
+                 output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+       func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+       func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+       && test "$dlopen_self" = unknown \
+       && test "$dlopen_self_static" = unknown && \
+         func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+       # On Rhapsody replace the C library is the System framework
+       compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+       finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+       ;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+       # Don't allow lazy linking, it breaks C++ global constructors
+       # But is supposedly fixed on 10.4 or later (yay!).
+       if test "$tagname" = CXX ; then
+         case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+           10.[0123])
+             func_append compile_command " ${wl}-bind_at_load"
+             func_append finalize_command " ${wl}-bind_at_load"
+           ;;
+         esac
+       fi
+       # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+       compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       ;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+       case " $new_libs " in
+       *" -L$path/$objdir "*) ;;
+       *)
+         case " $compile_deplibs " in
+         *" -L$path/$objdir "*)
+           func_append new_libs " -L$path/$objdir" ;;
+         esac
+         ;;
+       esac
+      done
+      for deplib in $compile_deplibs; do
+       case $deplib in
+       -L*)
+         case " $new_libs " in
+         *" $deplib "*) ;;
+         *) func_append new_libs " $deplib" ;;
+         esac
+         ;;
+       *) func_append new_libs " $deplib" ;;
+       esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+       # If the user specified any rpath flags, then add them.
+       for libdir in $rpath $xrpath; do
+         # This is the magic to use -rpath.
+         case "$finalize_rpath " in
+         *" $libdir "*) ;;
+         *) func_append finalize_rpath " $libdir" ;;
+         esac
+       done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+       if test -n "$hardcode_libdir_flag_spec"; then
+         if test -n "$hardcode_libdir_separator"; then
+           if test -z "$hardcode_libdirs"; then
+             hardcode_libdirs="$libdir"
+           else
+             # Just accumulate the unique libdirs.
+             case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+               ;;
+             *)
+               func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+               ;;
+             esac
+           fi
+         else
+           eval flag=\"$hardcode_libdir_flag_spec\"
+           func_append rpath " $flag"
+         fi
+       elif test -n "$runpath_var"; then
+         case "$perm_rpath " in
+         *" $libdir "*) ;;
+         *) func_append perm_rpath " $libdir" ;;
+         esac
+       fi
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+         testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+         case :$dllsearchpath: in
+         *":$libdir:"*) ;;
+         ::) dllsearchpath=$libdir;;
+         *) func_append dllsearchpath ":$libdir";;
+         esac
+         case :$dllsearchpath: in
+         *":$testbindir:"*) ;;
+         ::) dllsearchpath=$testbindir;;
+         *) func_append dllsearchpath ":$testbindir";;
+         esac
+         ;;
+       esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+        test -n "$hardcode_libdirs"; then
+       libdir="$hardcode_libdirs"
+       eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+       if test -n "$hardcode_libdir_flag_spec"; then
+         if test -n "$hardcode_libdir_separator"; then
+           if test -z "$hardcode_libdirs"; then
+             hardcode_libdirs="$libdir"
+           else
+             # Just accumulate the unique libdirs.
+             case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+               ;;
+             *)
+               func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+               ;;
+             esac
+           fi
+         else
+           eval flag=\"$hardcode_libdir_flag_spec\"
+           func_append rpath " $flag"
+         fi
+       elif test -n "$runpath_var"; then
+         case "$finalize_perm_rpath " in
+         *" $libdir "*) ;;
+         *) func_append finalize_perm_rpath " $libdir" ;;
+         esac
+       fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+        test -n "$hardcode_libdirs"; then
+       libdir="$hardcode_libdirs"
+       eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+       # Transform all the library objects into standard objects.
+       compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+       finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+       func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+       # Replace the output file specification.
+       compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+       link_command="$compile_command$compile_rpath"
+
+       # We have no uninstalled library dependencies, so finalize right now.
+       exit_status=0
+       func_show_eval "$link_command" 'exit_status=$?'
+
+       if test -n "$postlink_cmds"; then
+         func_to_tool_file "$output"
+         postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+         func_execute_cmds "$postlink_cmds" 'exit $?'
+       fi
+
+       # Delete the generated files.
+       if test -f "$output_objdir/${outputname}S.${objext}"; then
+         func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+       fi
+
+       exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+       compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+       finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+       if test -n "$perm_rpath"; then
+         # We should set the runpath_var.
+         rpath=
+         for dir in $perm_rpath; do
+           func_append rpath "$dir:"
+         done
+         compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+       fi
+       if test -n "$finalize_perm_rpath"; then
+         # We should set the runpath_var.
+         rpath=
+         for dir in $finalize_perm_rpath; do
+           func_append rpath "$dir:"
+         done
+         finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+       fi
+      fi
+
+      if test "$no_install" = yes; then
+       # We don't need to create a wrapper script.
+       link_command="$compile_var$compile_command$compile_rpath"
+       # Replace the output file specification.
+       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+       # Delete the old output file.
+       $opt_dry_run || $RM $output
+       # Link the executable and exit
+       func_show_eval "$link_command" 'exit $?'
+
+       if test -n "$postlink_cmds"; then
+         func_to_tool_file "$output"
+         postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+         func_execute_cmds "$postlink_cmds" 'exit $?'
+       fi
+
+       exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+       # Fast installation is not supported
+       link_command="$compile_var$compile_command$compile_rpath"
+       relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+       func_warning "this platform does not like uninstalled shared libraries"
+       func_warning "\`$output' will be relinked during installation"
+      else
+       if test "$fast_install" != no; then
+         link_command="$finalize_var$compile_command$finalize_rpath"
+         if test "$fast_install" = yes; then
+           relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+         else
+           # fast_install is set to needless
+           relink_command=
+         fi
+       else
+         link_command="$compile_var$compile_command$compile_rpath"
+         relink_command="$finalize_var$finalize_command$finalize_rpath"
+       fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+       func_to_tool_file "$output_objdir/$outputname"
+       postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+       func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+       # Preserve any variables that may affect compiler behavior
+       for var in $variables_saved_for_relink; do
+         if eval test -z \"\${$var+set}\"; then
+           relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+         elif eval var_value=\$$var; test -z "$var_value"; then
+           relink_command="$var=; export $var; $relink_command"
+         else
+           func_quote_for_eval "$var_value"
+           relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+         fi
+       done
+       relink_command="(cd `pwd`; $relink_command)"
+       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+       # win32 will think the script is a binary if it has
+       # a .exe suffix, so we strip it off here.
+       case $output in
+         *.exe) func_stripname '' '.exe' "$output"
+                output=$func_stripname_result ;;
+       esac
+       # test for cygwin because mv fails w/o .exe extensions
+       case $host in
+         *cygwin*)
+           exeext=.exe
+           func_stripname '' '.exe' "$outputname"
+           outputname=$func_stripname_result ;;
+         *) exeext= ;;
+       esac
+       case $host in
+         *cygwin* | *mingw* )
+           func_dirname_and_basename "$output" "" "."
+           output_name=$func_basename_result
+           output_path=$func_dirname_result
+           cwrappersource="$output_path/$objdir/lt-$output_name.c"
+           cwrapper="$output_path/$output_name.exe"
+           $RM $cwrappersource $cwrapper
+           trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+           func_emit_cwrapperexe_src > $cwrappersource
+
+           # The wrapper executable is built using the $host compiler,
+           # because it contains $host paths and files. If cross-
+           # compiling, it, like the target executable, must be
+           # executed on the $host or under an emulation environment.
+           $opt_dry_run || {
+             $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+             $STRIP $cwrapper
+           }
+
+           # Now, create the wrapper script for func_source use:
+           func_ltwrapper_scriptname $cwrapper
+           $RM $func_ltwrapper_scriptname_result
+           trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+           $opt_dry_run || {
+             # note: this script will not be executed, so do not chmod.
+             if test "x$build" = "x$host" ; then
+               $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+             else
+               func_emit_wrapper no > $func_ltwrapper_scriptname_result
+             fi
+           }
+         ;;
+         * )
+           $RM $output
+           trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+           func_emit_wrapper no > $output
+           chmod +x $output
+         ;;
+       esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+       oldobjs="$libobjs_save $symfileobj"
+       addlibs="$convenience"
+       build_libtool_libs=no
+      else
+       if test "$build_libtool_libs" = module; then
+         oldobjs="$libobjs_save"
+         build_libtool_libs=no
+       else
+         oldobjs="$old_deplibs $non_pic_objects"
+         if test "$preload" = yes && test -f "$symfileobj"; then
+           func_append oldobjs " $symfileobj"
+         fi
+       fi
+       addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+       gentop="$output_objdir/${outputname}x"
+       func_append generated " $gentop"
+
+       func_extract_archives $gentop $addlibs
+       func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+
+       # Add any objects from preloaded convenience libraries
+       if test -n "$dlprefiles"; then
+         gentop="$output_objdir/${outputname}x"
+         func_append generated " $gentop"
+
+         func_extract_archives $gentop $dlprefiles
+         func_append oldobjs " $func_extract_archives_result"
+       fi
+
+       # POSIX demands no paths to be encoded in archives.  We have
+       # to avoid creating archives with duplicate basenames if we
+       # might have to extract them afterwards, e.g., when creating a
+       # static archive out of a convenience library, or when linking
+       # the entirety of a libtool archive into another (currently
+       # not supported by libtool).
+       if (for obj in $oldobjs
+           do
+             func_basename "$obj"
+             $ECHO "$func_basename_result"
+           done | sort | sort -uc >/dev/null 2>&1); then
+         :
+       else
+         echo "copying selected object files to avoid basename conflicts..."
+         gentop="$output_objdir/${outputname}x"
+         func_append generated " $gentop"
+         func_mkdir_p "$gentop"
+         save_oldobjs=$oldobjs
+         oldobjs=
+         counter=1
+         for obj in $save_oldobjs
+         do
+           func_basename "$obj"
+           objbase="$func_basename_result"
+           case " $oldobjs " in
+           " ") oldobjs=$obj ;;
+           *[\ /]"$objbase "*)
+             while :; do
+               # Make sure we don't pick an alternate name that also
+               # overlaps.
+               newobj=lt$counter-$objbase
+               func_arith $counter + 1
+               counter=$func_arith_result
+               case " $oldobjs " in
+               *[\ /]"$newobj "*) ;;
+               *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+               esac
+             done
+             func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+             func_append oldobjs " $gentop/$newobj"
+             ;;
+           *) func_append oldobjs " $obj" ;;
+           esac
+         done
+       fi
+       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+       tool_oldlib=$func_to_tool_file_result
+       eval cmds=\"$old_archive_cmds\"
+
+       func_len " $cmds"
+       len=$func_len_result
+       if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+         cmds=$old_archive_cmds
+       elif test -n "$archiver_list_spec"; then
+         func_verbose "using command file archive linking..."
+         for obj in $oldobjs
+         do
+           func_to_tool_file "$obj"
+           $ECHO "$func_to_tool_file_result"
+         done > $output_objdir/$libname.libcmd
+         func_to_tool_file "$output_objdir/$libname.libcmd"
+         oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+         cmds=$old_archive_cmds
+       else
+         # the command line is too long to link in one step, link in parts
+         func_verbose "using piecewise archive linking..."
+         save_RANLIB=$RANLIB
+         RANLIB=:
+         objlist=
+         concat_cmds=
+         save_oldobjs=$oldobjs
+         oldobjs=
+         # Is there a better way of finding the last object in the list?
+         for obj in $save_oldobjs
+         do
+           last_oldobj=$obj
+         done
+         eval test_cmds=\"$old_archive_cmds\"
+         func_len " $test_cmds"
+         len0=$func_len_result
+         len=$len0
+         for obj in $save_oldobjs
+         do
+           func_len " $obj"
+           func_arith $len + $func_len_result
+           len=$func_arith_result
+           func_append objlist " $obj"
+           if test "$len" -lt "$max_cmd_len"; then
+             :
+           else
+             # the above command should be used before it gets too long
+             oldobjs=$objlist
+             if test "$obj" = "$last_oldobj" ; then
+               RANLIB=$save_RANLIB
+             fi
+             test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+             eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+             objlist=
+             len=$len0
+           fi
+         done
+         RANLIB=$save_RANLIB
+         oldobjs=$objlist
+         if test "X$oldobjs" = "X" ; then
+           eval cmds=\"\$concat_cmds\"
+         else
+           eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+         fi
+       fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+       if eval test -z \"\${$var+set}\"; then
+         relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+       elif eval var_value=\$$var; test -z "$var_value"; then
+         relink_command="$var=; export $var; $relink_command"
+       else
+         func_quote_for_eval "$var_value"
+         relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+       fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+       relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+       for installed in no yes; do
+         if test "$installed" = yes; then
+           if test -z "$install_libdir"; then
+             break
+           fi
+           output="$output_objdir/$outputname"i
+           # Replace all uninstalled libtool libraries with the installed ones
+           newdependency_libs=
+           for deplib in $dependency_libs; do
+             case $deplib in
+             *.la)
+               func_basename "$deplib"
+               name="$func_basename_result"
+               func_resolve_sysroot "$deplib"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+               test -z "$libdir" && \
+                 func_fatal_error "\`$deplib' is not a valid libtool archive"
+               func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             -L*)
+               func_stripname -L '' "$deplib"
+               func_replace_sysroot "$func_stripname_result"
+               func_append newdependency_libs " -L$func_replace_sysroot_result"
+               ;;
+             -R*)
+               func_stripname -R '' "$deplib"
+               func_replace_sysroot "$func_stripname_result"
+               func_append newdependency_libs " -R$func_replace_sysroot_result"
+               ;;
+             *) func_append newdependency_libs " $deplib" ;;
+             esac
+           done
+           dependency_libs="$newdependency_libs"
+           newdlfiles=
+
+           for lib in $dlfiles; do
+             case $lib in
+             *.la)
+               func_basename "$lib"
+               name="$func_basename_result"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+               test -z "$libdir" && \
+                 func_fatal_error "\`$lib' is not a valid libtool archive"
+               func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             *) func_append newdlfiles " $lib" ;;
+             esac
+           done
+           dlfiles="$newdlfiles"
+           newdlprefiles=
+           for lib in $dlprefiles; do
+             case $lib in
+             *.la)
+               # Only pass preopened files to the pseudo-archive (for
+               # eventual linking with the app. that links it) if we
+               # didn't already link the preopened objects directly into
+               # the library:
+               func_basename "$lib"
+               name="$func_basename_result"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+               test -z "$libdir" && \
+                 func_fatal_error "\`$lib' is not a valid libtool archive"
+               func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             esac
+           done
+           dlprefiles="$newdlprefiles"
+         else
+           newdlfiles=
+           for lib in $dlfiles; do
+             case $lib in
+               [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+               *) abs=`pwd`"/$lib" ;;
+             esac
+             func_append newdlfiles " $abs"
+           done
+           dlfiles="$newdlfiles"
+           newdlprefiles=
+           for lib in $dlprefiles; do
+             case $lib in
+               [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+               *) abs=`pwd`"/$lib" ;;
+             esac
+             func_append newdlprefiles " $abs"
+           done
+           dlprefiles="$newdlprefiles"
+         fi
+         $RM $output
+         # place dlname in correct position for cygwin
+         # In fact, it would be nice if we could use this code for all target
+         # systems that can't hard-code library paths into their executables
+         # and that have no shared library path variable independent of PATH,
+         # but it turns out we can't easily determine that from inspecting
+         # libtool variables, so we have to hard-code the OSs to which it
+         # applies here; at the moment, that means platforms that use the PE
+         # object format with DLL files.  See the long comment at the top of
+         # tests/bindir.at for full details.
+         tdlname=$dlname
+         case $host,$output,$installed,$module,$dlname in
+           *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+             # If a -bindir argument was supplied, place the dll there.
+             if test "x$bindir" != x ;
+             then
+               func_relative_path "$install_libdir" "$bindir"
+               tdlname=$func_relative_path_result$dlname
+             else
+               # Otherwise fall back on heuristic.
+               tdlname=../bin/$dlname
+             fi
+             ;;
+         esac
+         $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+         if test "$installed" = no && test "$need_relink" = yes; then
+           $ECHO >> $output "\
+relink_command=\"$relink_command\""
+         fi
+       done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+       odir="$objdir"
+      else
+       odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+       case " $rmdirs " in
+         *" $odir "*) ;;
+         *) func_append rmdirs " $odir" ;;
+       esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+        { test -h "$file"; } >/dev/null 2>&1 ||
+        test -f "$file"; then
+       :
+      elif test -d "$file"; then
+       exit_status=1
+       continue
+      elif test "$rmforce" = yes; then
+       continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+       # Possibly a libtool archive, so verify it.
+       if func_lalib_p "$file"; then
+         func_source $dir/$name
+
+         # Delete the libtool libraries and symlinks.
+         for n in $library_names; do
+           func_append rmfiles " $odir/$n"
+         done
+         test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+         case "$opt_mode" in
+         clean)
+           case " $library_names " in
+           *" $dlname "*) ;;
+           *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+           esac
+           test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+           ;;
+         uninstall)
+           if test -n "$library_names"; then
+             # Do each command in the postuninstall commands.
+             func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+           fi
+
+           if test -n "$old_library"; then
+             # Do each command in the old_postuninstall commands.
+             func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+           fi
+           # FIXME: should reinstall the best remaining shared library.
+           ;;
+         esac
+       fi
+       ;;
+
+      *.lo)
+       # Possibly a libtool object, so verify it.
+       if func_lalib_p "$file"; then
+
+         # Read the .lo file
+         func_source $dir/$name
+
+         # Add PIC object to the list of files to remove.
+         if test -n "$pic_object" &&
+            test "$pic_object" != none; then
+           func_append rmfiles " $dir/$pic_object"
+         fi
+
+         # Add non-PIC object to the list of files to remove.
+         if test -n "$non_pic_object" &&
+            test "$non_pic_object" != none; then
+           func_append rmfiles " $dir/$non_pic_object"
+         fi
+       fi
+       ;;
+
+      *)
+       if test "$opt_mode" = clean ; then
+         noexename=$name
+         case $file in
+         *.exe)
+           func_stripname '' '.exe' "$file"
+           file=$func_stripname_result
+           func_stripname '' '.exe' "$name"
+           noexename=$func_stripname_result
+           # $file with .exe has already been added to rmfiles,
+           # add $file without .exe
+           func_append rmfiles " $file"
+           ;;
+         esac
+         # Do a test to see if this is a libtool program.
+         if func_ltwrapper_p "$file"; then
+           if func_ltwrapper_executable_p "$file"; then
+             func_ltwrapper_scriptname "$file"
+             relink_command=
+             func_source $func_ltwrapper_scriptname_result
+             func_append rmfiles " $func_ltwrapper_scriptname_result"
+           else
+             relink_command=
+             func_source $dir/$noexename
+           fi
+
+           # note $name still contains .exe if it was in $file originally
+           # as does the version of $file that was added into $rmfiles
+           func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+           if test "$fast_install" = yes && test -n "$relink_command"; then
+             func_append rmfiles " $odir/lt-$name"
+           fi
+           if test "X$noexename" != "X$name" ; then
+             func_append rmfiles " $odir/lt-${noexename}.c"
+           fi
+         fi
+       fi
+       ;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+       func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..86a8fc3
--- /dev/null
+++ b/missing
@@ -0,0 +1,331 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2012-01-06.13; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo "#! /bin/sh"
+       echo "# Created by GNU Automake missing as a replacement of"
+       echo "#  $ $@"
+       echo "exit 0"
+       chmod +x $file
+       exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+       case $LASTARG in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f y.tab.h; then
+       echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+       case $LASTARG in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f lex.yy.c; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+       /^@setfilename/{
+         s/.* \([^ ]*\) *$/\1/
+         p
+         q
+       }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
index 4aac1e0..82217d0 100644 (file)
@@ -44,7 +44,7 @@ static DBusConnection *connection;
 static GDBusClient *client;
 static GHashTable *devices;
 static GHashTable *networks;
-static connman_bool_t bluetooth_tethering;
+static bool bluetooth_tethering;
 
 struct bluetooth_pan {
        struct connman_network *network;
@@ -68,32 +68,32 @@ static const char *proxy_get_string(GDBusProxy *proxy, const char *property)
        DBusMessageIter iter;
        const char *str;
 
-       if (g_dbus_proxy_get_property(proxy, property, &iter) == FALSE)
+       if (!g_dbus_proxy_get_property(proxy, property, &iter))
                return NULL;
        dbus_message_iter_get_basic(&iter, &str);
        return str;
 }
 
-static connman_bool_t proxy_get_bool(GDBusProxy *proxy, const char *property)
+static bool proxy_get_bool(GDBusProxy *proxy, const char *property)
 {
        DBusMessageIter iter;
-       connman_bool_t value;
+       dbus_bool_t value;
 
-       if (g_dbus_proxy_get_property(proxy, property, &iter) == FALSE)
-               return FALSE;
+       if (!g_dbus_proxy_get_property(proxy, property, &iter))
+               return false;
        dbus_message_iter_get_basic(&iter, &value);
        return value;
 }
 
-static connman_bool_t proxy_get_nap(GDBusProxy *proxy)
+static bool proxy_get_nap(GDBusProxy *proxy)
 {
         DBusMessageIter iter, value;
 
-       if (proxy == NULL)
-               return FALSE;
+       if (!proxy)
+               return false;
 
-        if (g_dbus_proxy_get_property(proxy, "UUIDs", &iter) == FALSE)
-                return FALSE;
+        if (!g_dbus_proxy_get_property(proxy, "UUIDs", &iter))
+                return false;
 
         dbus_message_iter_recurse(&iter, &value);
         while (dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_STRING) {
@@ -101,11 +101,12 @@ static connman_bool_t proxy_get_nap(GDBusProxy *proxy)
 
                 dbus_message_iter_get_basic(&value, &uuid);
                 if (strcmp(uuid, BLUETOOTH_PAN_NAP) == 0)
-                        return TRUE;
+                        return true;
 
                 dbus_message_iter_next(&value);
         }
-        return FALSE;
+
+        return false;
 }
 
 static int bluetooth_pan_probe(struct connman_network *network)
@@ -117,7 +118,7 @@ static int bluetooth_pan_probe(struct connman_network *network)
 
        g_hash_table_iter_init(&iter, networks);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct bluetooth_pan *pan = value;
 
                if (network == pan->network)
@@ -134,14 +135,14 @@ static void pan_remove_nap(struct bluetooth_pan *pan)
 
        DBG("network %p pan %p", pan->network, pan);
 
-       if (network == NULL)
+       if (!network)
                return;
 
        pan->network = NULL;
        connman_network_set_data(network, NULL);
 
        device = connman_network_get_device(network);
-       if (device != NULL)
+       if (device)
                connman_device_remove_network(device, network);
 
        connman_network_unref(network);
@@ -155,34 +156,34 @@ static void bluetooth_pan_remove(struct connman_network *network)
 
        connman_network_set_data(network, NULL);
 
-       if (pan != NULL)
+       if (pan)
                pan_remove_nap(pan);
 }
 
-static connman_bool_t pan_connect(struct bluetooth_pan *pan,
+static bool pan_connect(struct bluetooth_pan *pan,
                const char *iface)
 {
        int index;
 
-       if (iface == NULL) {
-               if (proxy_get_bool(pan->btnetwork_proxy, "Connected") == FALSE)
-                       return FALSE;
+       if (!iface) {
+               if (!proxy_get_bool(pan->btnetwork_proxy, "Connected"))
+                       return false;
                iface = proxy_get_string(pan->btnetwork_proxy, "Interface");
        }
 
-       if (iface == NULL)
-               return FALSE;
+       if (!iface)
+               return false;
 
        index = connman_inet_ifindex(iface);
        if (index < 0) {
                DBG("network %p invalid index %d", pan->network, index);
-               return FALSE;
+               return false;
        }
 
        connman_network_set_index(pan->network, index);
-       connman_network_set_connected(pan->network, TRUE);
+       connman_network_set_connected(pan->network, true);
 
-       return TRUE;
+       return true;
 }
 
 static void pan_connect_cb(DBusMessage *message, void *user_data)
@@ -193,7 +194,7 @@ static void pan_connect_cb(DBusMessage *message, void *user_data)
        DBusMessageIter iter;
 
        pan = g_hash_table_lookup(networks, path);
-       if (pan == NULL) {
+       if (!pan) {
                DBG("network already removed");
                return;
        }
@@ -210,7 +211,7 @@ static void pan_connect_cb(DBusMessage *message, void *user_data)
                        return;
                }
        } else {
-               if (dbus_message_iter_init(message, &iter) == TRUE &&
+               if (dbus_message_iter_init(message, &iter) &&
                                dbus_message_iter_get_arg_type(&iter) ==
                                DBUS_TYPE_STRING)
                        dbus_message_iter_get_basic(&iter, &iface);
@@ -236,17 +237,17 @@ static int bluetooth_pan_connect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (pan == NULL)
+       if (!pan)
                return -EINVAL;
 
        path = g_dbus_proxy_get_path(pan->btnetwork_proxy);
 
-       if (g_dbus_proxy_method_call(pan->btnetwork_proxy, "Connect",
-                                       pan_connect_append, pan_connect_cb,
-                                       g_strdup(path), g_free) == FALSE)
+       if (!g_dbus_proxy_method_call(pan->btnetwork_proxy, "Connect",
+                       pan_connect_append, pan_connect_cb,
+                       g_strdup(path), g_free))
                return -EIO;
 
-       connman_network_set_associating(pan->network, TRUE);
+       connman_network_set_associating(pan->network, true);
 
        return -EINPROGRESS;
 }
@@ -257,7 +258,7 @@ static void pan_disconnect_cb(DBusMessage *message, void *user_data)
        struct bluetooth_pan *pan;
 
        pan = g_hash_table_lookup(networks, path);
-       if (pan == NULL) {
+       if (!pan) {
                DBG("network already removed");
                return;
        }
@@ -270,7 +271,7 @@ static void pan_disconnect_cb(DBusMessage *message, void *user_data)
 
        DBG("network %p", pan->network);
 
-       connman_network_set_connected(pan->network, FALSE);
+       connman_network_set_connected(pan->network, false);
 }
 
 static int bluetooth_pan_disconnect(struct connman_network *network)
@@ -280,14 +281,13 @@ static int bluetooth_pan_disconnect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (pan == NULL)
+       if (!pan)
                return -EINVAL;
 
        path = g_dbus_proxy_get_path(pan->btnetwork_proxy);
 
-       if (g_dbus_proxy_method_call(pan->btnetwork_proxy, "Disconnect",
-                                       NULL, pan_disconnect_cb,
-                                       g_strdup(path), g_free) == FALSE)
+       if (!g_dbus_proxy_method_call(pan->btnetwork_proxy, "Disconnect",
+                       NULL, pan_disconnect_cb, g_strdup(path), g_free))
                return -EIO;
 
        return -EINPROGRESS;
@@ -297,20 +297,23 @@ static void btnetwork_property_change(GDBusProxy *proxy, const char *name,
                DBusMessageIter *iter, void *user_data)
 {
        struct bluetooth_pan *pan;
-       connman_bool_t proxy_connected, network_connected;
+       dbus_bool_t connected;
+       bool proxy_connected, network_connected;
 
        if (strcmp(name, "Connected") != 0)
                return;
 
        pan = g_hash_table_lookup(networks, g_dbus_proxy_get_path(proxy));
-       if (pan == NULL || pan->network == NULL)
+       if (!pan || !pan->network)
                return;
 
-       dbus_message_iter_get_basic(iter, &proxy_connected);
+       dbus_message_iter_get_basic(iter, &connected);
+       proxy_connected = connected;
+
        network_connected = connman_network_get_connected(pan->network);
 
-       DBG("network %p network connected %d proxy connected %d",
-                       pan->network, network_connected, proxy_connected);
+       DBG("network %p network connected %d proxy connected %d",
+                       pan->network, network_connected, proxy_connected);
 
        if (network_connected != proxy_connected)
                connman_network_set_connected(pan->network, proxy_connected);
@@ -320,7 +323,7 @@ static void pan_create_nap(struct bluetooth_pan *pan)
 {
        struct connman_device *device;
 
-       if (proxy_get_nap(pan->btdevice_proxy) == FALSE) {
+       if (!proxy_get_nap(pan->btdevice_proxy)) {
                pan_remove_nap(pan);
                return;
        }
@@ -328,15 +331,20 @@ static void pan_create_nap(struct bluetooth_pan *pan)
        device = g_hash_table_lookup(devices,
                        proxy_get_string(pan->btdevice_proxy, "Adapter"));
 
-       if (device == NULL || connman_device_get_powered(device) == FALSE)
+       if (!device || !connman_device_get_powered(device))
                return;
 
-       if (pan->network == NULL) {
+       if (!pan->network) {
                const char *address;
                char ident[BLUETOOTH_ADDR_LEN * 2 + 1];
                const char *name, *path;
 
                address = proxy_get_string(pan->btdevice_proxy, "Address");
+               if (!address) {
+                       connman_warn("Bluetooth device address missing");
+                       return;
+               }
+
                address2ident(address, ident);
 
                pan->network = connman_network_create(ident,
@@ -347,7 +355,7 @@ static void pan_create_nap(struct bluetooth_pan *pan)
 
                DBG("network %p %s %s", pan->network, path, name);
 
-               if (pan->network == NULL) {
+               if (!pan->network) {
                        connman_warn("Bluetooth network %s creation failed",
                                        path);
                        return;
@@ -360,7 +368,7 @@ static void pan_create_nap(struct bluetooth_pan *pan)
 
        connman_device_add_network(device, pan->network);
 
-       if (pan_connect(pan, NULL) == TRUE)
+       if (pan_connect(pan, NULL))
                DBG("network %p already connected", pan->network);
 }
 
@@ -368,18 +376,18 @@ static void btdevice_property_change(GDBusProxy *proxy, const char *name,
                DBusMessageIter *iter, void *user_data)
 {
        struct bluetooth_pan *pan;
-       connman_bool_t pan_nap = FALSE;
+       bool pan_nap = false;
 
        if (strcmp(name, "UUIDs") != 0)
                return;
 
        pan = g_hash_table_lookup(networks, g_dbus_proxy_get_path(proxy));
-       if (pan == NULL)
+       if (!pan)
                return;
 
-       if (pan->network != NULL &&
-                       connman_network_get_device(pan->network) != NULL)
-               pan_nap = TRUE;
+       if (pan->network &&
+                       connman_network_get_device(pan->network))
+               pan_nap = true;
 
        DBG("network %p network nap %d proxy nap %d", pan->network, pan_nap,
                        proxy_get_nap(pan->btdevice_proxy));
@@ -394,12 +402,12 @@ static void pan_free(gpointer data)
 {
        struct bluetooth_pan *pan = data;
 
-       if (pan->btnetwork_proxy != NULL) {
+       if (pan->btnetwork_proxy) {
                g_dbus_proxy_unref(pan->btnetwork_proxy);
                pan->btnetwork_proxy = NULL;
        }
 
-       if (pan->btdevice_proxy != NULL) {
+       if (pan->btdevice_proxy) {
                g_dbus_proxy_unref(pan->btdevice_proxy);
                pan->btdevice_proxy = NULL;
        }
@@ -416,7 +424,7 @@ static void pan_create(GDBusProxy *network_proxy)
 
        pan = g_try_new0(struct bluetooth_pan, 1);
 
-       if (pan == NULL) {
+       if (!pan) {
                connman_error("Out of memory creating PAN NAP");
                return;
        }
@@ -427,7 +435,7 @@ static void pan_create(GDBusProxy *network_proxy)
        pan->btdevice_proxy = g_dbus_proxy_new(client, path,
                        "org.bluez.Device1");
 
-       if (pan->btdevice_proxy == NULL) {
+       if (!pan->btdevice_proxy) {
                connman_error("Cannot create BT PAN watcher %s", path);
                g_hash_table_remove(networks, path);
                return;
@@ -453,31 +461,16 @@ static struct connman_network_driver network_driver = {
        .disconnect     = bluetooth_pan_disconnect,
 };
 
-static void device_enable_cb(const DBusError *error, void *user_data)
+static void enable_device(struct connman_device *device, const char *path)
 {
-       char *path = user_data;
-       struct connman_device *device;
        GHashTableIter iter;
        gpointer key, value;
 
-       device = g_hash_table_lookup(devices, path);
-       if (device == NULL) {
-               DBG("device already removed");
-               goto out;
-       }
-
-       if (dbus_error_is_set(error) == TRUE) {
-               connman_warn("Bluetooth device %s not enabled %s",
-                               path, error->message);
-               goto out;
-       }
-
        DBG("device %p %s", device, path);
-
-       connman_device_set_powered(device, TRUE);
+       connman_device_set_powered(device, true);
 
        g_hash_table_iter_init(&iter, networks);
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct bluetooth_pan *pan = value;
 
                if (g_strcmp0(proxy_get_string(pan->btdevice_proxy, "Adapter"),
@@ -487,7 +480,26 @@ static void device_enable_cb(const DBusError *error, void *user_data)
                        pan_create_nap(pan);
                }
        }
+}
 
+static void device_enable_cb(const DBusError *error, void *user_data)
+{
+       char *path = user_data;
+       struct connman_device *device;
+
+       device = g_hash_table_lookup(devices, path);
+       if (!device) {
+               DBG("device already removed");
+               goto out;
+       }
+
+       if (dbus_error_is_set(error)) {
+               connman_warn("Bluetooth device %s not enabled %s",
+                               path, error->message);
+               goto out;
+       }
+
+       enable_device(device, path);
 out:
        g_free(path);
 }
@@ -495,15 +507,15 @@ out:
 static int bluetooth_device_enable(struct connman_device *device)
 {
        GDBusProxy *proxy = connman_device_get_data(device);
-       connman_bool_t device_powered = TRUE;
+       dbus_bool_t device_powered = TRUE;
        const char *path;
 
-       if (proxy == NULL)
+       if (!proxy)
                return 0;
 
        path = g_dbus_proxy_get_path(proxy);
 
-       if (proxy_get_bool(proxy, "Powered") == TRUE) {
+       if (proxy_get_bool(proxy, "Powered")) {
                DBG("already enabled %p %s", device, path);
                return -EALREADY;
        }
@@ -517,37 +529,44 @@ static int bluetooth_device_enable(struct connman_device *device)
        return -EINPROGRESS;
 }
 
+static void disable_device(struct connman_device *device, const char *path)
+{
+       GHashTableIter iter;
+       gpointer key, value;
+
+       DBG("device %p %s", device, path);
+       connman_device_set_powered(device, false);
+
+       g_hash_table_iter_init(&iter, networks);
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               struct bluetooth_pan *pan = value;
+
+               if (pan->network && connman_network_get_device(pan->network)
+                               == device) {
+                       DBG("disable network %p", pan->network);
+                       connman_device_remove_network(device, pan->network);
+               }
+       }
+}
+
 static void device_disable_cb(const DBusError *error, void *user_data)
 {
        char *path = user_data;
        struct connman_device *device;
-       GHashTableIter iter;
-       gpointer key, value;
 
        device = g_hash_table_lookup(devices, path);
-       if (device == NULL) {
+       if (!device) {
                DBG("device already removed");
                goto out;
        }
 
-       if (dbus_error_is_set(error) == TRUE) {
+       if (dbus_error_is_set(error)) {
                connman_warn("Bluetooth device %s not disabled: %s",
                                path, error->message);
                goto out;
        }
 
-       DBG("device %p %s", device, path);
-       connman_device_set_powered(device, FALSE);
-
-       g_hash_table_iter_init(&iter, networks);
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               struct bluetooth_pan *pan = value;
-
-               if (connman_network_get_device(pan->network) == device) {
-                       DBG("disable network %p", pan->network);
-                       connman_device_remove_network(device, pan->network);
-               }
-       }
+       disable_device(device, path);
 
 out:
        g_free(path);
@@ -556,15 +575,15 @@ out:
 static int bluetooth_device_disable(struct connman_device *device)
 {
        GDBusProxy *proxy = connman_device_get_data(device);
-       connman_bool_t device_powered = FALSE;
+       dbus_bool_t device_powered = FALSE;
        const char *path;
 
-       if (proxy == NULL)
+       if (!proxy)
                return 0;
 
        path = g_dbus_proxy_get_path(proxy);
 
-       if (proxy_get_bool(proxy, "Powered") == FALSE) {
+       if (!proxy_get_bool(proxy, "Powered")) {
                DBG("already disabled %p %s", device, path);
                return -EALREADY;
        }
@@ -583,7 +602,7 @@ static void adapter_property_change(GDBusProxy *proxy, const char *name,
 {
        struct connman_device *device;
        const char *path;
-       connman_bool_t adapter_powered, device_powered;
+       bool adapter_powered, device_powered;
 
        if (strcmp(name, "Powered") != 0)
                return;
@@ -598,11 +617,10 @@ static void adapter_property_change(GDBusProxy *proxy, const char *name,
                        device_powered, adapter_powered);
 
        if (device_powered != adapter_powered) {
-               DBG("powering adapter");
-               if (device_powered == TRUE)
-                       bluetooth_device_enable(device);
+               if (adapter_powered)
+                       enable_device(device, path);
                else
-                       bluetooth_device_disable(device);
+                       disable_device(device, path);
        }
 }
 
@@ -612,7 +630,7 @@ static void device_free(gpointer data)
        GDBusProxy *proxy = connman_device_get_data(device);
 
        connman_device_set_data(device, NULL);
-       if (proxy != NULL)
+       if (proxy)
                g_dbus_proxy_unref(proxy);
 
        connman_device_unregister(device);
@@ -622,7 +640,7 @@ static void device_free(gpointer data)
 struct tethering_info {
        struct connman_technology *technology;
        char *bridge;
-       connman_bool_t enable;
+       bool enable;
 };
 
 static void tethering_free(void *user_data)
@@ -641,15 +659,15 @@ static void tethering_create_cb(DBusMessage *message, void *user_data)
                const char *dbus_error = dbus_message_get_error_name(message);
 
                DBG("%s tethering failed: %s",
-                               tethering->enable == TRUE? "enable": "disable",
+                               tethering->enable ? "enable" : "disable",
                                dbus_error);
                return;
        }
 
-       DBG("bridge %s %s", tethering->bridge, tethering->enable == TRUE?
+       DBG("bridge %s %s", tethering->bridge, tethering->enable ?
                        "enabled": "disabled");
 
-       if (tethering->technology != NULL)
+       if (tethering->technology)
                connman_technology_tethering_notify(tethering->technology,
                                tethering->enable);
 }
@@ -660,28 +678,28 @@ static void tethering_append(DBusMessageIter *iter, void *user_data)
        const char *nap = "nap";
 
        dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &nap);
-       if (tethering->enable == TRUE)
+       if (tethering->enable)
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                &tethering->bridge);
 }
 
-static connman_bool_t tethering_create(const char *path,
+static bool tethering_create(const char *path,
                struct connman_technology *technology, const char *bridge,
-               connman_bool_t enabled)
+               bool enabled)
 {
        struct tethering_info *tethering = g_new0(struct tethering_info, 1);
        GDBusProxy *proxy;
        const char *method;
-       connman_bool_t result;
+       bool result;
 
        DBG("path %s bridge %s", path, bridge);
 
-       if (bridge == NULL)
+       if (!bridge)
                return -EINVAL;
 
        proxy = g_dbus_proxy_new(client, path, "org.bluez.NetworkServer1");
-       if (proxy == NULL)
-               return FALSE;
+       if (!proxy)
+               return false;
 
        tethering->technology = technology;
        tethering->bridge = g_strdup(bridge);
@@ -706,17 +724,17 @@ static void device_create(GDBusProxy *proxy)
        const char *path = g_dbus_proxy_get_path(proxy);
        const char *address;
        char ident[BLUETOOTH_ADDR_LEN * 2 + 1];
-       connman_bool_t powered;
+       bool powered;
 
        address = proxy_get_string(proxy, "Address");
-       if (address == NULL)
+       if (!address)
                return;
 
        address2ident(address, ident);
 
        device = connman_device_create("bluetooth",
                        CONNMAN_DEVICE_TYPE_BLUETOOTH);
-       if (device == NULL)
+       if (!device)
                return;
 
        connman_device_set_data(device, g_dbus_proxy_ref(proxy));
@@ -738,8 +756,8 @@ static void device_create(GDBusProxy *proxy)
        powered = proxy_get_bool(proxy, "Powered");
        connman_device_set_powered(device, powered);
 
-       if (proxy_get_nap(proxy) == TRUE && bluetooth_tethering == FALSE)
-               tethering_create(path, NULL, NULL, FALSE);
+       if (proxy_get_nap(proxy) && !bluetooth_tethering)
+               tethering_create(path, NULL, NULL, false);
 }
 
 static void object_added(GDBusProxy *proxy, void *user_data)
@@ -747,6 +765,11 @@ static void object_added(GDBusProxy *proxy, void *user_data)
        const char *interface;
 
        interface = g_dbus_proxy_get_interface(proxy);
+       if (!interface) {
+               connman_warn("Interface or proxy missing when adding "
+                                                       "bluetooth object");
+               return;
+       }
 
        if (strcmp(interface, "org.bluez.Adapter1") == 0) {
                DBG("%s %s", interface, g_dbus_proxy_get_path(proxy));
@@ -766,6 +789,11 @@ static void object_removed(GDBusProxy *proxy, void *user_data)
        const char *interface, *path;
 
        interface = g_dbus_proxy_get_interface(proxy);
+       if (!interface) {
+               connman_warn("Interface or proxy missing when removing "
+                                                       "bluetooth object");
+               return;
+       }
 
        if (strcmp(interface, "org.bluez.Adapter1") == 0) {
                path = g_dbus_proxy_get_path(proxy);
@@ -790,7 +818,7 @@ static int bluetooth_device_probe(struct connman_device *device)
 
        g_hash_table_iter_init(&iter, devices);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct connman_device *known = value;
 
                if (device == known)
@@ -826,7 +854,7 @@ static void bluetooth_tech_remove(struct connman_technology *technology)
 
 static int bluetooth_tech_set_tethering(struct connman_technology *technology,
                const char *identifier, const char *passphrase,
-               const char *bridge, connman_bool_t enabled)
+               const char *bridge, bool enabled)
 {
        GHashTableIter hash_iter;
        gpointer key, value;
@@ -836,18 +864,18 @@ static int bluetooth_tech_set_tethering(struct connman_technology *technology,
 
        g_hash_table_iter_init(&hash_iter, devices);
 
-       while (g_hash_table_iter_next(&hash_iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&hash_iter, &key, &value)) {
                const char *path = key;
                struct connman_device *device = value;
 
                DBG("device %p", device);
 
                if (tethering_create(path, technology, bridge, enabled)
-                               == TRUE)
+                               )
                        i++;
        }
 
-       DBG("%s %d device(s)", enabled == TRUE? "enabled": "disabled", i);
+       DBG("%s %d device(s)", enabled ? "enabled" : "disabled", i);
 
        if (i == 0)
                return -ENODEV;
@@ -866,7 +894,7 @@ static struct connman_technology_driver tech_driver = {
 static int bluetooth_init(void)
 {
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                goto out;
 
        if (connman_technology_driver_register(&tech_driver) < 0) {
@@ -894,7 +922,7 @@ static int bluetooth_init(void)
                        pan_free);
 
        client = g_dbus_client_new(connection, BLUEZ_SERVICE, BLUEZ_PATH);
-       if (client == NULL) {
+       if (!client) {
                connman_warn("Failed to initialize D-Bus client for "
                                BLUEZ_SERVICE);
                goto out;
@@ -906,16 +934,16 @@ static int bluetooth_init(void)
        return 0;
 
 out:
-       if (networks != NULL)
+       if (networks)
                g_hash_table_destroy(networks);
 
-       if (devices != NULL)
+       if (devices)
                g_hash_table_destroy(devices);
 
-       if (client != NULL)
+       if (client)
                g_dbus_client_unref(client);
 
-       if (connection != NULL)
+       if (connection)
                dbus_connection_unref(connection);
 
        return -EIO;
@@ -923,6 +951,12 @@ out:
 
 static void bluetooth_exit(void)
 {
+       /*
+        * We unset the disabling of the Bluetooth device when shutting down
+        * so that non-PAN BT connections are not affected.
+        */
+       device_driver.disable = NULL;
+
        connman_network_driver_unregister(&network_driver);
        g_hash_table_destroy(networks);
 
index 41438f4..2d7a9e0 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -77,7 +77,7 @@ static int pan_probe(struct connman_network *network)
        gpointer key, val;
 
        g_hash_table_iter_init(&iter, bluetooth_networks);
-       while (g_hash_table_iter_next(&iter, &key, &val) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &val)) {
                struct connman_network *known = val;
 
                if (network != known)
@@ -98,29 +98,33 @@ static void pan_remove(struct connman_network *network)
 
 static void connect_reply(DBusPendingCall *call, void *user_data)
 {
-       struct connman_network *network = user_data;
+       char *path = user_data;
+       struct connman_network *network;
        DBusMessage *reply;
        DBusError error;
        const char *interface = NULL;
        int index;
 
+       network = g_hash_table_lookup(bluetooth_networks, path);
+       if (!network)
+               return;
+
        DBG("network %p", network);
 
        reply = dbus_pending_call_steal_reply(call);
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
 
                goto err;
        }
 
-       if (dbus_message_get_args(reply, &error,
-                                       DBUS_TYPE_STRING, &interface,
-                                               DBUS_TYPE_INVALID) == FALSE) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!dbus_message_get_args(reply, &error, DBUS_TYPE_STRING,
+                                       &interface, DBUS_TYPE_INVALID)) {
+               if (dbus_error_is_set(&error)) {
                        connman_error("%s", error.message);
                        dbus_error_free(&error);
                } else
@@ -128,7 +132,7 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
                goto err;
        }
 
-       if (interface == NULL)
+       if (!interface)
                goto err;
 
        DBG("interface %s", interface);
@@ -137,7 +141,7 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
 
        connman_network_set_index(network, index);
 
-       connman_network_set_connected(network, TRUE);
+       connman_network_set_connected(network, true);
 
        dbus_message_unref(reply);
 
@@ -146,7 +150,7 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
        return;
 err:
 
-       connman_network_set_connected(network, FALSE);
+       connman_network_set_connected(network, false);
 
        dbus_message_unref(reply);
 
@@ -162,12 +166,12 @@ static int pan_connect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (path == NULL)
+       if (!path)
                return -EINVAL;
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
                                        BLUEZ_NETWORK_INTERFACE, CONNECT);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_set_auto_start(message, FALSE);
@@ -175,20 +179,21 @@ static int pan_connect(struct connman_network *network)
        dbus_message_append_args(message, DBUS_TYPE_STRING, &uuid,
                                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                       &call, TIMEOUT * 10) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT * 10)) {
                connman_error("Failed to connect service");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       dbus_pending_call_set_notify(call, connect_reply, network, NULL);
+       dbus_pending_call_set_notify(call, connect_reply, g_strdup(path),
+                       g_free);
 
        dbus_message_unref(message);
 
@@ -197,24 +202,29 @@ static int pan_connect(struct connman_network *network)
 
 static void disconnect_reply(DBusPendingCall *call, void *user_data)
 {
-       struct connman_network *network = user_data;
+       char *path = user_data;
+       struct connman_network *network;
        DBusMessage *reply;
        DBusError error;
 
+       network = g_hash_table_lookup(bluetooth_networks, path);
+       if (!network)
+               return;
+
        DBG("network %p", network);
 
        reply = dbus_pending_call_steal_reply(call);
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_get_args(reply, &error, DBUS_TYPE_INVALID) == FALSE) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INVALID)) {
+               if (dbus_error_is_set(&error)) {
                        connman_error("%s", error.message);
                        dbus_error_free(&error);
                } else
@@ -222,7 +232,7 @@ static void disconnect_reply(DBusPendingCall *call, void *user_data)
                goto done;
        }
 
-       connman_network_set_connected(network, FALSE);
+       connman_network_set_connected(network, false);
 
 done:
        dbus_message_unref(reply);
@@ -240,26 +250,26 @@ static int pan_disconnect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (path == NULL)
+       if (!path)
                return -EINVAL;
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
                                        BLUEZ_NETWORK_INTERFACE, DISCONNECT);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_set_auto_start(message, FALSE);
 
        dbus_message_append_args(message, DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                connman_error("Failed to disconnect service");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
@@ -267,9 +277,10 @@ static int pan_disconnect(struct connman_network *network)
 
        connman_network_ref(network);
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 
-       dbus_pending_call_set_notify(call, disconnect_reply, network, NULL);
+       dbus_pending_call_set_notify(call, disconnect_reply, g_strdup(path),
+                       g_free);
 
        dbus_message_unref(message);
 
@@ -297,10 +308,10 @@ static gboolean network_changed(DBusConnection *conn,
        DBG("path %s", path);
 
        network = g_hash_table_lookup(bluetooth_networks, path);
-       if (network == NULL)
+       if (!network)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -308,16 +319,16 @@ static gboolean network_changed(DBusConnection *conn,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Connected") == TRUE) {
+       if (g_str_equal(key, "Connected")) {
                dbus_bool_t connected;
 
                dbus_message_iter_get_basic(&value, &connected);
 
-               if (connected == TRUE)
+               if (connected)
                        return TRUE;
 
-               connman_network_set_associating(network, FALSE);
-               connman_network_set_connected(network, FALSE);
+               connman_network_set_associating(network, false);
+               connman_network_set_connected(network, false);
        }
 
        return TRUE;
@@ -334,7 +345,7 @@ static void extract_properties(DBusMessage *reply, const char **parent,
 {
        DBusMessageIter array, dict;
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                return;
 
        if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
@@ -352,29 +363,29 @@ static void extract_properties(DBusMessage *reply, const char **parent,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Adapter") == TRUE) {
-                       if (parent != NULL)
+               if (g_str_equal(key, "Adapter")) {
+                       if (parent)
                                dbus_message_iter_get_basic(&value, parent);
-               } else if (g_str_equal(key, "Address") == TRUE) {
-                       if (address != NULL)
+               } else if (g_str_equal(key, "Address")) {
+                       if (address)
                                dbus_message_iter_get_basic(&value, address);
-               } else if (g_str_equal(key, "Name") == TRUE) {
-                       if (name != NULL)
+               } else if (g_str_equal(key, "Name")) {
+                       if (name)
                                dbus_message_iter_get_basic(&value, name);
-               } else if (g_str_equal(key, "Alias") == TRUE) {
-                       if (alias != NULL)
+               } else if (g_str_equal(key, "Alias")) {
+                       if (alias)
                                dbus_message_iter_get_basic(&value, alias);
-               } else if (g_str_equal(key, "Powered") == TRUE) {
-                       if (powered != NULL)
+               } else if (g_str_equal(key, "Powered")) {
+                       if (powered)
                                dbus_message_iter_get_basic(&value, powered);
-               } else if (g_str_equal(key, "Discovering") == TRUE) {
-                       if (scanning != NULL)
+               } else if (g_str_equal(key, "Discovering")) {
+                       if (scanning)
                                dbus_message_iter_get_basic(&value, scanning);
-               } else if (g_str_equal(key, "Devices") == TRUE) {
-                       if (networks != NULL)
+               } else if (g_str_equal(key, "Devices")) {
+                       if (networks)
                                memcpy(networks, &value, sizeof(value));
-               } else if (g_str_equal(key, "UUIDs") == TRUE) {
-                       if (uuids != NULL)
+               } else if (g_str_equal(key, "UUIDs")) {
+                       if (uuids)
                                memcpy(uuids, &value, sizeof(value));
                }
 
@@ -421,14 +432,14 @@ static void network_properties_reply(DBusPendingCall *call, void *user_data)
        extract_properties(reply, &parent, &address, NULL, &name,
                                                NULL, NULL, &uuids, NULL);
 
-       if (parent == NULL)
+       if (!parent)
                goto done;
 
        device = g_hash_table_lookup(bluetooth_devices, parent);
-       if (device == NULL)
+       if (!device)
                goto done;
 
-       if (address == NULL)
+       if (!address)
                goto done;
 
        ether_aton_r(address, &addr);
@@ -441,16 +452,16 @@ static void network_properties_reply(DBusPendingCall *call, void *user_data)
                                                addr.ether_addr_octet[4],
                                                addr.ether_addr_octet[5]);
 
-       if (has_pan(&uuids) == FALSE)
+       if (!has_pan(&uuids))
                goto done;
 
        network = connman_device_get_network(device, ident);
-       if (network != NULL)
+       if (network)
                goto done;
 
        network = connman_network_create(ident,
                                        CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN);
-       if (network == NULL)
+       if (!network)
                goto done;
 
        connman_network_set_string(network, "Path", path);
@@ -478,18 +489,18 @@ static void add_network(const char *path)
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
                                BLUEZ_DEVICE_INTERFACE, GET_PROPERTIES);
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_auto_start(message, FALSE);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                connman_error("Failed to get network properties for %s", path);
                goto done;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                goto done;
        }
@@ -526,10 +537,10 @@ static void check_pending_networks(const char *adapter)
        GSList *networks, *list;
 
        networks = g_hash_table_lookup(pending_networks, adapter);
-       if (networks == NULL)
+       if (!networks)
                return;
 
-       for (list = networks; list != NULL; list = list->next) {
+       for (list = networks; list; list = list->next) {
                char *path = list->data;
 
                add_network(path);
@@ -549,10 +560,10 @@ static gboolean adapter_changed(DBusConnection *conn,
        DBG("path %s", path);
 
        device = g_hash_table_lookup(bluetooth_devices, path);
-       if (device == NULL)
+       if (!device)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -560,19 +571,20 @@ static gboolean adapter_changed(DBusConnection *conn,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Powered") == TRUE) {
+       if (g_str_equal(key, "Powered")) {
                dbus_bool_t val;
 
                dbus_message_iter_get_basic(&value, &val);
                connman_device_set_powered(device, val);
-               if (val == TRUE)
+               if (val)
                        check_pending_networks(path);
-       } else if (g_str_equal(key, "Discovering") == TRUE) {
+       } else if (g_str_equal(key, "Discovering")) {
                dbus_bool_t val;
 
                dbus_message_iter_get_basic(&value, &val);
-               connman_device_set_scanning(device, val);
-       } else if (g_str_equal(key, "Devices") == TRUE) {
+               connman_device_set_scanning(device,
+                               CONNMAN_SERVICE_TYPE_BLUETOOTH, val);
+       } else if (g_str_equal(key, "Devices")) {
                check_networks(&value);
        }
 
@@ -589,17 +601,17 @@ static gboolean device_removed(DBusConnection *conn,
 
        DBG("");
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &network_path);
 
        network = g_hash_table_lookup(bluetooth_networks, network_path);
-       if (network == NULL)
+       if (!network)
                return TRUE;
 
        device = connman_network_get_device(network);
-       if (device == NULL)
+       if (!device)
                return TRUE;
 
        g_hash_table_remove(bluetooth_networks, network_path);
@@ -616,7 +628,7 @@ static gboolean device_changed(DBusConnection *conn,
 
        DBG("path %s", path);
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -626,7 +638,7 @@ static gboolean device_changed(DBusConnection *conn,
 
        DBG("key %s", key);
 
-       if (g_str_equal(key, "UUIDs") == TRUE)
+       if (g_str_equal(key, "UUIDs"))
                add_network(path);
 
        return TRUE;
@@ -639,12 +651,12 @@ static void remove_device_networks(struct connman_device *device)
        GSList *key_list = NULL;
        GSList *list;
 
-       if (bluetooth_networks == NULL)
+       if (!bluetooth_networks)
                return;
 
        g_hash_table_iter_init(&iter, bluetooth_networks);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct connman_network *network = value;
 
                if (connman_network_get_device(network) != device)
@@ -653,7 +665,7 @@ static void remove_device_networks(struct connman_device *device)
                key_list = g_slist_prepend(key_list, key);
        }
 
-       for (list = key_list; list != NULL; list = list->next) {
+       for (list = key_list; list; list = list->next) {
                const char *network_path = list->data;
 
                g_hash_table_remove(bluetooth_networks, network_path);
@@ -682,7 +694,7 @@ static void add_pending_networks(const char *adapter, DBusMessageIter *array)
                dbus_message_iter_next(&value);
        }
 
-       if (list == NULL)
+       if (!list)
                return;
 
        g_hash_table_replace(pending_networks, g_strdup(adapter), list);
@@ -703,20 +715,20 @@ static void adapter_properties_reply(DBusPendingCall *call, void *user_data)
 
        reply = dbus_pending_call_steal_reply(call);
 
-       if (path == NULL)
+       if (!path)
                goto done;
 
        extract_properties(reply, NULL, &address, &name, NULL,
                                        &powered, &scanning, NULL, &networks);
 
-       if (address == NULL)
+       if (!address)
                goto done;
 
        if (g_strcmp0(address, "00:00:00:00:00:00") == 0)
                goto done;
 
        device = g_hash_table_lookup(bluetooth_devices, path);
-       if (device != NULL)
+       if (device)
                goto update;
 
        ether_aton_r(address, &addr);
@@ -731,7 +743,7 @@ static void adapter_properties_reply(DBusPendingCall *call, void *user_data)
 
        device = connman_device_create("bluetooth_legacy",
                        CONNMAN_DEVICE_TYPE_BLUETOOTH);
-       if (device == NULL)
+       if (!device)
                goto done;
 
        g_hash_table_insert(bluetooth_devices, g_strdup(path), device);
@@ -752,9 +764,10 @@ update:
        connman_device_set_string(device, "Path", path);
 
        connman_device_set_powered(device, powered);
-       connman_device_set_scanning(device, scanning);
+       connman_device_set_scanning(device,
+                       CONNMAN_SERVICE_TYPE_BLUETOOTH, scanning);
 
-       if (powered == FALSE) {
+       if (!powered) {
                remove_device_networks(device);
                add_pending_networks(path, &networks);
        } else
@@ -775,18 +788,17 @@ static void add_adapter(DBusConnection *conn, const char *path)
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
                                BLUEZ_ADAPTER_INTERFACE, GET_PROPERTIES);
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_auto_start(message, FALSE);
 
-       if (dbus_connection_send_with_reply(conn, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(conn, message, &call, TIMEOUT)) {
                connman_error("Failed to get adapter properties for %s", path);
                goto done;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                goto done;
        }
@@ -841,17 +853,16 @@ static void list_adapters_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_get_args(reply, &error,
-                               DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH,
-                                               &adapters, &num_adapters,
-                                               DBUS_TYPE_INVALID) == FALSE) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!dbus_message_get_args(reply, &error, DBUS_TYPE_ARRAY,
+                       DBUS_TYPE_OBJECT_PATH, &adapters,
+                       &num_adapters, DBUS_TYPE_INVALID)) {
+               if (dbus_error_is_set(&error)) {
                        connman_error("%s", error.message);
                        dbus_error_free(&error);
                } else
@@ -890,7 +901,7 @@ static void remove_network(gpointer data)
        DBG("network %p", network);
 
        device = connman_network_get_device(network);
-       if (device != NULL)
+       if (device)
                connman_device_remove_network(device, network);
 
        connman_network_unref(network);
@@ -921,18 +932,17 @@ static void bluetooth_connect(DBusConnection *conn, void *user_data)
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, "/",
                                BLUEZ_MANAGER_INTERFACE, LIST_ADAPTERS);
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_auto_start(message, FALSE);
 
-       if (dbus_connection_send_with_reply(conn, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(conn, message, &call, TIMEOUT)) {
                connman_error("Failed to get Bluetooth adapters");
                goto done;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                goto done;
        }
@@ -947,7 +957,7 @@ static void bluetooth_disconnect(DBusConnection *conn, void *user_data)
 {
        DBG("connection %p", conn);
 
-       if (bluetooth_devices == NULL)
+       if (!bluetooth_devices)
                return;
 
        g_hash_table_destroy(bluetooth_networks);
@@ -965,12 +975,12 @@ static int bluetooth_probe(struct connman_device *device)
 
        DBG("device %p", device);
 
-       if (bluetooth_devices == NULL)
+       if (!bluetooth_devices)
                return -ENOTSUP;
 
        g_hash_table_iter_init(&iter, bluetooth_devices);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct connman_device *device_pan = value;
 
                if (device == device_pan)
@@ -996,7 +1006,7 @@ static void powered_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                dbus_message_unref(reply);
@@ -1019,12 +1029,12 @@ static int change_powered(DBusConnection *conn, const char *path,
 
        DBG("");
 
-       if (path == NULL)
+       if (!path)
                return -EINVAL;
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
                                        BLUEZ_ADAPTER_INTERFACE, SET_PROPERTY);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_set_auto_start(message, FALSE);
@@ -1033,14 +1043,13 @@ static int change_powered(DBusConnection *conn, const char *path,
        connman_dbus_property_append_basic(&iter, "Powered",
                                                DBUS_TYPE_BOOLEAN, &powered);
 
-       if (dbus_connection_send_with_reply(conn, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(conn, message, &call, TIMEOUT)) {
                connman_error("Failed to change Powered property");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
@@ -1102,7 +1111,7 @@ static void server_register_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                dbus_message_unref(reply);
@@ -1113,7 +1122,7 @@ static void server_register_reply(DBusPendingCall *call, void *user_data)
        dbus_message_unref(reply);
        dbus_pending_call_unref(call);
 
-       connman_technology_tethering_notify(technology, TRUE);
+       connman_technology_tethering_notify(technology, true);
 }
 
 static void server_unregister_reply(DBusPendingCall *call, void *user_data)
@@ -1128,7 +1137,7 @@ static void server_unregister_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                dbus_message_unref(reply);
@@ -1139,13 +1148,13 @@ static void server_unregister_reply(DBusPendingCall *call, void *user_data)
        dbus_message_unref(reply);
        dbus_pending_call_unref(call);
 
-       connman_technology_tethering_notify(technology, FALSE);
+       connman_technology_tethering_notify(technology, false);
 }
 
 
 static void server_register(const char *path, const char *uuid,
                                struct connman_technology *technology,
-                               const char *bridge, connman_bool_t enabled)
+                               const char *bridge, bool enabled)
 {
        DBusMessage *message;
        DBusPendingCall *call;
@@ -1157,7 +1166,7 @@ static void server_register(const char *path, const char *uuid,
 
        message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
                                        BLUEZ_NETWORK_SERVER, command);
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_auto_start(message, FALSE);
@@ -1165,24 +1174,24 @@ static void server_register(const char *path, const char *uuid,
        dbus_message_append_args(message, DBUS_TYPE_STRING, &uuid,
                                                        DBUS_TYPE_INVALID);
 
-       if (enabled == TRUE)
+       if (enabled)
                dbus_message_append_args(message, DBUS_TYPE_STRING, &bridge,
                                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                connman_error("Failed to enable PAN server");
                dbus_message_unref(message);
                return;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return;
        }
 
-       if (enabled == TRUE)
+       if (enabled)
                dbus_pending_call_set_notify(call, server_register_reply,
                                                technology, NULL);
        else
@@ -1207,7 +1216,7 @@ static void enable_nap(gpointer key, gpointer value, gpointer user_data)
 
        path = connman_device_get_string(device, "Path");
 
-       server_register(path, "nap", info->technology, info->bridge, TRUE);
+       server_register(path, "nap", info->technology, info->bridge, true);
 }
 
 static void disable_nap(gpointer key, gpointer value, gpointer user_data)
@@ -1220,12 +1229,12 @@ static void disable_nap(gpointer key, gpointer value, gpointer user_data)
 
        path = connman_device_get_string(device, "Path");
 
-       server_register(path, "nap", info->technology, info->bridge, FALSE);
+       server_register(path, "nap", info->technology, info->bridge, false);
 }
 
 static int tech_set_tethering(struct connman_technology *technology,
                                const char *identifier, const char *passphrase,
-                               const char *bridge, connman_bool_t enabled)
+                               const char *bridge, bool enabled)
 {
        struct tethering_info info = {
                .technology     = technology,
@@ -1234,6 +1243,9 @@ static int tech_set_tethering(struct connman_technology *technology,
 
        DBG("bridge %s", bridge);
 
+       if (!bluetooth_devices)
+               return -ENOTCONN;
+
        if (enabled)
                g_hash_table_foreach(bluetooth_devices, enable_nap, &info);
        else
@@ -1264,7 +1276,7 @@ static int bluetooth_init(void)
        int err;
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        watch = g_dbus_add_service_watch(connection, BLUEZ_SERVICE,
@@ -1352,6 +1364,12 @@ static void bluetooth_exit(void)
        g_dbus_remove_watch(connection, device_watch);
        g_dbus_remove_watch(connection, network_watch);
 
+       /*
+        * We unset the disabling of the Bluetooth device when shutting down
+        * so that non-PAN BT connections are not affected.
+        */
+       bluetooth_driver.disable = NULL;
+
        bluetooth_disconnect(connection, NULL);
 
        connman_technology_driver_unregister(&tech_driver);
index 6de8680..b72c69e 100644 (file)
@@ -61,7 +61,7 @@ struct dundee_data {
        struct connman_device *device;
        struct connman_network *network;
 
-       connman_bool_t active;
+       bool active;
 
        int index;
 
@@ -81,7 +81,7 @@ static char *get_ident(const char *path)
                return NULL;
 
        pos = strrchr(path, '/');
-       if (pos == NULL)
+       if (!pos)
                return NULL;
 
        return pos + 1;
@@ -97,7 +97,7 @@ static int create_device(struct dundee_data *info)
 
        ident = g_strdup(get_ident(info->path));
        device = connman_device_create("dundee", CONNMAN_DEVICE_TYPE_BLUETOOTH);
-       if (device == NULL) {
+       if (!device) {
                err = -ENOMEM;
                goto out;
        }
@@ -126,12 +126,12 @@ out:
 
 static void destroy_device(struct dundee_data *info)
 {
-       connman_device_set_powered(info->device, FALSE);
+       connman_device_set_powered(info->device, false);
 
-       if (info->call != NULL)
+       if (info->call)
                dbus_pending_call_cancel(info->call);
 
-       if (info->network != NULL) {
+       if (info->network) {
                connman_device_remove_network(info->device, info->network);
                connman_network_unref(info->network);
                info->network = NULL;
@@ -147,7 +147,7 @@ static void device_destroy(gpointer data)
 {
        struct dundee_data *info = data;
 
-       if (info->device != NULL)
+       if (info->device)
                destroy_device(info);
 
        g_free(info->path);
@@ -166,7 +166,7 @@ static int create_network(struct dundee_data *info)
 
        network = connman_network_create(info->path,
                                CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN);
-       if (network == NULL)
+       if (!network)
                return -ENOMEM;
 
        DBG("network %p", network);
@@ -201,7 +201,7 @@ static void set_connected(struct dundee_data *info)
        connman_inet_ifup(info->index);
 
        service = connman_service_lookup_from_network(info->network);
-       if (service == NULL)
+       if (!service)
                return;
 
        connman_service_create_ip4config(service, info->index);
@@ -211,14 +211,14 @@ static void set_connected(struct dundee_data *info)
        connman_network_set_ipaddress(info->network, info->address);
        connman_network_set_nameservers(info->network, info->nameservers);
 
-       connman_network_set_connected(info->network, TRUE);
+       connman_network_set_connected(info->network, true);
 }
 
 static void set_disconnected(struct dundee_data *info)
 {
        DBG("%s", info->path);
 
-       connman_network_set_connected(info->network, FALSE);
+       connman_network_set_connected(info->network, false);
        connman_inet_ifdown(info->index);
 }
 
@@ -260,21 +260,21 @@ static int set_property(struct dundee_data *info,
 
        message = dbus_message_new_method_call(DUNDEE_SERVICE, info->path,
                                        DUNDEE_DEVICE_INTERFACE, SET_PROPERTY);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
        connman_dbus_property_append_basic(&iter, property, type, value);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                       &info->call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &info->call, TIMEOUT)) {
                connman_error("Failed to change property: %s %s",
                                info->path, property);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (info->call == NULL) {
+       if (!info->call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
@@ -359,12 +359,12 @@ static int dundee_probe(struct connman_device *device)
 
        DBG("device %p", device);
 
-       if (dundee_devices == NULL)
+       if (!dundee_devices)
                return -ENOTSUP;
 
        g_hash_table_iter_init(&iter, dundee_devices);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct dundee_data *info = value;
 
                if (device == info->device)
@@ -415,7 +415,7 @@ static char *extract_nameservers(DBusMessageIter *array)
 
                dbus_message_iter_get_basic(&entry, &nameserver);
 
-               if (nameservers == NULL) {
+               if (!nameservers) {
                        nameservers = g_strdup(nameserver);
                } else {
                        tmp = nameservers;
@@ -453,7 +453,7 @@ static void extract_settings(DBusMessageIter *array,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Interface") == TRUE) {
+               if (g_str_equal(key, "Interface")) {
                        dbus_message_iter_get_basic(&value, &interface);
 
                        DBG("Interface %s", interface);
@@ -464,17 +464,17 @@ static void extract_settings(DBusMessageIter *array,
 
                        if (index < 0)
                                break;
-               } else if (g_str_equal(key, "Address") == TRUE) {
+               } else if (g_str_equal(key, "Address")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        address = g_strdup(val);
 
                        DBG("Address %s", address);
-               } else if (g_str_equal(key, "DomainNameServers") == TRUE) {
+               } else if (g_str_equal(key, "DomainNameServers")) {
                        nameservers = extract_nameservers(&value);
 
                        DBG("Nameservers %s", nameservers);
-               } else if (g_str_equal(key, "Gateway") == TRUE) {
+               } else if (g_str_equal(key, "Gateway")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        gateway = g_strdup(val);
@@ -489,7 +489,7 @@ static void extract_settings(DBusMessageIter *array,
                goto out;
 
        info->address = connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV4);
-       if (info->address == NULL)
+       if (!info->address)
                goto out;
 
        info->index = index;
@@ -516,16 +516,16 @@ static gboolean device_changed(DBusConnection *conn,
        const char *signature = DBUS_TYPE_STRING_AS_STRING
                DBUS_TYPE_VARIANT_AS_STRING;
 
-       if (dbus_message_has_signature(message, signature) == FALSE) {
+       if (!dbus_message_has_signature(message, signature)) {
                connman_error("dundee signature does not match");
                return TRUE;
        }
 
        info = g_hash_table_lookup(dundee_devices, path);
-       if (info == NULL)
+       if (!info)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -538,20 +538,23 @@ static gboolean device_changed(DBusConnection *conn,
         * Active. Settings will always be send before Active = True.
         * That means we don't have to order here.
         */
-       if (g_str_equal(key, "Active") == TRUE) {
-               dbus_message_iter_get_basic(&value, &info->active);
+       if (g_str_equal(key, "Active")) {
+               dbus_bool_t active;
+
+               dbus_message_iter_get_basic(&value, &active);
+               info->active = active;
 
                DBG("%s Active %d", info->path, info->active);
 
-               if (info->active == TRUE)
+               if (info->active)
                        set_connected(info);
                else
                        set_disconnected(info);
-       } else if (g_str_equal(key, "Settings") == TRUE) {
+       } else if (g_str_equal(key, "Settings")) {
                DBG("%s Settings", info->path);
 
                extract_settings(&value, info);
-       } else if (g_str_equal(key, "Name") == TRUE) {
+       } else if (g_str_equal(key, "Name")) {
                char *name;
 
                dbus_message_iter_get_basic(&value, &name);
@@ -574,11 +577,11 @@ static void add_device(const char *path, DBusMessageIter *properties)
        int err;
 
        info = g_hash_table_lookup(dundee_devices, path);
-       if (info != NULL)
+       if (info)
                return;
 
        info = g_try_new0(struct dundee_data, 1);
-       if (info == NULL)
+       if (!info)
                return;
 
        info->path = g_strdup(path);
@@ -594,15 +597,18 @@ static void add_device(const char *path, DBusMessageIter *properties)
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Active") == TRUE) {
-                       dbus_message_iter_get_basic(&value, &info->active);
+               if (g_str_equal(key, "Active")) {
+                       dbus_bool_t active;
+
+                       dbus_message_iter_get_basic(&value, &active);
+                       info->active = active;
 
                        DBG("%s Active %d", info->path, info->active);
-               } else if (g_str_equal(key, "Settings") == TRUE) {
+               } else if (g_str_equal(key, "Settings")) {
                        DBG("%s Settings", info->path);
 
                        extract_settings(&value, info);
-               } else if (g_str_equal(key, "Name") == TRUE) {
+               } else if (g_str_equal(key, "Name")) {
                        char *name;
 
                        dbus_message_iter_get_basic(&value, &name);
@@ -627,7 +633,7 @@ static void add_device(const char *path, DBusMessageIter *properties)
                goto out;
        }
 
-       if (info->active == TRUE)
+       if (info->active)
                set_connected(info);
 
        return;
@@ -648,14 +654,14 @@ static gboolean device_added(DBusConnection *conn, DBusMessage *message,
                DBUS_TYPE_VARIANT_AS_STRING
                DBUS_DICT_ENTRY_END_CHAR_AS_STRING;
 
-       if (dbus_message_has_signature(message, signature) == FALSE) {
+       if (!dbus_message_has_signature(message, signature)) {
                connman_error("dundee signature does not match");
                return TRUE;
        }
 
        DBG("");
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &path);
@@ -681,7 +687,7 @@ static gboolean device_removed(DBusConnection *conn, DBusMessage *message,
        const char *path;
        const char *signature = DBUS_TYPE_OBJECT_PATH_AS_STRING;
 
-       if (dbus_message_has_signature(message, signature) == FALSE) {
+       if (!dbus_message_has_signature(message, signature)) {
                connman_error("dundee signature does not match");
                return TRUE;
        }
@@ -711,20 +717,20 @@ static void manager_get_devices_reply(DBusPendingCall *call, void *user_data)
 
        reply = dbus_pending_call_steal_reply(call);
 
-       if (dbus_message_has_signature(reply, signature) == FALSE) {
+       if (!dbus_message_has_signature(reply, signature)) {
                connman_error("dundee signature does not match");
                goto done;
        }
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                goto done;
 
        dbus_message_iter_recurse(&array, &dict);
@@ -759,17 +765,17 @@ static int manager_get_devices(void)
 
        message = dbus_message_new_method_call(DUNDEE_SERVICE, "/",
                                        DUNDEE_MANAGER_INTERFACE, GET_DEVICES);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                connman_error("Failed to call GetDevices()");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
@@ -811,7 +817,7 @@ static int dundee_init(void)
        int err;
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        watch = g_dbus_add_service_watch(connection, DUNDEE_SERVICE,
index bafc75d..b8e52ce 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -41,7 +41,7 @@
 #include <connman/log.h>
 #include <connman/setting.h>
 
-static connman_bool_t eth_tethering = FALSE;
+static bool eth_tethering = false;
 
 struct ethernet_data {
        int index;
@@ -50,43 +50,43 @@ struct ethernet_data {
        struct connman_network *network;
 };
 
-static int cable_probe(struct connman_network *network)
+static int eth_network_probe(struct connman_network *network)
 {
        DBG("network %p", network);
 
        return 0;
 }
 
-static void cable_remove(struct connman_network *network)
+static void eth_network_remove(struct connman_network *network)
 {
        DBG("network %p", network);
 }
 
-static int cable_connect(struct connman_network *network)
+static int eth_network_connect(struct connman_network *network)
 {
        DBG("network %p", network);
 
-       connman_network_set_connected(network, TRUE);
+       connman_network_set_connected(network, true);
 
        return 0;
 }
 
-static int cable_disconnect(struct connman_network *network)
+static int eth_network_disconnect(struct connman_network *network)
 {
        DBG("network %p", network);
 
-       connman_network_set_connected(network, FALSE);
+       connman_network_set_connected(network, false);
 
        return 0;
 }
 
-static struct connman_network_driver cable_driver = {
+static struct connman_network_driver eth_network_driver = {
        .name           = "cable",
        .type           = CONNMAN_NETWORK_TYPE_ETHERNET,
-       .probe          = cable_probe,
-       .remove         = cable_remove,
-       .connect        = cable_connect,
-       .disconnect     = cable_disconnect,
+       .probe          = eth_network_probe,
+       .remove         = eth_network_remove,
+       .connect        = eth_network_connect,
+       .disconnect     = eth_network_disconnect,
 };
 
 static void add_network(struct connman_device *device,
@@ -97,7 +97,7 @@ static void add_network(struct connman_device *device,
 
        network = connman_network_create("carrier",
                                        CONNMAN_NETWORK_TYPE_ETHERNET);
-       if (network == NULL)
+       if (!network)
                return;
 
        index = connman_device_get_index(device);
@@ -110,7 +110,7 @@ static void add_network(struct connman_device *device,
                return;
        }
 
-       if (eth_tethering == FALSE)
+       if (!eth_tethering)
                /*
                 * Prevent service from starting the reconnect
                 * procedure as we do not want the DHCP client
@@ -124,7 +124,7 @@ static void add_network(struct connman_device *device,
 static void remove_network(struct connman_device *device,
                                struct ethernet_data *ethernet)
 {
-       if (ethernet->network == NULL)
+       if (!ethernet->network)
                return;
 
        connman_device_remove_network(device, ethernet->network);
@@ -143,10 +143,10 @@ static void ethernet_newlink(unsigned flags, unsigned change, void *user_data)
        if ((ethernet->flags & IFF_UP) != (flags & IFF_UP)) {
                if (flags & IFF_UP) {
                        DBG("power on");
-                       connman_device_set_powered(device, TRUE);
+                       connman_device_set_powered(device, true);
                } else {
                        DBG("power off");
-                       connman_device_set_powered(device, FALSE);
+                       connman_device_set_powered(device, false);
                }
        }
 
@@ -163,14 +163,14 @@ static void ethernet_newlink(unsigned flags, unsigned change, void *user_data)
        ethernet->flags = flags;
 }
 
-static int ethernet_probe(struct connman_device *device)
+static int eth_dev_probe(struct connman_device *device)
 {
        struct ethernet_data *ethernet;
 
        DBG("device %p", device);
 
        ethernet = g_try_new0(struct ethernet_data, 1);
-       if (ethernet == NULL)
+       if (!ethernet)
                return -ENOMEM;
 
        connman_device_set_data(device, ethernet);
@@ -184,7 +184,7 @@ static int ethernet_probe(struct connman_device *device)
        return 0;
 }
 
-static void ethernet_remove(struct connman_device *device)
+static void eth_dev_remove(struct connman_device *device)
 {
        struct ethernet_data *ethernet = connman_device_get_data(device);
 
@@ -199,7 +199,7 @@ static void ethernet_remove(struct connman_device *device)
        g_free(ethernet);
 }
 
-static int ethernet_enable(struct connman_device *device)
+static int eth_dev_enable(struct connman_device *device)
 {
        struct ethernet_data *ethernet = connman_device_get_data(device);
 
@@ -208,7 +208,7 @@ static int ethernet_enable(struct connman_device *device)
        return connman_inet_ifup(ethernet->index);
 }
 
-static int ethernet_disable(struct connman_device *device)
+static int eth_dev_disable(struct connman_device *device)
 {
        struct ethernet_data *ethernet = connman_device_get_data(device);
 
@@ -217,133 +217,40 @@ static int ethernet_disable(struct connman_device *device)
        return connman_inet_ifdown(ethernet->index);
 }
 
-static struct connman_device_driver ethernet_driver = {
+static struct connman_device_driver eth_dev_driver = {
        .name           = "ethernet",
        .type           = CONNMAN_DEVICE_TYPE_ETHERNET,
-       .probe          = ethernet_probe,
-       .remove         = ethernet_remove,
-       .enable         = ethernet_enable,
-       .disable        = ethernet_disable,
+       .probe          = eth_dev_probe,
+       .remove         = eth_dev_remove,
+       .enable         = eth_dev_enable,
+       .disable        = eth_dev_disable,
 };
 
-static GList *cdc_interface_list = NULL;
-
-static void tech_add_interface(struct connman_technology *technology,
-                       int index, const char *name, const char *ident)
-{
-       DBG("index %d name %s ident %s", index, name, ident);
-
-       if (g_list_find(cdc_interface_list,
-                       GINT_TO_POINTER((int) index)) != NULL)
-               return;
-
-       cdc_interface_list = g_list_prepend(cdc_interface_list,
-                                       (GINT_TO_POINTER((int) index)));
-}
-
-static void tech_remove_interface(struct connman_technology *technology,
-                                                               int index)
-{
-       DBG("index %d", index);
-
-       cdc_interface_list = g_list_remove(cdc_interface_list,
-                                       GINT_TO_POINTER((int) index));
-}
-
-static void enable_tethering(struct connman_technology *technology,
-                                               const char *bridge)
-{
-       GList *list;
-
-       for (list = cdc_interface_list; list; list = list->next) {
-               int index = GPOINTER_TO_INT(list->data);
-
-               connman_technology_tethering_notify(technology, TRUE);
-
-               connman_inet_ifup(index);
-
-               connman_inet_add_to_bridge(index, bridge);
-       }
-}
-
-static void disable_tethering(struct connman_technology *technology,
-                                               const char *bridge)
-{
-       GList *list;
-
-       for (list = cdc_interface_list; list; list = list->next) {
-               int index = GPOINTER_TO_INT(list->data);
-
-               connman_inet_remove_from_bridge(index, bridge);
-
-               connman_inet_ifdown(index);
-
-               connman_technology_tethering_notify(technology, FALSE);
-       }
-}
-
-static int tech_set_tethering(struct connman_technology *technology,
-                               const char *identifier, const char *passphrase,
-                               const char *bridge, connman_bool_t enabled)
-{
-       DBG("bridge %s enabled %d", bridge, enabled);
-
-       if (enabled)
-               enable_tethering(technology, bridge);
-       else
-               disable_tethering(technology, bridge);
-
-       return 0;
-}
-
-static int tech_probe(struct connman_technology *technology)
+static int eth_tech_probe(struct connman_technology *technology)
 {
        return 0;
 }
 
-static void tech_remove(struct connman_technology *technology)
-{
-       g_list_free(cdc_interface_list);
-
-       cdc_interface_list = NULL;
-}
-
-static struct connman_technology_driver tech_driver = {
-       .name                   = "cdc_ethernet",
-       .type                   = CONNMAN_SERVICE_TYPE_GADGET,
-       .probe                  = tech_probe,
-       .remove                 = tech_remove,
-       .add_interface          = tech_add_interface,
-       .remove_interface       = tech_remove_interface,
-       .set_tethering          = tech_set_tethering,
-};
-
-static int eth_probe(struct connman_technology *technology)
-{
-       return 0;
-}
-
-static void eth_remove(struct connman_technology *technology)
+static void eth_tech_remove(struct connman_technology *technology)
 {
        DBG("");
 }
 
 static GList *eth_interface_list = NULL;
 
-static void eth_add_interface(struct connman_technology *technology,
+static void eth_tech_add_interface(struct connman_technology *technology,
                        int index, const char *name, const char *ident)
 {
        DBG("index %d name %s ident %s", index, name, ident);
 
-       if (g_list_find(eth_interface_list,
-                       GINT_TO_POINTER((int) index)) != NULL)
+       if (g_list_find(eth_interface_list, GINT_TO_POINTER((int)index)))
                return;
 
        eth_interface_list = g_list_prepend(eth_interface_list,
                                        (GINT_TO_POINTER((int) index)));
 }
 
-static void eth_remove_interface(struct connman_technology *technology,
+static void eth_tech_remove_interface(struct connman_technology *technology,
                                                                int index)
 {
        DBG("index %d", index);
@@ -352,30 +259,34 @@ static void eth_remove_interface(struct connman_technology *technology,
                                        GINT_TO_POINTER((int) index));
 }
 
-static void eth_enable_tethering(struct connman_technology *technology,
+static void eth_tech_enable_tethering(struct connman_technology *technology,
                                                const char *bridge)
 {
        GList *list;
+       struct ethernet_data *ethernet;
 
        for (list = eth_interface_list; list; list = list->next) {
                int index = GPOINTER_TO_INT(list->data);
                struct connman_device *device =
                        connman_device_find_by_index(index);
 
-               if (device != NULL)
-                       connman_device_disconnect_service(device);
+               if (device) {
+                       ethernet = connman_device_get_data(device);
+                       if (ethernet)
+                               remove_network(device, ethernet);
+               }
 
-               connman_technology_tethering_notify(technology, TRUE);
+               connman_technology_tethering_notify(technology, true);
 
                connman_inet_ifup(index);
 
                connman_inet_add_to_bridge(index, bridge);
 
-               eth_tethering = TRUE;
+               eth_tethering = true;
        }
 }
 
-static void eth_disable_tethering(struct connman_technology *technology,
+static void eth_tech_disable_tethering(struct connman_technology *technology,
                                                const char *bridge)
 {
        GList *list;
@@ -387,67 +298,58 @@ static void eth_disable_tethering(struct connman_technology *technology,
 
                connman_inet_remove_from_bridge(index, bridge);
 
-               connman_inet_ifdown(index);
+               connman_technology_tethering_notify(technology, false);
 
-               connman_technology_tethering_notify(technology, FALSE);
-
-               if (device != NULL)
+               if (device)
                        connman_device_reconnect_service(device);
 
-               eth_tethering = FALSE;
+               eth_tethering = false;
        }
 }
 
-static int eth_set_tethering(struct connman_technology *technology,
+static int eth_tech_set_tethering(struct connman_technology *technology,
                                const char *identifier, const char *passphrase,
-                               const char *bridge, connman_bool_t enabled)
+                               const char *bridge, bool enabled)
 {
-       if (connman_technology_is_tethering_allowed(
-                               CONNMAN_SERVICE_TYPE_ETHERNET) == FALSE)
+       if (!connman_technology_is_tethering_allowed(
+                       CONNMAN_SERVICE_TYPE_ETHERNET))
                return 0;
 
        DBG("bridge %s enabled %d", bridge, enabled);
 
        if (enabled)
-               eth_enable_tethering(technology, bridge);
+               eth_tech_enable_tethering(technology, bridge);
        else
-               eth_disable_tethering(technology, bridge);
+               eth_tech_disable_tethering(technology, bridge);
 
        return 0;
 }
 
-static struct connman_technology_driver eth_driver = {
+static struct connman_technology_driver eth_tech_driver = {
        .name                   = "ethernet",
        .type                   = CONNMAN_SERVICE_TYPE_ETHERNET,
-       .probe                  = eth_probe,
-       .remove                 = eth_remove,
-       .add_interface          = eth_add_interface,
-       .remove_interface       = eth_remove_interface,
-       .set_tethering          = eth_set_tethering,
+       .probe                  = eth_tech_probe,
+       .remove                 = eth_tech_remove,
+       .add_interface          = eth_tech_add_interface,
+       .remove_interface       = eth_tech_remove_interface,
+       .set_tethering          = eth_tech_set_tethering,
 };
 
 static int ethernet_init(void)
 {
        int err;
 
-       err = connman_technology_driver_register(&eth_driver);
+       err = connman_technology_driver_register(&eth_tech_driver);
        if (err < 0)
                return err;
 
-       err = connman_network_driver_register(&cable_driver);
+       err = connman_network_driver_register(&eth_network_driver);
        if (err < 0)
                return err;
 
-       err = connman_device_driver_register(&ethernet_driver);
-       if (err < 0) {
-               connman_network_driver_unregister(&cable_driver);
-               return err;
-       }
-
-       err = connman_technology_driver_register(&tech_driver);
+       err = connman_device_driver_register(&eth_dev_driver);
        if (err < 0) {
-               connman_device_driver_unregister(&ethernet_driver);
-               connman_network_driver_unregister(&cable_driver);
+               connman_network_driver_unregister(&eth_network_driver);
                return err;
        }
 
@@ -456,13 +358,11 @@ static int ethernet_init(void)
 
 static void ethernet_exit(void)
 {
-       connman_technology_driver_unregister(&eth_driver);
-
-       connman_technology_driver_unregister(&tech_driver);
+       connman_technology_driver_unregister(&eth_tech_driver);
 
-       connman_network_driver_unregister(&cable_driver);
+       connman_network_driver_unregister(&eth_network_driver);
 
-       connman_device_driver_unregister(&ethernet_driver);
+       connman_device_driver_unregister(&eth_dev_driver);
 }
 
 CONNMAN_PLUGIN_DEFINE(ethernet, "Ethernet interface plugin", VERSION,
diff --git a/plugins/gadget.c b/plugins/gadget.c
new file mode 100644 (file)
index 0000000..94f6648
--- /dev/null
@@ -0,0 +1,358 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <net/if.h>
+
+#ifndef IFF_LOWER_UP
+#define IFF_LOWER_UP   0x10000
+#endif
+
+#include <glib.h>
+
+#define CONNMAN_API_SUBJECT_TO_CHANGE
+#include <connman/technology.h>
+#include <connman/plugin.h>
+#include <connman/device.h>
+#include <connman/rtnl.h>
+#include <connman/inet.h>
+#include <connman/log.h>
+
+static bool gadget_tethering = false;
+
+struct gadget_data {
+       int index;
+       unsigned flags;
+       unsigned int watch;
+       struct connman_network *network;
+};
+
+static int gadget_network_probe(struct connman_network *network)
+{
+       DBG("network %p", network);
+
+       return 0;
+}
+
+static void gadget_network_remove(struct connman_network *network)
+{
+       DBG("network %p", network);
+}
+
+static int gadget_network_connect(struct connman_network *network)
+{
+       DBG("network %p", network);
+
+       connman_network_set_connected(network, true);
+
+       return 0;
+}
+
+static int gadget_network_disconnect(struct connman_network *network)
+{
+       DBG("network %p", network);
+
+       connman_network_set_connected(network, false);
+
+       return 0;
+}
+
+static struct connman_network_driver gadget_network_driver = {
+       .name           = "usb",
+       .type           = CONNMAN_NETWORK_TYPE_GADGET,
+       .probe          = gadget_network_probe,
+       .remove         = gadget_network_remove,
+       .connect        = gadget_network_connect,
+       .disconnect     = gadget_network_disconnect,
+};
+
+static void add_network(struct connman_device *device,
+                       struct gadget_data *gadget)
+{
+       struct connman_network *network;
+       int index;
+
+       network = connman_network_create("gadget",
+                                       CONNMAN_NETWORK_TYPE_GADGET);
+       if (!network)
+               return;
+
+       index = connman_device_get_index(device);
+       connman_network_set_index(network, index);
+
+       connman_network_set_name(network, "Wired");
+
+       if (connman_device_add_network(device, network) < 0) {
+               connman_network_unref(network);
+               return;
+       }
+
+       if (!gadget_tethering)
+               /*
+                * Prevent service from starting the reconnect
+                * procedure as we do not want the DHCP client
+                * to run when tethering.
+                */
+               connman_network_set_group(network, "usb");
+
+       gadget->network = network;
+}
+
+static void remove_network(struct connman_device *device,
+                               struct gadget_data *gadget)
+{
+       if (!gadget->network)
+               return;
+
+       connman_device_remove_network(device, gadget->network);
+       connman_network_unref(gadget->network);
+
+       gadget->network = NULL;
+}
+
+static void gadget_newlink(unsigned flags, unsigned change, void *user_data)
+{
+       struct connman_device *device = user_data;
+       struct gadget_data *gadget = connman_device_get_data(device);
+
+       DBG("index %d flags %d change %d", gadget->index, flags, change);
+
+       if ((gadget->flags & IFF_UP) != (flags & IFF_UP)) {
+               if (flags & IFF_UP) {
+                       DBG("power on");
+                       connman_device_set_powered(device, true);
+               } else {
+                       DBG("power off");
+                       connman_device_set_powered(device, false);
+               }
+       }
+
+       if ((gadget->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
+               if (flags & IFF_LOWER_UP) {
+                       DBG("carrier on");
+                       add_network(device, gadget);
+               } else {
+                       DBG("carrier off");
+                       remove_network(device, gadget);
+               }
+       }
+
+       gadget->flags = flags;
+}
+
+static int gadget_dev_probe(struct connman_device *device)
+{
+       struct gadget_data *gadget;
+
+       DBG("device %p", device);
+
+       gadget = g_try_new0(struct gadget_data, 1);
+       if (!gadget)
+               return -ENOMEM;
+
+       connman_device_set_data(device, gadget);
+
+       gadget->index = connman_device_get_index(device);
+       gadget->flags = 0;
+
+       gadget->watch = connman_rtnl_add_newlink_watch(gadget->index,
+                                               gadget_newlink, device);
+
+       return 0;
+}
+
+static void gadget_dev_remove(struct connman_device *device)
+{
+       struct gadget_data *gadget = connman_device_get_data(device);
+
+       DBG("device %p", device);
+
+       connman_device_set_data(device, NULL);
+
+       connman_rtnl_remove_watch(gadget->watch);
+
+       remove_network(device, gadget);
+
+       g_free(gadget);
+}
+
+static int gadget_dev_enable(struct connman_device *device)
+{
+       struct gadget_data *gadget = connman_device_get_data(device);
+
+       DBG("device %p", device);
+
+       return connman_inet_ifup(gadget->index);
+}
+
+static int gadget_dev_disable(struct connman_device *device)
+{
+       struct gadget_data *gadget = connman_device_get_data(device);
+
+       DBG("device %p", device);
+
+       return connman_inet_ifdown(gadget->index);
+}
+
+static struct connman_device_driver gadget_dev_driver = {
+       .name           = "gadget",
+       .type           = CONNMAN_DEVICE_TYPE_GADGET,
+       .probe          = gadget_dev_probe,
+       .remove         = gadget_dev_remove,
+       .enable         = gadget_dev_enable,
+       .disable        = gadget_dev_disable,
+};
+
+static GList *cdc_interface_list = NULL;
+
+static void gadget_tech_add_interface(struct connman_technology *technology,
+                       int index, const char *name, const char *ident)
+{
+       DBG("index %d name %s ident %s", index, name, ident);
+
+       if (g_list_find(cdc_interface_list, GINT_TO_POINTER((int)index)))
+               return;
+
+       cdc_interface_list = g_list_prepend(cdc_interface_list,
+                                       (GINT_TO_POINTER((int) index)));
+}
+
+static void gadget_tech_remove_interface(struct connman_technology *technology,
+                                                               int index)
+{
+       DBG("index %d", index);
+
+       cdc_interface_list = g_list_remove(cdc_interface_list,
+                                       GINT_TO_POINTER((int) index));
+}
+
+static void gadget_tech_enable_tethering(struct connman_technology *technology,
+                                               const char *bridge)
+{
+       GList *list;
+
+       for (list = cdc_interface_list; list; list = list->next) {
+               int index = GPOINTER_TO_INT(list->data);
+               struct connman_device *device =
+                       connman_device_find_by_index(index);
+               struct gadget_data *gadget;
+
+               if (device) {
+                       gadget = connman_device_get_data(device);
+                       if (gadget)
+                               remove_network(device, gadget);
+               }
+
+               connman_technology_tethering_notify(technology, true);
+
+               connman_inet_ifup(index);
+
+               connman_inet_add_to_bridge(index, bridge);
+       }
+}
+
+static void gadget_tech_disable_tethering(struct connman_technology *technology,
+                                               const char *bridge)
+{
+       GList *list;
+
+       for (list = cdc_interface_list; list; list = list->next) {
+               int index = GPOINTER_TO_INT(list->data);
+
+               connman_inet_remove_from_bridge(index, bridge);
+
+               connman_inet_ifdown(index);
+
+               connman_technology_tethering_notify(technology, false);
+       }
+}
+
+static int gadget_tech_set_tethering(struct connman_technology *technology,
+                               const char *identifier, const char *passphrase,
+                               const char *bridge, bool enabled)
+{
+       DBG("bridge %s enabled %d", bridge, enabled);
+
+       if (enabled)
+               gadget_tech_enable_tethering(technology, bridge);
+       else
+               gadget_tech_disable_tethering(technology, bridge);
+
+       return 0;
+}
+
+static int gadget_tech_probe(struct connman_technology *technology)
+{
+       return 0;
+}
+
+static void gadget_tech_remove(struct connman_technology *technology)
+{
+       g_list_free(cdc_interface_list);
+
+       cdc_interface_list = NULL;
+}
+
+static struct connman_technology_driver gadget_tech_driver = {
+       .name                   = "cdc_ethernet",
+       .type                   = CONNMAN_SERVICE_TYPE_GADGET,
+       .probe                  = gadget_tech_probe,
+       .remove                 = gadget_tech_remove,
+       .add_interface          = gadget_tech_add_interface,
+       .remove_interface       = gadget_tech_remove_interface,
+       .set_tethering          = gadget_tech_set_tethering,
+};
+
+static int gadget_init(void)
+{
+       int err;
+
+       err = connman_technology_driver_register(&gadget_tech_driver);
+       if (err < 0) {
+               return err;
+       }
+
+       err = connman_network_driver_register(&gadget_network_driver);
+       if (err < 0)
+               return err;
+
+       err = connman_device_driver_register(&gadget_dev_driver);
+       if (err < 0) {
+               connman_technology_driver_unregister(&gadget_tech_driver);
+               return err;
+       }
+
+       return 0;
+}
+
+static void gadget_exit(void)
+{
+       connman_technology_driver_unregister(&gadget_tech_driver);
+       connman_network_driver_unregister(&gadget_network_driver);
+       connman_device_driver_unregister(&gadget_dev_driver);
+}
+
+CONNMAN_PLUGIN_DEFINE(gadget, "Gadget interface plugin", VERSION,
+               CONNMAN_PLUGIN_PRIORITY_DEFAULT, gadget_init, gadget_exit)
index 20521b0..99394e1 100644 (file)
@@ -77,7 +77,7 @@ static int hh2serial_disable(struct connman_device *device)
        return 0;
 }
 
-static struct connman_device_driver hh2seial_device_driver = {
+static struct connman_device_driver hh2serial_device_driver = {
        .name           = "hh2serial GPS",
        .type           = CONNMAN_DEVICE_TYPE_GPS,
        .enable         = hh2serial_enable,
@@ -88,24 +88,36 @@ static struct connman_device_driver hh2seial_device_driver = {
 
 static int hh2serial_init(void)
 {
-       connman_device_driver_register(&hh2seial_device_driver);
+       int err;
+
+       err = connman_device_driver_register(&hh2serial_device_driver);
+       if (err < 0)
+               return err;
 
        hh2serial_device = connman_device_create("hh2serial_gps",
                                                CONNMAN_DEVICE_TYPE_GPS);
-       if (hh2serial_device == NULL)
+       if (!hh2serial_device) {
+               connman_device_driver_unregister(&hh2serial_device_driver);
                return -ENODEV;
+       }
 
-       connman_device_register(hh2serial_device);
+       err = connman_device_register(hh2serial_device);
+       if (err < 0) {
+               connman_device_unref(hh2serial_device);
+               return err;
+       }
 
        return 0;
 }
 
 static void hh2serial_exit(void)
 {
-       if (hh2serial_device != NULL) {
+       if (hh2serial_device) {
                connman_device_unregister(hh2serial_device);
                connman_device_unref(hh2serial_device);
        }
+
+       connman_device_driver_unregister(&hh2serial_device_driver);
 }
 
 CONNMAN_PLUGIN_DEFINE(hh2serial_gps, "hh2serial GPS", VERSION,
index 3b014d3..fcb4cea 100644 (file)
 
 static DBusConnection *connection;
 
-static void send_indication(const char *path, connman_bool_t enabled)
+static void send_indication(const char *path, bool enabled)
 {
        DBusMessage *message;
        const char *method;
 
        DBG("path %s enabled %d", path, enabled);
 
-       if (enabled == TRUE)
+       if (enabled)
                method = "IndicateStart";
        else
                method = "IndicateStop";
 
        message = dbus_message_new_method_call(IOSPM_SERVICE, path,
                                                IOSPM_INTERFACE, method);
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_no_reply(message, TRUE);
@@ -62,7 +62,7 @@ static void send_indication(const char *path, connman_bool_t enabled)
 }
 
 static void iospm_service_enabled(enum connman_service_type type,
-                                               connman_bool_t enabled)
+                                               bool enabled)
 {
        switch (type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
@@ -73,6 +73,7 @@ static void iospm_service_enabled(enum connman_service_type type,
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
        case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
                send_indication(IOSPM_BLUETOOTH, enabled);
@@ -80,7 +81,7 @@ static void iospm_service_enabled(enum connman_service_type type,
        }
 }
 
-static void iospm_offline_mode(connman_bool_t enabled)
+static void iospm_offline_mode(bool enabled)
 {
        send_indication(IOSPM_FLIGHT_MODE, enabled);
 }
index a111eee..e113887 100644 (file)
@@ -86,7 +86,7 @@ static int setup_hostname(void)
        return 0;
 }
 
-static gboolean valid_loopback(int sk, struct ifreq *ifr)
+static bool valid_loopback(int sk, struct ifreq *ifr)
 {
        struct sockaddr_in *addr;
        int err;
@@ -108,24 +108,24 @@ static gboolean valid_loopback(int sk, struct ifreq *ifr)
        if (addr->sin_addr.s_addr != loopback_address) {
                connman_warn("Invalid loopback address %s",
                        inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)));
-               return FALSE;
+               return false;
        }
 
        err = ioctl(sk, SIOCGIFNETMASK, ifr);
        if (err < 0) {
                err = -errno;
                connman_error("Getting netmask failed (%s)", strerror(-err));
-               return TRUE;
+               return true;
        }
 
        addr = (struct sockaddr_in *) &ifr->ifr_netmask;
        if (addr->sin_addr.s_addr != loopback_netmask) {
                connman_warn("Invalid loopback netmask %s",
                        inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)));
-               return FALSE;
+               return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static int setup_loopback(void)
@@ -148,12 +148,12 @@ static int setup_loopback(void)
 
        if (ifr.ifr_flags & IFF_UP) {
                connman_info("Checking loopback interface settings");
-               if (valid_loopback(sk, &ifr) == TRUE) {
+               if (valid_loopback(sk, &ifr)) {
                        err = -EALREADY;
                        goto done;
                }
 
-               connman_warn("Correcting wrong lookback settings");
+               connman_warn("Correcting wrong loopback settings");
        }
 
        memset(&addr, 0, sizeof(addr));
@@ -215,10 +215,10 @@ static int loopback_set_hostname(const char *hostname)
 
        len = strlen(hostname);
 
-       if (connman_inet_check_hostname(hostname, len) == FALSE)
+       if (!connman_inet_check_hostname(hostname, len))
                return -EINVAL;
 
-       if ((ptr = strstr(hostname, ".")) != NULL)
+       if ((ptr = strstr(hostname, ".")))
                len = ptr - hostname;
 
        if (sethostname(hostname, len) < 0) {
@@ -238,7 +238,7 @@ static int loopback_set_domainname(const char *domainname)
 
        len = strlen(domainname);
 
-       if (connman_inet_check_hostname(domainname, len) == FALSE)
+       if (!connman_inet_check_hostname(domainname, len))
                return -EINVAL;
 
        if (setdomainname(domainname, len) < 0) {
index 83561fe..1a0fc1c 100644 (file)
@@ -61,7 +61,7 @@
 struct data_elements {
        unsigned int value;
        unsigned int length;
-       gboolean fixed_length;
+       bool fixed_length;
 };
 
 typedef enum {
@@ -87,7 +87,7 @@ struct wifi_sc {
 
 static DBusConnection *connection = NULL;
 DBusPendingCall *register_call = NULL;
-gboolean agent_registered = FALSE;
+bool agent_registered = false;
 static guint watch_id = 0;
 
 static int set_2b_into_tlv(uint8_t *tlv_msg, uint16_t val)
@@ -117,20 +117,20 @@ static uint8_t *encode_to_tlv(const char *ssid, const char *psk, int *length)
        uint8_t *tlv_msg;
        int pos = 0;
 
-       if (ssid == NULL || length == NULL)
+       if (!ssid || !length)
                return NULL;
 
        ssid_len = strlen(ssid);
 
        *length = 6 + 4 + ssid_len;
-       if (psk != NULL) {
+       if (psk) {
                psk_len = strlen(psk);
                *length += 4 + psk_len;
        } else
                psk_len = 0;
 
        tlv_msg = g_try_malloc0(sizeof(uint8_t) * (*length));
-       if (tlv_msg == NULL)
+       if (!tlv_msg)
                return NULL;
 
        pos += set_2b_into_tlv(tlv_msg+pos, DEs[DE_SSID].value);
@@ -140,7 +140,7 @@ static uint8_t *encode_to_tlv(const char *ssid, const char *psk, int *length)
        pos += set_2b_into_tlv(tlv_msg+pos, DEs[DE_AUTHENTICATION_TYPE].value);
        pos += set_2b_into_tlv(tlv_msg+pos,
                                        DEs[DE_AUTHENTICATION_TYPE].length);
-       if (psk != NULL) {
+       if (psk) {
                pos += set_2b_into_tlv(tlv_msg+pos, DE_VAL_PSK);
                pos += set_2b_into_tlv(tlv_msg+pos, DEs[DE_NETWORK_KEY].value);
                pos += set_2b_into_tlv(tlv_msg+pos, psk_len);
@@ -172,7 +172,7 @@ static int parse_request_oob_params(DBusMessage *message,
        const char *key;
        int arg_type;
 
-       if (tlv_msg == NULL || length == NULL)
+       if (!tlv_msg || !length)
                return -EINVAL;
 
        dbus_message_iter_init(message, &iter);
@@ -225,15 +225,15 @@ static DBusMessage *create_request_oob_reply(DBusMessage *message)
        uint8_t *tlv_msg;
        int length;
 
-       if (connman_technology_get_wifi_tethering(&ssid, &psk) == FALSE)
+       if (!connman_technology_get_wifi_tethering(&ssid, &psk))
                return get_reply_on_error(message, ENOTSUP);
 
        tlv_msg = encode_to_tlv(ssid, psk, &length);
-       if (tlv_msg == NULL)
+       if (!tlv_msg)
                return get_reply_on_error(message, ENOTSUP);
 
        reply = dbus_message_new_method_return(message);
-       if (reply == NULL)
+       if (!reply)
                goto out;
 
        dbus_message_iter_init_append(reply, &iter);
@@ -268,7 +268,7 @@ static DBusMessage *request_oob_method(DBusConnection *dbus_conn,
 
 static void free_wifi_sc(struct wifi_sc *wsc)
 {
-       if (wsc == NULL)
+       if (!wsc)
                return;
 
        g_free(wsc->ssid);
@@ -289,7 +289,7 @@ static uint8_t *get_byte_array_from_tlv(const uint8_t *tlv_msg, int length)
        uint8_t *array;
 
        array = g_try_malloc0(sizeof(uint8_t) * length);
-       if (array == NULL)
+       if (!array)
                return NULL;
 
        memcpy((void *)array, (void *)tlv_msg, length*sizeof(uint8_t));
@@ -302,7 +302,7 @@ static char *get_string_from_tlv(const uint8_t *tlv_msg, int length)
        char *str;
 
        str = g_try_malloc0((sizeof(char) * length) + 1);
-       if (str == NULL)
+       if (!str)
                return NULL;
 
        memcpy((void *)str, (void *)tlv_msg, length*sizeof(char));
@@ -322,9 +322,9 @@ static inline DEid get_de_id(uint16_t attr)
        return DE_MAX;
 }
 
-static inline gboolean is_de_length_fine(DEid id, uint16_t length)
+static inline bool is_de_length_fine(DEid id, uint16_t length)
 {
-       if (DEs[id].fixed_length == TRUE)
+       if (DEs[id].fixed_length)
                return (length == DEs[id].length);
 
        return (length <= DEs[id].length);
@@ -336,7 +336,7 @@ static char *get_hexstr_from_byte_array(const uint8_t *bt, int length)
        int i, j;
 
        hex_str = g_try_malloc0(((length*2)+1) * sizeof(char));
-       if (hex_str == NULL)
+       if (!hex_str)
                return NULL;
 
        for (i = 0, j = 0; i < length; i++, j += 2)
@@ -353,11 +353,11 @@ static struct wifi_sc *decode_from_tlv(const uint8_t *tlv_msg, int length)
        int pos;
        DEid id;
 
-       if (tlv_msg == NULL || length == 0)
+       if (!tlv_msg || length == 0)
                return NULL;
 
        wsc = g_try_malloc0(sizeof(struct wifi_sc));
-       if (wsc == NULL)
+       if (!wsc)
                return NULL;
 
        pos = 0;
@@ -374,7 +374,7 @@ static struct wifi_sc *decode_from_tlv(const uint8_t *tlv_msg, int length)
                        continue;
                }
 
-               if (is_de_length_fine(id, len) == FALSE)
+               if (!is_de_length_fine(id, len))
                        goto error;
 
                switch (id) {
@@ -413,14 +413,14 @@ static int handle_wcs_data(const uint8_t *tlv_msg, int length)
        int ret = -EINVAL;
 
        wsc = decode_from_tlv(tlv_msg, length);
-       if (wsc == NULL)
+       if (!wsc)
                return -EINVAL;
 
-       if (wsc->ssid == NULL)
+       if (!wsc->ssid)
                goto out;
 
        keyfile = g_key_file_new();
-       if (keyfile == NULL) {
+       if (!keyfile) {
                ret = -ENOMEM;
                goto out;
        }
@@ -432,7 +432,7 @@ static int handle_wcs_data(const uint8_t *tlv_msg, int length)
        g_key_file_set_boolean(keyfile, NEARD_SERVICE_GROUP,
                                        SERVICE_KEY_HIDDEN, TRUE);
 
-       if (wsc->passphrase != NULL)
+       if (wsc->passphrase)
                g_key_file_set_string(keyfile, NEARD_SERVICE_GROUP,
                                SERVICE_KEY_PASSPHRASE, wsc->passphrase);
 
@@ -468,7 +468,7 @@ static DBusMessage *release_method(DBusConnection *dbus_conn,
 {
        DBG("");
 
-       agent_registered = FALSE;
+       agent_registered = false;
        g_dbus_unregister_interface(connection,
                                        AGENT_PATH, NEARD_AGENT_INTERFACE);
 
@@ -476,7 +476,7 @@ static DBusMessage *release_method(DBusConnection *dbus_conn,
 }
 
 static const GDBusMethodTable neard_methods[] = {
-{ GDBUS_ASYNC_METHOD("RequestOOB",
+       { GDBUS_ASYNC_METHOD("RequestOOB",
                GDBUS_ARGS({ "data", "a{sv}" }),
                GDBUS_ARGS({ "data", "a{sv}" }), request_oob_method) },
        { GDBUS_ASYNC_METHOD("PushOOB",
@@ -487,7 +487,7 @@ static const GDBusMethodTable neard_methods[] = {
 
 static void cleanup_register_call(void)
 {
-       if (register_call != NULL) {
+       if (register_call) {
                dbus_pending_call_cancel(register_call);
                dbus_pending_call_unref(register_call);
                register_call = NULL;
@@ -498,20 +498,20 @@ static void register_agent_cb(DBusPendingCall *pending, void *user_data)
 {
        DBusMessage *reply;
 
-       if (dbus_pending_call_get_completed(pending) == FALSE)
+       if (!dbus_pending_call_get_completed(pending))
                return;
 
        register_call = NULL;
 
        reply = dbus_pending_call_steal_reply(pending);
-       if (reply == NULL)
+       if (!reply)
                goto out;
 
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                g_dbus_unregister_interface(connection,
                                        AGENT_PATH, NEARD_AGENT_INTERFACE);
        } else
-               agent_registered = TRUE;
+               agent_registered = true;
 
        dbus_message_unref(reply);
 out:
@@ -527,20 +527,20 @@ static void register_agent(void)
        message = dbus_message_new_method_call(NEARD_SERVICE, NEARD_PATH,
                                                NEARD_MANAGER_INTERFACE,
                                                "RegisterHandoverAgent");
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_append_args(message, DBUS_TYPE_OBJECT_PATH,
                        &path, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                       &register_call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &register_call, TIMEOUT)) {
                dbus_message_unref(message);
                goto out;
        }
 
-       if (dbus_pending_call_set_notify(register_call, register_agent_cb,
-                                                       NULL, NULL) == FALSE)
+       if (!dbus_pending_call_set_notify(register_call,
+                                               register_agent_cb, NULL, NULL))
                cleanup_register_call();
 
 out:
@@ -553,15 +553,15 @@ static void unregister_agent(void)
        const char *type = AGENT_TYPE;
        DBusMessage *message;
 
-       if (agent_registered == FALSE)
+       if (!agent_registered)
                return cleanup_register_call();
 
-       agent_registered = FALSE;
+       agent_registered = false;
 
        message = dbus_message_new_method_call(NEARD_SERVICE, NEARD_PATH,
                                                NEARD_MANAGER_INTERFACE,
                                                "UnregisterHandoverAgent");
-       if (message != NULL) {
+       if (message) {
                dbus_message_append_args(message, DBUS_TYPE_OBJECT_PATH,
                        &path, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID);
                g_dbus_send_message(connection, message);
@@ -575,12 +575,12 @@ static void neard_is_present(DBusConnection *conn, void *user_data)
 {
        DBG("");
 
-       if (agent_registered == TRUE)
+       if (agent_registered)
                return;
 
        if (g_dbus_register_interface(connection, AGENT_PATH,
                                        NEARD_AGENT_INTERFACE, neard_methods,
-                                       NULL, NULL, NULL, NULL) == TRUE)
+                                       NULL, NULL, NULL, NULL))
                register_agent();
 }
 
@@ -588,10 +588,10 @@ static void neard_is_out(DBusConnection *conn, void *user_data)
 {
        DBG("");
 
-       if (agent_registered == TRUE) {
+       if (agent_registered) {
                g_dbus_unregister_interface(connection,
                                        AGENT_PATH, NEARD_AGENT_INTERFACE);
-               agent_registered = FALSE;
+               agent_registered = false;
        }
 
        cleanup_register_call();
@@ -600,7 +600,7 @@ static void neard_is_out(DBusConnection *conn, void *user_data)
 static int neard_init(void)
 {
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        watch_id = g_dbus_add_service_watch(connection, NEARD_SERVICE,
@@ -620,7 +620,7 @@ static void neard_exit(void)
 
        if (watch_id != 0)
                g_dbus_remove_watch(connection, watch_id);
-       if (connection != NULL)
+       if (connection)
                dbus_connection_unref(connection);
 }
 
index 400389b..883ce9b 100644 (file)
@@ -60,7 +60,7 @@ static void state_changed(dbus_uint32_t state)
 
        signal = dbus_message_new_signal(NM_PATH, NM_INTERFACE,
                                                "StateChanged");
-       if (signal == NULL)
+       if (!signal)
                return;
 
        dbus_message_append_args(signal, DBUS_TYPE_UINT32, &state,
@@ -79,7 +79,7 @@ static void properties_changed(dbus_uint32_t state)
 
        signal = dbus_message_new_signal(NM_PATH, NM_INTERFACE,
                                                "PropertiesChanged");
-       if (signal == NULL)
+       if (!signal)
                return;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -112,7 +112,7 @@ static void default_changed(struct connman_service *service)
 {
        DBG("service %p", service);
 
-       if (service == NULL)
+       if (!service)
                nm_state = NM_STATE_DISCONNECTED;
        else
                nm_state = NM_STATE_CONNECTED_LOCAL;
@@ -128,7 +128,7 @@ static void service_state_changed(struct connman_service *service,
 {
        DBG("service %p state %d", service, state);
 
-       if (current_service == NULL || current_service != service)
+       if (!current_service || current_service != service)
                return;
 
        switch (state) {
@@ -158,11 +158,11 @@ static void service_state_changed(struct connman_service *service,
        properties_changed(nm_state);
 }
 
-static void offline_mode(connman_bool_t enabled)
+static void offline_mode(bool enabled)
 {
        DBG("enabled %d", enabled);
 
-       if (enabled == TRUE)
+       if (enabled)
                nm_state = NM_STATE_ASLEEP;
        else
                nm_state = NM_STATE_DISCONNECTED;
@@ -191,18 +191,18 @@ static DBusMessage *property_get(DBusConnection *conn,
 
        DBG("interface %s property %s", interface, key);
 
-       if (g_str_equal(interface, NM_INTERFACE) == FALSE)
+       if (!g_str_equal(interface, NM_INTERFACE))
                return dbus_message_new_error(msg, DBUS_ERROR_FAILED,
                                                "Unsupported interface");
 
-       if (g_str_equal(key, "State") == TRUE) {
+       if (g_str_equal(key, "State")) {
                DBusMessage *reply;
                DBusMessageIter iter, value;
 
                DBG("state %d", nm_state);
 
                reply = dbus_message_new_method_return(msg);
-               if (reply == NULL)
+               if (!reply)
                        return NULL;
 
                dbus_message_iter_init_append(reply, &iter);
@@ -240,10 +240,10 @@ static int nmcompat_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
-       if (g_dbus_request_name(connection, NM_SERVICE, NULL) == FALSE) {
+       if (!g_dbus_request_name(connection, NM_SERVICE, NULL)) {
                connman_error("nmcompat: failed to register service");
                return -1;
        }
@@ -253,9 +253,9 @@ static int nmcompat_init(void)
                return -1;
        }
 
-       if (g_dbus_register_interface(connection, NM_PATH,
-                               DBUS_PROPERTIES_INTERFACE,
-                               methods, signals, NULL, NULL, NULL) == FALSE) {
+       if (!g_dbus_register_interface(connection, NM_PATH,
+                                       DBUS_PROPERTIES_INTERFACE, methods,
+                                       signals, NULL, NULL, NULL)) {
                connman_error("nmcompat: failed to register "
                                                DBUS_PROPERTIES_INTERFACE);
                return -1;
@@ -270,7 +270,7 @@ static void nmcompat_exit(void)
 
        connman_notifier_unregister(&notifier);
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        g_dbus_unregister_interface(connection, NM_PATH,
index 847f256..fecef9c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *  Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
  *  Copyright (C) 2011  BWM Car IT GmbH. All rights reserved.
  *
@@ -153,24 +153,23 @@ struct modem_data {
 
        /* Modem Interface */
        char *serial;
-       connman_bool_t powered;
-       connman_bool_t online;
+       bool powered;
+       bool online;
        uint8_t interfaces;
-       connman_bool_t ignore;
+       bool ignore;
 
-       connman_bool_t set_powered;
+       bool set_powered;
 
        /* CDMA ConnectionManager Interface */
-       connman_bool_t cdma_cm_powered;
+       bool cdma_cm_powered;
 
        /* ConnectionManager Interface */
-       connman_bool_t attached;
-       connman_bool_t cm_powered;
+       bool attached;
+       bool cm_powered;
 
        /* ConnectionContext Interface */
-       connman_bool_t active;
-       connman_bool_t set_active;
-       connman_bool_t valid_apn; /* APN is 'valid' if length > 0 */
+       bool active;
+       bool valid_apn; /* APN is 'valid' if length > 0 */
 
        /* SimManager Interface */
        char *imsi;
@@ -179,8 +178,8 @@ struct modem_data {
        char *name;
        uint8_t strength;
        uint8_t data_strength; /* 1xEVDO signal strength */
-       connman_bool_t registered;
-       connman_bool_t roaming;
+       bool registered;
+       bool roaming;
 
        /* pending calls */
        DBusPendingCall *call_set_property;
@@ -214,7 +213,7 @@ static char *get_ident(const char *path)
                return NULL;
 
        pos = strrchr(path, '/');
-       if (pos == NULL)
+       if (!pos)
                return NULL;
 
        return pos + 1;
@@ -225,7 +224,7 @@ static struct network_context *network_context_alloc(const char *path)
        struct network_context *context;
 
        context = g_try_new0(struct network_context, 1);
-       if (context == NULL)
+       if (!context)
                return NULL;
 
        context->path = g_strdup(path);
@@ -258,7 +257,7 @@ static void network_context_free(struct network_context *context)
 static void set_connected(struct modem_data *modem)
 {
        struct connman_service *service;
-       connman_bool_t setip = FALSE;
+       bool setip = false;
        enum connman_ipconfig_method method;
        char *nameservers;
        int index;
@@ -267,25 +266,25 @@ static void set_connected(struct modem_data *modem)
 
        index = modem->context->index;
 
-       if (index < 0 || modem->context->ipv4_address == NULL) {
+       method = modem->context->ipv4_method;
+       if (index < 0 || (!modem->context->ipv4_address &&
+                               method == CONNMAN_IPCONFIG_METHOD_FIXED)) {
                connman_error("Invalid index and/or address");
                return;
        }
 
        service = connman_service_lookup_from_network(modem->network);
-       if (service == NULL)
+       if (!service)
                return;
 
-       method = modem->context->ipv4_method;
        if (method == CONNMAN_IPCONFIG_METHOD_FIXED ||
-                       method == CONNMAN_IPCONFIG_METHOD_DHCP)
-       {
+                       method == CONNMAN_IPCONFIG_METHOD_DHCP) {
                connman_service_create_ip4config(service, index);
                connman_network_set_index(modem->network, index);
 
                connman_network_set_ipv4_method(modem->network, method);
 
-               setip = TRUE;
+               setip = true;
        }
 
        if (method == CONNMAN_IPCONFIG_METHOD_FIXED) {
@@ -299,41 +298,41 @@ static void set_connected(struct modem_data *modem)
                connman_network_set_ipv6_method(modem->network, method);
                connman_network_set_ipaddress(modem->network,
                                                modem->context->ipv6_address);
-               setip = TRUE;
+               setip = true;
        }
 
        /* Set the nameservers */
-       if (modem->context->ipv4_nameservers != NULL &&
-                       modem->context->ipv6_nameservers != NULL) {
+       if (modem->context->ipv4_nameservers &&
+                       modem->context->ipv6_nameservers) {
                nameservers = g_strdup_printf("%s %s",
                                        modem->context->ipv4_nameservers,
                                        modem->context->ipv6_nameservers);
                connman_network_set_nameservers(modem->network, nameservers);
                g_free(nameservers);
-       } else if (modem->context->ipv4_nameservers != NULL) {
+       } else if (modem->context->ipv4_nameservers) {
                connman_network_set_nameservers(modem->network,
                                        modem->context->ipv4_nameservers);
-       } else if (modem->context->ipv6_nameservers != NULL) {
+       } else if (modem->context->ipv6_nameservers) {
                connman_network_set_nameservers(modem->network,
                                        modem->context->ipv6_nameservers);
        }
 
-       if (setip == TRUE)
-               connman_network_set_connected(modem->network, TRUE);
+       if (setip)
+               connman_network_set_connected(modem->network, true);
 }
 
 static void set_disconnected(struct modem_data *modem)
 {
        DBG("%s", modem->path);
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
-       connman_network_set_connected(modem->network, FALSE);
+       connman_network_set_connected(modem->network, false);
 }
 
 typedef void (*set_property_cb)(struct modem_data *data,
-                               connman_bool_t success);
+                               bool success);
 typedef void (*get_properties_cb)(struct modem_data *data,
                                DBusMessageIter *dict);
 
@@ -351,7 +350,7 @@ static void set_property_reply(DBusPendingCall *call, void *user_data)
        struct property_info *info = user_data;
        DBusMessage *reply;
        DBusError error;
-       connman_bool_t success = TRUE;
+       bool success = true;
 
        DBG("%s path %s %s.%s", info->modem->path,
                info->path, info->interface, info->property);
@@ -367,10 +366,10 @@ static void set_property_reply(DBusPendingCall *call, void *user_data)
                                info->path, info->interface, info->property,
                                error.name, error.message);
                dbus_error_free(&error);
-               success = FALSE;
+               success = false;
        }
 
-       if (info->set_property_cb != NULL)
+       if (info->set_property_cb)
                (*info->set_property_cb)(info->modem, success);
 
        dbus_message_unref(reply);
@@ -389,7 +388,7 @@ static int set_property(struct modem_data *modem,
 
        DBG("%s path %s %s.%s", modem->path, path, interface, property);
 
-       if (modem->call_set_property != NULL) {
+       if (modem->call_set_property) {
                DBG("Cancel pending SetProperty");
 
                dbus_pending_call_cancel(modem->call_set_property);
@@ -398,28 +397,28 @@ static int set_property(struct modem_data *modem,
 
        message = dbus_message_new_method_call(OFONO_SERVICE, path,
                                        interface, SET_PROPERTY);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
        connman_dbus_property_append_basic(&iter, property, type, value);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                       &modem->call_set_property, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                       &modem->call_set_property, TIMEOUT)) {
                connman_error("Failed to change property: %s %s.%s",
                                path, interface, property);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (modem->call_set_property == NULL) {
+       if (!modem->call_set_property) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
        info = g_try_new0(struct property_info, 1);
-       if (info == NULL) {
+       if (!info) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -462,7 +461,7 @@ static void get_properties_reply(DBusPendingCall *call, void *user_data)
                goto done;
        }
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                goto done;
 
        if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
@@ -470,7 +469,7 @@ static void get_properties_reply(DBusPendingCall *call, void *user_data)
 
        dbus_message_iter_recurse(&array, &dict);
 
-       if (info->get_properties_cb != NULL)
+       if (info->get_properties_cb)
                (*info->get_properties_cb)(info->modem, &dict);
 
 done:
@@ -489,31 +488,31 @@ static int get_properties(const char *path, const char *interface,
 
        DBG("%s path %s %s", modem->path, path, interface);
 
-       if (modem->call_get_properties != NULL) {
+       if (modem->call_get_properties) {
                connman_error("Pending GetProperties");
                return -EBUSY;
        }
 
        message = dbus_message_new_method_call(OFONO_SERVICE, path,
                                        interface, GET_PROPERTIES);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                       &modem->call_get_properties, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                       &modem->call_get_properties, TIMEOUT)) {
                connman_error("Failed to call %s.GetProperties()", interface);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (modem->call_get_properties == NULL) {
+       if (!modem->call_get_properties) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
        info = g_try_new0(struct property_info, 1);
-       if (info == NULL) {
+       if (!info) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -532,11 +531,11 @@ static int get_properties(const char *path, const char *interface,
 }
 
 static void context_set_active_reply(struct modem_data *modem,
-                                       connman_bool_t success)
+                                       bool success)
 {
        DBG("%s", modem->path);
 
-       if (success == TRUE) {
+       if (success) {
                /*
                 * Don't handle do anything on success here. oFono will send
                 * the change via PropertyChanged singal.
@@ -551,7 +550,7 @@ static void context_set_active_reply(struct modem_data *modem,
         * cycle the modem in such cases?
         */
 
-       if (modem->network == NULL) {
+       if (!modem->network) {
                /*
                 * In the case where we power down the device
                 * we don't wait for the reply, therefore the network
@@ -565,7 +564,7 @@ static void context_set_active_reply(struct modem_data *modem,
 }
 
 static int context_set_active(struct modem_data *modem,
-                               connman_bool_t active)
+                               dbus_bool_t active)
 {
        int err;
 
@@ -577,18 +576,18 @@ static int context_set_active(struct modem_data *modem,
                                &active,
                                context_set_active_reply);
 
-       if (active == FALSE && err == -EINPROGRESS)
+       if (!active && err == -EINPROGRESS)
                return 0;
 
        return err;
 }
 
 static void cdma_cm_set_powered_reply(struct modem_data *modem,
-                                       connman_bool_t success)
+                                       bool success)
 {
        DBG("%s", modem->path);
 
-       if (success == TRUE) {
+       if (success) {
                /*
                 * Don't handle do anything on success here. oFono will send
                 * the change via PropertyChanged singal.
@@ -603,7 +602,7 @@ static void cdma_cm_set_powered_reply(struct modem_data *modem,
         * cycle the modem in such cases?
         */
 
-       if (modem->network == NULL) {
+       if (!modem->network) {
                /*
                 * In the case where we power down the device
                 * we don't wait for the reply, therefore the network
@@ -616,7 +615,7 @@ static void cdma_cm_set_powered_reply(struct modem_data *modem,
                                CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
 }
 
-static int cdma_cm_set_powered(struct modem_data *modem, connman_bool_t powered)
+static int cdma_cm_set_powered(struct modem_data *modem, dbus_bool_t powered)
 {
        int err;
 
@@ -627,13 +626,13 @@ static int cdma_cm_set_powered(struct modem_data *modem, connman_bool_t powered)
                                &powered,
                                cdma_cm_set_powered_reply);
 
-       if (powered == FALSE && err == -EINPROGRESS)
+       if (!powered && err == -EINPROGRESS)
                return 0;
 
        return err;
 }
 
-static int modem_set_online(struct modem_data *modem, connman_bool_t online)
+static int modem_set_online(struct modem_data *modem, dbus_bool_t online)
 {
        DBG("%s online %d", modem->path, online);
 
@@ -644,7 +643,7 @@ static int modem_set_online(struct modem_data *modem, connman_bool_t online)
                                NULL);
 }
 
-static int cm_set_powered(struct modem_data *modem, connman_bool_t powered)
+static int cm_set_powered(struct modem_data *modem, dbus_bool_t powered)
 {
        int err;
 
@@ -656,13 +655,13 @@ static int cm_set_powered(struct modem_data *modem, connman_bool_t powered)
                                &powered,
                                NULL);
 
-       if (powered == FALSE && err == -EINPROGRESS)
+       if (!powered && err == -EINPROGRESS)
                return 0;
 
        return err;
 }
 
-static int modem_set_powered(struct modem_data *modem, connman_bool_t powered)
+static int modem_set_powered(struct modem_data *modem, dbus_bool_t powered)
 {
        int err;
 
@@ -676,19 +675,19 @@ static int modem_set_powered(struct modem_data *modem, connman_bool_t powered)
                                &powered,
                                NULL);
 
-       if (powered == FALSE && err == -EINPROGRESS)
+       if (!powered && err == -EINPROGRESS)
                return 0;
 
        return err;
 }
 
-static connman_bool_t has_interface(uint8_t interfaces,
+static bool has_interface(uint8_t interfaces,
                                        enum ofono_api api)
 {
        if ((interfaces & api) == api)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static uint8_t extract_interfaces(DBusMessageIter *array)
@@ -703,15 +702,15 @@ static uint8_t extract_interfaces(DBusMessageIter *array)
 
                dbus_message_iter_get_basic(&entry, &name);
 
-               if (g_str_equal(name, OFONO_SIM_INTERFACE) == TRUE)
+               if (g_str_equal(name, OFONO_SIM_INTERFACE))
                        interfaces |= OFONO_API_SIM;
-               else if (g_str_equal(name, OFONO_NETREG_INTERFACE) == TRUE)
+               else if (g_str_equal(name, OFONO_NETREG_INTERFACE))
                        interfaces |= OFONO_API_NETREG;
-               else if (g_str_equal(name, OFONO_CM_INTERFACE) == TRUE)
+               else if (g_str_equal(name, OFONO_CM_INTERFACE))
                        interfaces |= OFONO_API_CM;
-               else if (g_str_equal(name, OFONO_CDMA_CM_INTERFACE) == TRUE)
+               else if (g_str_equal(name, OFONO_CDMA_CM_INTERFACE))
                        interfaces |= OFONO_API_CDMA_CM;
-               else if (g_str_equal(name, OFONO_CDMA_NETREG_INTERFACE) == TRUE)
+               else if (g_str_equal(name, OFONO_CDMA_NETREG_INTERFACE))
                        interfaces |= OFONO_API_CDMA_NETREG;
 
                dbus_message_iter_next(&entry);
@@ -733,7 +732,7 @@ static char *extract_nameservers(DBusMessageIter *array)
 
                dbus_message_iter_get_basic(&entry, &nameserver);
 
-               if (nameservers == NULL) {
+               if (!nameservers) {
                        nameservers = g_strdup(nameserver);
                } else {
                        tmp = nameservers;
@@ -771,7 +770,7 @@ static void extract_ipv4_settings(DBusMessageIter *array,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Interface") == TRUE) {
+               if (g_str_equal(key, "Interface")) {
                        dbus_message_iter_get_basic(&value, &interface);
 
                        DBG("Interface %s", interface);
@@ -779,34 +778,33 @@ static void extract_ipv4_settings(DBusMessageIter *array,
                        index = connman_inet_ifindex(interface);
 
                        DBG("index %d", index);
-               } else if (g_str_equal(key, "Method") == TRUE) {
+               } else if (g_str_equal(key, "Method")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        DBG("Method %s", val);
 
-                       if (g_strcmp0(val, "static") == 0) {
+                       if (g_strcmp0(val, "static") == 0)
                                context->ipv4_method = CONNMAN_IPCONFIG_METHOD_FIXED;
-                       } else if (g_strcmp0(val, "dhcp") == 0) {
+                       else if (g_strcmp0(val, "dhcp") == 0)
                                context->ipv4_method = CONNMAN_IPCONFIG_METHOD_DHCP;
-                               break;
-                       }
-               } else if (g_str_equal(key, "Address") == TRUE) {
+
+               } else if (g_str_equal(key, "Address")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        address = g_strdup(val);
 
                        DBG("Address %s", address);
-               } else if (g_str_equal(key, "Netmask") == TRUE) {
+               } else if (g_str_equal(key, "Netmask")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        netmask = g_strdup(val);
 
                        DBG("Netmask %s", netmask);
-               } else if (g_str_equal(key, "DomainNameServers") == TRUE) {
+               } else if (g_str_equal(key, "DomainNameServers")) {
                        nameservers = extract_nameservers(&value);
 
                        DBG("Nameservers %s", nameservers);
-               } else if (g_str_equal(key, "Gateway") == TRUE) {
+               } else if (g_str_equal(key, "Gateway")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        gateway = g_strdup(val);
@@ -820,17 +818,21 @@ static void extract_ipv4_settings(DBusMessageIter *array,
        if (index < 0)
                goto out;
 
+       context->index = index;
+
        if (context->ipv4_method != CONNMAN_IPCONFIG_METHOD_FIXED)
                goto out;
 
        context->ipv4_address = connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV4);
-       if (context->ipv4_address == NULL)
+       if (!context->ipv4_address) {
+               context->index = -1;
                goto out;
+       }
 
-       context->index = index;
        connman_ipaddress_set_ipv4(context->ipv4_address, address,
                                netmask, gateway);
 
+       g_free(context->ipv4_nameservers);
        context->ipv4_nameservers = nameservers;
 
 out:
@@ -867,7 +869,7 @@ static void extract_ipv6_settings(DBusMessageIter *array,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Interface") == TRUE) {
+               if (g_str_equal(key, "Interface")) {
                        dbus_message_iter_get_basic(&value, &interface);
 
                        DBG("Interface %s", interface);
@@ -875,21 +877,21 @@ static void extract_ipv6_settings(DBusMessageIter *array,
                        index = connman_inet_ifindex(interface);
 
                        DBG("index %d", index);
-               } else if (g_str_equal(key, "Address") == TRUE) {
+               } else if (g_str_equal(key, "Address")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        address = g_strdup(val);
 
                        DBG("Address %s", address);
-               } else if (g_str_equal(key, "PrefixLength") == TRUE) {
+               } else if (g_str_equal(key, "PrefixLength")) {
                        dbus_message_iter_get_basic(&value, &prefix_length);
 
                        DBG("prefix length %d", prefix_length);
-               } else if (g_str_equal(key, "DomainNameServers") == TRUE) {
+               } else if (g_str_equal(key, "DomainNameServers")) {
                        nameservers = extract_nameservers(&value);
 
                        DBG("Nameservers %s", nameservers);
-               } else if (g_str_equal(key, "Gateway") == TRUE) {
+               } else if (g_str_equal(key, "Gateway")) {
                        dbus_message_iter_get_basic(&value, &val);
 
                        gateway = g_strdup(val);
@@ -907,13 +909,14 @@ static void extract_ipv6_settings(DBusMessageIter *array,
 
        context->ipv6_address =
                connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV6);
-       if (context->ipv6_address == NULL)
+       if (!context->ipv6_address)
                goto out;
 
        context->index = index;
        connman_ipaddress_set_ipv6(context->ipv6_address, address,
                                prefix_length, gateway);
 
+       g_free(context->ipv6_nameservers);
        context->ipv6_nameservers = nameservers;
 
 out:
@@ -924,7 +927,7 @@ out:
        g_free(gateway);
 }
 
-static connman_bool_t ready_to_create_device(struct modem_data *modem)
+static bool ready_to_create_device(struct modem_data *modem)
 {
        /*
         * There are three different modem types which behave slightly
@@ -938,13 +941,13 @@ static connman_bool_t ready_to_create_device(struct modem_data *modem)
         * before we are able to create a device.
         */
 
-       if (modem->device != NULL)
-               return FALSE;
+       if (modem->device)
+               return false;
 
-       if (modem->imsi != NULL || modem->serial != NULL)
-               return TRUE;
+       if (modem->imsi || modem->serial)
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static void create_device(struct modem_data *modem)
@@ -954,18 +957,18 @@ static void create_device(struct modem_data *modem)
 
        DBG("%s", modem->path);
 
-       if (modem->imsi != NULL)
+       if (modem->imsi)
                ident = modem->imsi;
-       else if (modem->serial != NULL)
+       else if (modem->serial)
                ident = modem->serial;
 
-       if (connman_dbus_validate_ident(ident) == FALSE)
+       if (!connman_dbus_validate_ident(ident))
                ident = connman_dbus_encode_string(ident);
        else
                ident = g_strdup(ident);
 
        device = connman_device_create("ofono", CONNMAN_DEVICE_TYPE_CELLULAR);
-       if (device == NULL)
+       if (!device)
                goto out;
 
        DBG("device %p", device);
@@ -993,9 +996,9 @@ static void destroy_device(struct modem_data *modem)
 {
        DBG("%s", modem->path);
 
-       connman_device_set_powered(modem->device, FALSE);
+       connman_device_set_powered(modem->device, false);
 
-       if (modem->network != NULL) {
+       if (modem->network) {
                connman_device_remove_network(modem->device, modem->network);
                connman_network_unref(modem->network);
                modem->network = NULL;
@@ -1013,12 +1016,12 @@ static void add_network(struct modem_data *modem)
 
        DBG("%s", modem->path);
 
-       if (modem->network != NULL)
+       if (modem->network)
                return;
 
        modem->network = connman_network_create(modem->context->path,
                                                CONNMAN_NETWORK_TYPE_CELLULAR);
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
        DBG("network %p", modem->network);
@@ -1028,7 +1031,7 @@ static void add_network(struct modem_data *modem)
        connman_network_set_string(modem->network, "Path",
                                        modem->context->path);
 
-       if (modem->name != NULL)
+       if (modem->name)
                connman_network_set_name(modem->network, modem->name);
        else
                connman_network_set_name(modem->network, "");
@@ -1052,7 +1055,7 @@ static void remove_network(struct modem_data *modem)
 {
        DBG("%s", modem->path);
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
        DBG("network %p", modem->network);
@@ -1067,11 +1070,11 @@ static int add_cm_context(struct modem_data *modem, const char *context_path,
 {
        const char *context_type = NULL;
        struct network_context *context = NULL;
-       connman_bool_t active = FALSE;
+       dbus_bool_t active = FALSE;
 
        DBG("%s context path %s", modem->path, context_path);
 
-       if (modem->context != NULL) {
+       if (modem->context) {
                /*
                 * We have already assigned a context to this modem
                 * and we do only support one Internet context.
@@ -1080,7 +1083,7 @@ static int add_cm_context(struct modem_data *modem, const char *context_path,
        }
 
        context = network_context_alloc(context_path);
-       if (context == NULL)
+       if (!context)
                return -ENOMEM;
 
        while (dbus_message_iter_get_arg_type(dict) == DBUS_TYPE_DICT_ENTRY) {
@@ -1093,31 +1096,31 @@ static int add_cm_context(struct modem_data *modem, const char *context_path,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Type") == TRUE) {
+               if (g_str_equal(key, "Type")) {
                        dbus_message_iter_get_basic(&value, &context_type);
 
                        DBG("%s context %s type %s", modem->path,
                                context_path, context_type);
-               } else if (g_str_equal(key, "Settings") == TRUE) {
+               } else if (g_str_equal(key, "Settings")) {
                        DBG("%s Settings", modem->path);
 
                        extract_ipv4_settings(&value, context);
-               } else if (g_str_equal(key, "IPv6.Settings") == TRUE) {
+               } else if (g_str_equal(key, "IPv6.Settings")) {
                        DBG("%s IPv6.Settings", modem->path);
 
                        extract_ipv6_settings(&value, context);
-               } else if (g_str_equal(key, "Active") == TRUE) {
+               } else if (g_str_equal(key, "Active")) {
                        dbus_message_iter_get_basic(&value, &active);
 
                        DBG("%s Active %d", modem->path, active);
-               } else if (g_str_equal(key, "AccessPointName") == TRUE) {
+               } else if (g_str_equal(key, "AccessPointName")) {
                        const char *apn;
 
                        dbus_message_iter_get_basic(&value, &apn);
-                       if (apn != NULL && strlen(apn) > 0)
-                               modem->valid_apn = TRUE;
+                       if (apn && strlen(apn) > 0)
+                               modem->valid_apn = true;
                        else
-                               modem->valid_apn = FALSE;
+                               modem->valid_apn = false;
 
                        DBG("%s AccessPointName '%s'", modem->path, apn);
                }
@@ -1134,9 +1137,9 @@ static int add_cm_context(struct modem_data *modem, const char *context_path,
 
        g_hash_table_replace(context_hash, g_strdup(context_path), modem);
 
-       if (modem->valid_apn == TRUE && modem->attached == TRUE &&
+       if (modem->valid_apn && modem->attached &&
                        has_interface(modem->interfaces,
-                               OFONO_API_NETREG) == TRUE) {
+                               OFONO_API_NETREG)) {
                add_network(modem);
        }
 
@@ -1146,10 +1149,10 @@ static int add_cm_context(struct modem_data *modem, const char *context_path,
 static void remove_cm_context(struct modem_data *modem,
                                const char *context_path)
 {
-       if (modem->context == NULL)
+       if (!modem->context)
                return;
 
-       if (modem->network != NULL)
+       if (modem->network)
                remove_network(modem);
 
        g_hash_table_remove(context_hash, context_path);
@@ -1157,9 +1160,9 @@ static void remove_cm_context(struct modem_data *modem,
        network_context_free(modem->context);
        modem->context = NULL;
 
-       modem->valid_apn = FALSE;
+       modem->valid_apn = false;
 
-       if (modem->network != NULL)
+       if (modem->network)
                remove_network(modem);
 }
 
@@ -1175,10 +1178,10 @@ static gboolean context_changed(DBusConnection *conn,
        DBG("context_path %s", context_path);
 
        modem = g_hash_table_lookup(context_hash, context_path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1191,52 +1194,54 @@ static gboolean context_changed(DBusConnection *conn,
         * Active. Settings will always be send before Active = True.
         * That means we don't have to order here.
         */
-       if (g_str_equal(key, "Settings") == TRUE) {
+       if (g_str_equal(key, "Settings")) {
                DBG("%s Settings", modem->path);
 
                extract_ipv4_settings(&value, modem->context);
-       } else if (g_str_equal(key, "IPv6.Settings") == TRUE) {
+       } else if (g_str_equal(key, "IPv6.Settings")) {
                DBG("%s IPv6.Settings", modem->path);
 
                extract_ipv6_settings(&value, modem->context);
-       } else if (g_str_equal(key, "Active") == TRUE) {
-               dbus_message_iter_get_basic(&value, &modem->active);
+       } else if (g_str_equal(key, "Active")) {
+               dbus_bool_t active;
+
+               dbus_message_iter_get_basic(&value, &active);
+               modem->active = active;
 
                DBG("%s Active %d", modem->path, modem->active);
 
-               if (modem->active == TRUE)
+               if (modem->active)
                        set_connected(modem);
                else
                        set_disconnected(modem);
-       } else if (g_str_equal(key, "AccessPointName") == TRUE) {
+       } else if (g_str_equal(key, "AccessPointName")) {
                const char *apn;
 
                dbus_message_iter_get_basic(&value, &apn);
 
                DBG("%s AccessPointName %s", modem->path, apn);
 
-               if (apn != NULL && strlen(apn) > 0) {
-                       modem->valid_apn = TRUE;
+               if (apn && strlen(apn) > 0) {
+                       modem->valid_apn = true;
 
-                       if (modem->network != NULL)
+                       if (modem->network)
                                return TRUE;
 
-                       if (modem->attached == FALSE)
+                       if (!modem->attached)
                                return TRUE;
 
-                       if (has_interface(modem->interfaces,
-                                       OFONO_API_NETREG) == FALSE) {
+                       if (!has_interface(modem->interfaces,
+                                               OFONO_API_NETREG))
                                return TRUE;
-                       }
 
                        add_network(modem);
 
-                       if (modem->active == TRUE)
+                       if (modem->active)
                                set_connected(modem);
                } else {
-                       modem->valid_apn = FALSE;
+                       modem->valid_apn = false;
 
-                       if (modem->network == NULL)
+                       if (!modem->network)
                                return TRUE;
 
                        remove_network(modem);
@@ -1261,13 +1266,13 @@ static void cm_get_contexts_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                goto done;
 
        if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
@@ -1302,22 +1307,22 @@ static int cm_get_contexts(struct modem_data *modem)
 
        DBG("%s", modem->path);
 
-       if (modem->call_get_contexts != NULL)
+       if (modem->call_get_contexts)
                return -EBUSY;
 
        message = dbus_message_new_method_call(OFONO_SERVICE, modem->path,
                                        OFONO_CM_INTERFACE, GET_CONTEXTS);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                       &modem->call_get_contexts, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                       &modem->call_get_contexts, TIMEOUT)) {
                connman_error("Failed to call GetContexts()");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (modem->call_get_contexts == NULL) {
+       if (!modem->call_get_contexts) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
@@ -1344,10 +1349,10 @@ static gboolean cm_context_added(DBusConnection *conn,
        DBG("%s", path);
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &context_path);
@@ -1372,13 +1377,13 @@ static gboolean cm_context_removed(DBusConnection *conn,
 
        DBG("context path %s", path);
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &context_path);
 
        modem = g_hash_table_lookup(context_hash, context_path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
        remove_cm_context(modem, context_path);
@@ -1398,7 +1403,7 @@ static void netreg_update_name(struct modem_data *modem,
        g_free(modem->name);
        modem->name = g_strdup(name);
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
        connman_network_set_name(modem->network, modem->name);
@@ -1412,7 +1417,7 @@ static void netreg_update_strength(struct modem_data *modem,
 
        DBG("%s Strength %d", modem->path, modem->strength);
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
        /*
@@ -1443,7 +1448,7 @@ static void netreg_update_datastrength(struct modem_data *modem,
 
        DBG("%s Data Strength %d", modem->path, modem->data_strength);
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
        /*
@@ -1462,7 +1467,7 @@ static void netreg_update_status(struct modem_data *modem,
                                        DBusMessageIter *value)
 {
        char *status;
-       connman_bool_t roaming;
+       bool roaming;
 
        dbus_message_iter_get_basic(value, &status);
 
@@ -1474,7 +1479,7 @@ static void netreg_update_status(struct modem_data *modem,
 
        modem->roaming = roaming;
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
        connman_network_set_bool(modem->network,
@@ -1499,7 +1504,7 @@ static void netreg_update_regdom(struct modem_data *modem,
                return;
 
        alpha2 = mcc_country_codes[mcc - 200];
-       if (alpha2 != NULL)
+       if (alpha2)
                connman_technology_set_regdom(alpha2);
 }
 
@@ -1512,13 +1517,13 @@ static gboolean netreg_changed(DBusConnection *conn, DBusMessage *message,
        const char *key;
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (modem->ignore == TRUE)
+       if (modem->ignore)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1526,13 +1531,13 @@ static gboolean netreg_changed(DBusConnection *conn, DBusMessage *message,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Name") == TRUE)
+       if (g_str_equal(key, "Name"))
                netreg_update_name(modem, &value);
-       else if (g_str_equal(key, "Strength") == TRUE)
+       else if (g_str_equal(key, "Strength"))
                netreg_update_strength(modem, &value);
-       else if (g_str_equal(key, "Status") == TRUE)
+       else if (g_str_equal(key, "Status"))
                netreg_update_status(modem, &value);
-       else if (g_str_equal(key, "MobileCountryCode") == TRUE)
+       else if (g_str_equal(key, "MobileCountryCode"))
                netreg_update_regdom(modem, &value);
 
        return TRUE;
@@ -1553,19 +1558,19 @@ static void netreg_properties_reply(struct modem_data *modem,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Name") == TRUE)
+               if (g_str_equal(key, "Name"))
                        netreg_update_name(modem, &value);
-               else if (g_str_equal(key, "Strength") == TRUE)
+               else if (g_str_equal(key, "Strength"))
                        netreg_update_strength(modem, &value);
-               else if (g_str_equal(key, "Status") == TRUE)
+               else if (g_str_equal(key, "Status"))
                        netreg_update_status(modem, &value);
-               else if (g_str_equal(key, "MobileCountryCode") == TRUE)
+               else if (g_str_equal(key, "MobileCountryCode"))
                        netreg_update_regdom(modem, &value);
 
                dbus_message_iter_next(dict);
        }
 
-       if (modem->context == NULL) {
+       if (!modem->context) {
                /*
                 * netgreg_get_properties() was issued after we got
                 * cm_get_contexts_reply() where we create the
@@ -1577,10 +1582,10 @@ static void netreg_properties_reply(struct modem_data *modem,
                return;
        }
 
-       if (modem->valid_apn == TRUE)
+       if (modem->valid_apn)
                add_network(modem);
 
-       if (modem->active == TRUE)
+       if (modem->active)
                set_connected(modem);
 }
 
@@ -1593,22 +1598,22 @@ static int netreg_get_properties(struct modem_data *modem)
 static void add_cdma_network(struct modem_data *modem)
 {
        /* Be sure that device is created before adding CDMA network */
-       if (modem->device == NULL)
+       if (!modem->device)
                return;
 
        /*
         * CDMA modems don't need contexts for data call, however the current
         * add_network() logic needs one, so we create one to proceed.
         */
-       if (modem->context == NULL)
+       if (!modem->context)
                modem->context = network_context_alloc(modem->path);
 
-       if (modem->name == NULL)
+       if (!modem->name)
                modem->name = g_strdup("CDMA Network");
 
        add_network(modem);
 
-       if (modem->cdma_cm_powered == TRUE)
+       if (modem->cdma_cm_powered)
                set_connected(modem);
 }
 
@@ -1624,13 +1629,13 @@ static gboolean cdma_netreg_changed(DBusConnection *conn,
        DBG("");
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (modem->ignore == TRUE)
+       if (modem->ignore)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1638,16 +1643,16 @@ static gboolean cdma_netreg_changed(DBusConnection *conn,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Name") == TRUE)
+       if (g_str_equal(key, "Name"))
                netreg_update_name(modem, &value);
-       else if (g_str_equal(key, "Strength") == TRUE)
+       else if (g_str_equal(key, "Strength"))
                netreg_update_strength(modem, &value);
-       else if (g_str_equal(key, "DataStrength") == TRUE)
+       else if (g_str_equal(key, "DataStrength"))
                netreg_update_datastrength(modem, &value);
-       else if (g_str_equal(key, "Status") == TRUE)
+       else if (g_str_equal(key, "Status"))
                netreg_update_status(modem, &value);
 
-       if (modem->registered == TRUE)
+       if (modem->registered)
                add_cdma_network(modem);
        else
                remove_network(modem);
@@ -1670,19 +1675,19 @@ static void cdma_netreg_properties_reply(struct modem_data *modem,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Name") == TRUE)
+               if (g_str_equal(key, "Name"))
                        netreg_update_name(modem, &value);
-               else if (g_str_equal(key, "Strength") == TRUE)
+               else if (g_str_equal(key, "Strength"))
                        netreg_update_strength(modem, &value);
-               else if (g_str_equal(key, "DataStrength") == TRUE)
+               else if (g_str_equal(key, "DataStrength"))
                        netreg_update_datastrength(modem, &value);
-               else if (g_str_equal(key, "Status") == TRUE)
+               else if (g_str_equal(key, "Status"))
                        netreg_update_status(modem, &value);
 
                dbus_message_iter_next(dict);
        }
 
-       if (modem->registered == TRUE)
+       if (modem->registered)
                add_cdma_network(modem);
        else
                remove_network(modem);
@@ -1697,19 +1702,20 @@ static int cdma_netreg_get_properties(struct modem_data *modem)
 static void cm_update_attached(struct modem_data *modem,
                                DBusMessageIter *value)
 {
-       dbus_message_iter_get_basic(value, &modem->attached);
+       dbus_bool_t attached;
+
+       dbus_message_iter_get_basic(value, &attached);
+       modem->attached = attached;
 
        DBG("%s Attached %d", modem->path, modem->attached);
 
-       if (modem->attached == FALSE) {
+       if (!modem->attached) {
                remove_network(modem);
                return;
        }
 
-       if (has_interface(modem->interfaces,
-                               OFONO_API_NETREG) == FALSE) {
+       if (!has_interface(modem->interfaces, OFONO_API_NETREG))
                return;
-       }
 
        netreg_get_properties(modem);
 }
@@ -1717,12 +1723,15 @@ static void cm_update_attached(struct modem_data *modem,
 static void cm_update_powered(struct modem_data *modem,
                                DBusMessageIter *value)
 {
-       dbus_message_iter_get_basic(value, &modem->cm_powered);
+       dbus_bool_t cm_powered;
+
+       dbus_message_iter_get_basic(value, &cm_powered);
+       modem->cm_powered = cm_powered;
 
        DBG("%s ConnnectionManager Powered %d", modem->path,
                modem->cm_powered);
 
-       if (modem->cm_powered == TRUE)
+       if (modem->cm_powered)
                return;
 
        cm_set_powered(modem, TRUE);
@@ -1737,13 +1746,13 @@ static gboolean cm_changed(DBusConnection *conn, DBusMessage *message,
        const char *key;
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (modem->ignore == TRUE)
+       if (modem->ignore)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1751,9 +1760,9 @@ static gboolean cm_changed(DBusConnection *conn, DBusMessage *message,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Attached") == TRUE)
+       if (g_str_equal(key, "Attached"))
                cm_update_attached(modem, &value);
-       else if (g_str_equal(key, "Powered") == TRUE)
+       else if (g_str_equal(key, "Powered"))
                cm_update_powered(modem, &value);
 
        return TRUE;
@@ -1762,14 +1771,17 @@ static gboolean cm_changed(DBusConnection *conn, DBusMessage *message,
 static void cdma_cm_update_powered(struct modem_data *modem,
                                        DBusMessageIter *value)
 {
-       dbus_message_iter_get_basic(value, &modem->cdma_cm_powered);
+       dbus_bool_t cdma_cm_powered;
+
+       dbus_message_iter_get_basic(value, &cdma_cm_powered);
+       modem->cdma_cm_powered = cdma_cm_powered;
 
        DBG("%s CDMA cm Powered %d", modem->path, modem->cdma_cm_powered);
 
-       if (modem->network == NULL)
+       if (!modem->network)
                return;
 
-       if (modem->cdma_cm_powered == TRUE)
+       if (modem->cdma_cm_powered)
                set_connected(modem);
        else
                set_disconnected(modem);
@@ -1792,13 +1804,13 @@ static gboolean cdma_cm_changed(DBusConnection *conn,
        const char *key;
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (modem->online == TRUE && modem->network == NULL)
+       if (modem->online && !modem->network)
                cdma_netreg_get_properties(modem);
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1806,9 +1818,9 @@ static gboolean cdma_cm_changed(DBusConnection *conn,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Powered") == TRUE)
+       if (g_str_equal(key, "Powered"))
                cdma_cm_update_powered(modem, &value);
-       if (g_str_equal(key, "Settings") == TRUE)
+       if (g_str_equal(key, "Settings"))
                cdma_cm_update_settings(modem, &value);
 
        return TRUE;
@@ -1828,9 +1840,9 @@ static void cm_properties_reply(struct modem_data *modem, DBusMessageIter *dict)
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Attached") == TRUE)
+               if (g_str_equal(key, "Attached"))
                        cm_update_attached(modem, &value);
-               else if (g_str_equal(key, "Powered") == TRUE)
+               else if (g_str_equal(key, "Powered"))
                        cm_update_powered(modem, &value);
 
                dbus_message_iter_next(dict);
@@ -1848,7 +1860,7 @@ static void cdma_cm_properties_reply(struct modem_data *modem,
 {
        DBG("%s", modem->path);
 
-       if (modem->online == TRUE)
+       if (modem->online)
                cdma_netreg_get_properties(modem);
 
        while (dbus_message_iter_get_arg_type(dict) == DBUS_TYPE_DICT_ENTRY) {
@@ -1861,9 +1873,9 @@ static void cdma_cm_properties_reply(struct modem_data *modem,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Powered") == TRUE)
+               if (g_str_equal(key, "Powered"))
                        cdma_cm_update_powered(modem, &value);
-               if (g_str_equal(key, "Settings") == TRUE)
+               if (g_str_equal(key, "Settings"))
                        cdma_cm_update_settings(modem, &value);
 
                dbus_message_iter_next(dict);
@@ -1877,7 +1889,7 @@ static int cdma_cm_get_properties(struct modem_data *modem)
 }
 
 static void sim_update_imsi(struct modem_data *modem,
-                               DBusMessageItervalue)
+                               DBusMessageIter *value)
 {
        char *imsi;
 
@@ -1898,13 +1910,13 @@ static gboolean sim_changed(DBusConnection *conn, DBusMessage *message,
        const char *key;
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (modem->ignore == TRUE)
+       if (modem->ignore)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1912,10 +1924,10 @@ static gboolean sim_changed(DBusConnection *conn, DBusMessage *message,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "SubscriberIdentity") == TRUE) {
+       if (g_str_equal(key, "SubscriberIdentity")) {
                sim_update_imsi(modem, &value);
 
-               if (ready_to_create_device(modem) == FALSE)
+               if (!ready_to_create_device(modem))
                        return TRUE;
 
                /*
@@ -1945,10 +1957,10 @@ static void sim_properties_reply(struct modem_data *modem,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "SubscriberIdentity") == TRUE) {
+               if (g_str_equal(key, "SubscriberIdentity")) {
                        sim_update_imsi(modem, &value);
 
-                       if (ready_to_create_device(modem) == FALSE)
+                       if (!ready_to_create_device(modem))
                                return;
 
                        /*
@@ -1959,7 +1971,7 @@ static void sim_properties_reply(struct modem_data *modem,
                         */
                        create_device(modem);
 
-                       if (modem->online == FALSE)
+                       if (!modem->online)
                                return;
 
                        /*
@@ -1968,7 +1980,7 @@ static void sim_properties_reply(struct modem_data *modem,
                         * state machine will not go to next step. We have to
                         * trigger it from here.
                         */
-                       if (has_interface(modem->interfaces, OFONO_API_CM) == TRUE) {
+                       if (has_interface(modem->interfaces, OFONO_API_CM)) {
                                cm_get_properties(modem);
                                cm_get_contexts(modem);
                        }
@@ -1985,28 +1997,28 @@ static int sim_get_properties(struct modem_data *modem)
                                sim_properties_reply, modem);
 }
 
-static connman_bool_t api_added(uint8_t old_iface, uint8_t new_iface,
+static bool api_added(uint8_t old_iface, uint8_t new_iface,
                                enum ofono_api api)
 {
-       if (has_interface(old_iface, api) == FALSE &&
-                       has_interface(new_iface, api) == TRUE) {
+       if (!has_interface(old_iface, api) &&
+                       has_interface(new_iface, api)) {
                DBG("%s added", api2string(api));
-               return TRUE;
+               return true;
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t api_removed(uint8_t old_iface, uint8_t new_iface,
+static bool api_removed(uint8_t old_iface, uint8_t new_iface,
                                enum ofono_api api)
 {
-       if (has_interface(old_iface, api) == TRUE &&
-                       has_interface(new_iface, api) == FALSE) {
+       if (has_interface(old_iface, api) &&
+                       !has_interface(new_iface, api)) {
                DBG("%s removed", api2string(api));
-               return TRUE;
+               return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 static void modem_update_interfaces(struct modem_data *modem,
@@ -2015,9 +2027,9 @@ static void modem_update_interfaces(struct modem_data *modem,
 {
        DBG("%s", modem->path);
 
-       if (api_added(old_ifaces, new_ifaces, OFONO_API_SIM) == TRUE) {
-               if (modem->imsi == NULL &&
-                               modem->set_powered == FALSE) {
+       if (api_added(old_ifaces, new_ifaces, OFONO_API_SIM)) {
+               if (!modem->imsi &&
+                               !modem->set_powered) {
                        /*
                         * Only use do GetProperties() when
                         * device has not been powered up.
@@ -2026,48 +2038,43 @@ static void modem_update_interfaces(struct modem_data *modem,
                }
        }
 
-       if (api_added(old_ifaces, new_ifaces, OFONO_API_CM) == TRUE) {
-               if (modem->device != NULL) {
+       if (api_added(old_ifaces, new_ifaces, OFONO_API_CM)) {
+               if (modem->device) {
                        cm_get_properties(modem);
                        cm_get_contexts(modem);
                }
        }
 
-       if (api_added(old_ifaces, new_ifaces, OFONO_API_CDMA_CM) == TRUE) {
-               if (ready_to_create_device(modem) == TRUE) {
+       if (api_added(old_ifaces, new_ifaces, OFONO_API_CDMA_CM)) {
+               if (ready_to_create_device(modem)) {
                        create_device(modem);
-                       if (modem->registered == TRUE)
+                       if (modem->registered)
                                add_cdma_network(modem);
                }
 
-               if (modem->device != NULL)
+               if (modem->device)
                        cdma_cm_get_properties(modem);
        }
 
-       if (api_added(old_ifaces, new_ifaces, OFONO_API_NETREG) == TRUE) {
-               if (modem->attached == TRUE)
+       if (api_added(old_ifaces, new_ifaces, OFONO_API_NETREG)) {
+               if (modem->attached)
                        netreg_get_properties(modem);
        }
 
-       if (api_added(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG) == TRUE) {
+       if (api_added(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG))
                cdma_netreg_get_properties(modem);
-       }
 
-       if (api_removed(old_ifaces, new_ifaces, OFONO_API_CM) == TRUE) {
+       if (api_removed(old_ifaces, new_ifaces, OFONO_API_CM))
                remove_cm_context(modem, modem->context->path);
-       }
 
-       if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_CM) == TRUE) {
+       if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_CM))
                remove_cm_context(modem, modem->context->path);
-       }
 
-       if (api_removed(old_ifaces, new_ifaces, OFONO_API_NETREG) == TRUE) {
+       if (api_removed(old_ifaces, new_ifaces, OFONO_API_NETREG))
                remove_network(modem);
-       }
 
-       if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG == TRUE)) {
+       if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG))
                remove_network(modem);
-       }
 }
 
 static gboolean modem_changed(DBusConnection *conn, DBusMessage *message,
@@ -2079,13 +2086,13 @@ static gboolean modem_changed(DBusConnection *conn, DBusMessage *message,
        const char *key;
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem == NULL)
+       if (!modem)
                return TRUE;
 
-       if (modem->ignore == TRUE)
+       if (modem->ignore)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -2093,23 +2100,29 @@ static gboolean modem_changed(DBusConnection *conn, DBusMessage *message,
        dbus_message_iter_next(&iter);
        dbus_message_iter_recurse(&iter, &value);
 
-       if (g_str_equal(key, "Powered") == TRUE) {
-               dbus_message_iter_get_basic(&value, &modem->powered);
+       if (g_str_equal(key, "Powered")) {
+               dbus_bool_t powered;
+
+               dbus_message_iter_get_basic(&value, &powered);
+               modem->powered = powered;
 
                DBG("%s Powered %d", modem->path, modem->powered);
 
-               if (modem->powered == FALSE)
+               if (!modem->powered)
                        modem_set_powered(modem, TRUE);
-       } else if (g_str_equal(key, "Online") == TRUE) {
-               dbus_message_iter_get_basic(&value, &modem->online);
+       } else if (g_str_equal(key, "Online")) {
+               dbus_bool_t online;
+
+               dbus_message_iter_get_basic(&value, &online);
+               modem->online = online;
 
                DBG("%s Online %d", modem->path, modem->online);
 
-               if (modem->device == NULL)
+               if (!modem->device)
                        return TRUE;
 
                connman_device_set_powered(modem->device, modem->online);
-       } else if (g_str_equal(key, "Interfaces") == TRUE) {
+       } else if (g_str_equal(key, "Interfaces")) {
                uint8_t interfaces;
 
                interfaces = extract_interfaces(&value);
@@ -2122,7 +2135,7 @@ static gboolean modem_changed(DBusConnection *conn, DBusMessage *message,
                modem_update_interfaces(modem, modem->interfaces, interfaces);
 
                modem->interfaces = interfaces;
-       } else if (g_str_equal(key, "Serial") == TRUE) {
+       } else if (g_str_equal(key, "Serial")) {
                char *serial;
 
                dbus_message_iter_get_basic(&value, &serial);
@@ -2133,10 +2146,10 @@ static gboolean modem_changed(DBusConnection *conn, DBusMessage *message,
                DBG("%s Serial %s", modem->path, modem->serial);
 
                if (has_interface(modem->interfaces,
-                                        OFONO_API_CDMA_CM) == TRUE) {
-                       if (ready_to_create_device(modem) == TRUE) {
+                                        OFONO_API_CDMA_CM)) {
+                       if (ready_to_create_device(modem)) {
                                create_device(modem);
-                               if (modem->registered == TRUE)
+                               if (modem->registered)
                                        add_cdma_network(modem);
                        }
                }
@@ -2152,7 +2165,7 @@ static void add_modem(const char *path, DBusMessageIter *prop)
        DBG("%s", path);
 
        modem = g_hash_table_lookup(modem_hash, path);
-       if (modem != NULL) {
+       if (modem) {
                /*
                 * When oFono powers up we ask for the modems and oFono is
                 * reporting with modem_added signal the modems. Only
@@ -2162,7 +2175,7 @@ static void add_modem(const char *path, DBusMessageIter *prop)
        }
 
        modem = g_try_new0(struct modem_data, 1);
-       if (modem == NULL)
+       if (!modem)
                return;
 
        modem->path = g_strdup(path);
@@ -2179,27 +2192,33 @@ static void add_modem(const char *path, DBusMessageIter *prop)
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Powered") == TRUE) {
-                       dbus_message_iter_get_basic(&value, &modem->powered);
+               if (g_str_equal(key, "Powered")) {
+                       dbus_bool_t powered;
+
+                       dbus_message_iter_get_basic(&value, &powered);
+                       modem->powered = powered;
 
                        DBG("%s Powered %d", modem->path, modem->powered);
-               } else if (g_str_equal(key, "Online") == TRUE) {
-                       dbus_message_iter_get_basic(&value, &modem->online);
+               } else if (g_str_equal(key, "Online")) {
+                       dbus_bool_t online;
+
+                       dbus_message_iter_get_basic(&value, &online);
+                       modem->online = online;
 
                        DBG("%s Online %d", modem->path, modem->online);
-               } else if (g_str_equal(key, "Interfaces") == TRUE) {
+               } else if (g_str_equal(key, "Interfaces")) {
                        modem->interfaces = extract_interfaces(&value);
 
                        DBG("%s Interfaces 0x%02x", modem->path,
                                modem->interfaces);
-               } else if (g_str_equal(key, "Serial") == TRUE) {
+               } else if (g_str_equal(key, "Serial")) {
                        char *serial;
 
                        dbus_message_iter_get_basic(&value, &serial);
                        modem->serial = g_strdup(serial);
 
                        DBG("%s Serial %s", modem->path, modem->serial);
-               } else if (g_str_equal(key, "Type") == TRUE) {
+               } else if (g_str_equal(key, "Type")) {
                        char *type;
 
                        dbus_message_iter_get_basic(&value, &type);
@@ -2207,17 +2226,17 @@ static void add_modem(const char *path, DBusMessageIter *prop)
                        DBG("%s Type %s", modem->path, type);
                        if (g_strcmp0(type, "hardware") != 0) {
                                DBG("%s Ignore this modem", modem->path);
-                               modem->ignore = TRUE;
+                               modem->ignore = true;
                        }
                }
 
                dbus_message_iter_next(prop);
        }
 
-       if (modem->ignore == TRUE)
+       if (modem->ignore)
                return;
 
-       if (modem->powered == FALSE) {
+       if (!modem->powered) {
                modem_set_powered(modem, TRUE);
                return;
        }
@@ -2231,7 +2250,7 @@ static void modem_power_down(gpointer key, gpointer value, gpointer user_data)
 
        DBG("%s", modem->path);
 
-       if (modem->ignore ==  TRUE)
+       if (modem->ignore)
                return;
 
        modem_set_powered(modem, FALSE);
@@ -2243,19 +2262,19 @@ static void remove_modem(gpointer data)
 
        DBG("%s", modem->path);
 
-       if (modem->call_set_property != NULL)
+       if (modem->call_set_property)
                dbus_pending_call_cancel(modem->call_set_property);
 
-       if (modem->call_get_properties != NULL)
+       if (modem->call_get_properties)
                dbus_pending_call_cancel(modem->call_get_properties);
 
-       if (modem->call_get_contexts != NULL)
+       if (modem->call_get_contexts)
                dbus_pending_call_cancel(modem->call_get_contexts);
 
-       if (modem->device != NULL)
+       if (modem->device)
                destroy_device(modem);
 
-       if (modem->context != NULL)
+       if (modem->context)
                remove_cm_context(modem, modem->context->path);
 
        g_free(modem->serial);
@@ -2274,7 +2293,7 @@ static gboolean modem_added(DBusConnection *conn,
 
        DBG("");
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &path);
@@ -2295,7 +2314,7 @@ static gboolean modem_removed(DBusConnection *conn,
 
        DBG("");
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &path);
@@ -2317,13 +2336,13 @@ static void manager_get_modems_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                goto done;
 
        dbus_message_iter_recurse(&array, &dict);
@@ -2358,17 +2377,17 @@ static int manager_get_modems(void)
 
        message = dbus_message_new_method_call(OFONO_SERVICE, "/",
                                        OFONO_MANAGER_INTERFACE, GET_MODEMS);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                              &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                connman_error("Failed to call GetModems()");
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                connman_error("D-Bus connection not available");
                dbus_message_unref(message);
                return -EINVAL;
@@ -2388,12 +2407,12 @@ static void ofono_connect(DBusConnection *conn, void *user_data)
 
        modem_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                g_free, remove_modem);
-       if (modem_hash == NULL)
+       if (!modem_hash)
                return;
 
        context_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                g_free, NULL);
-       if (context_hash == NULL) {
+       if (!context_hash) {
                g_hash_table_destroy(modem_hash);
                return;
        }
@@ -2405,7 +2424,7 @@ static void ofono_disconnect(DBusConnection *conn, void *user_data)
 {
        DBG("");
 
-       if (modem_hash == NULL || context_hash == NULL)
+       if (!modem_hash || !context_hash)
                return;
 
        g_hash_table_destroy(modem_hash);
@@ -2437,9 +2456,9 @@ static int network_connect(struct connman_network *network)
 
        DBG("%s network %p", modem->path, network);
 
-       if (has_interface(modem->interfaces, OFONO_API_CM) == TRUE)
+       if (has_interface(modem->interfaces, OFONO_API_CM))
                return context_set_active(modem, TRUE);
-       else if (has_interface(modem->interfaces, OFONO_API_CDMA_CM) == TRUE)
+       else if (has_interface(modem->interfaces, OFONO_API_CDMA_CM))
                return cdma_cm_set_powered(modem, TRUE);
 
        connman_error("Connection manager interface not available");
@@ -2453,9 +2472,9 @@ static int network_disconnect(struct connman_network *network)
 
        DBG("%s network %p", modem->path, network);
 
-       if (has_interface(modem->interfaces, OFONO_API_CM) == TRUE)
+       if (has_interface(modem->interfaces, OFONO_API_CM))
                return context_set_active(modem, FALSE);
-       else if (has_interface(modem->interfaces, OFONO_API_CDMA_CM) == TRUE)
+       else if (has_interface(modem->interfaces, OFONO_API_CDMA_CM))
                return cdma_cm_set_powered(modem, FALSE);
 
        connman_error("Connection manager interface not available");
@@ -2494,7 +2513,7 @@ static int modem_enable(struct connman_device *device)
 
        DBG("%s device %p", modem->path, device);
 
-       if (modem->online == TRUE)
+       if (modem->online)
                return 0;
 
        return modem_set_online(modem, TRUE);
@@ -2506,7 +2525,7 @@ static int modem_disable(struct connman_device *device)
 
        DBG("%s device %p", modem->path, device);
 
-       if (modem->online == FALSE)
+       if (!modem->online)
                return 0;
 
        return modem_set_online(modem, FALSE);
@@ -2557,7 +2576,7 @@ static int ofono_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        watch = g_dbus_add_service_watch(connection,
@@ -2685,7 +2704,7 @@ static void ofono_exit(void)
 {
        DBG("");
 
-       if (modem_hash != NULL) {
+       if (modem_hash) {
                /*
                 * We should propably wait for the SetProperty() reply
                 * message, because ...
@@ -2699,7 +2718,7 @@ static void ofono_exit(void)
                modem_hash = NULL;
        }
 
-       if (context_hash != NULL) {
+       if (context_hash) {
                g_hash_table_destroy(context_hash);
                context_hash = NULL;
        }
index 418dce2..850139f 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -67,8 +67,8 @@ static void create_config_reply(DBusPendingCall *call, void *user_data)
                goto done;
        }
 
-       if (dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, &path,
-                                               DBUS_TYPE_INVALID) == FALSE)
+       if (!dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH,
+                                       &path, DBUS_TYPE_INVALID))
                goto done;
 
        g_free(current_config);
@@ -88,7 +88,7 @@ static void append_string_list(DBusMessageIter *iter, void *user_data)
        char **list = user_data;
        int i;
 
-       for (i = 0; list[i] != NULL; i++)
+       for (i = 0; list[i]; i++)
                dbus_message_iter_append_basic(iter,
                                        DBUS_TYPE_STRING, &list[i]);
 }
@@ -104,14 +104,14 @@ static void create_proxy_configuration(void)
        const char *str;
        char **str_list;
 
-       if (default_service == NULL)
+       if (!default_service)
                return;
 
        DBG("");
 
        msg = dbus_message_new_method_call(PACRUNNER_SERVICE, PACRUNNER_PATH,
                        PACRUNNER_INTERFACE, "CreateProxyConfiguration");
-       if (msg == NULL)
+       if (!msg)
                return;
 
        dbus_message_set_auto_start(msg, FALSE);
@@ -130,7 +130,7 @@ static void create_proxy_configuration(void)
                method = "manual";
 
                str_list = connman_service_get_proxy_servers(default_service);
-               if (str_list == NULL) {
+               if (!str_list) {
                        connman_dbus_dict_close(&iter, &dict);
                        goto done;
                }
@@ -141,7 +141,7 @@ static void create_proxy_configuration(void)
                g_strfreev(str_list);
 
                str_list = connman_service_get_proxy_excludes(default_service);
-               if (str_list == NULL)
+               if (!str_list)
                        break;
 
                connman_dbus_dict_append_array(&dict, "Excludes",
@@ -154,10 +154,10 @@ static void create_proxy_configuration(void)
                method = "auto";
 
                str = connman_service_get_proxy_url(default_service);
-               if (str == NULL) {
+               if (!str) {
                        str = connman_service_get_proxy_autoconfig(
                                                        default_service);
-                       if (str == NULL) {
+                       if (!str) {
                                connman_dbus_dict_close(&iter, &dict);
                                goto done;
                        }
@@ -172,19 +172,19 @@ static void create_proxy_configuration(void)
                                DBUS_TYPE_STRING, &method);
 
        interface = connman_service_get_interface(default_service);
-       if (interface != NULL) {
+       if (interface) {
                connman_dbus_dict_append_basic(&dict, "Interface",
                                                DBUS_TYPE_STRING, &interface);
                g_free(interface);
        }
 
        str = connman_service_get_domainname(default_service);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_array(&dict, "Domains",
                                        DBUS_TYPE_STRING, append_string, &str);
 
        str_list = connman_service_get_nameservers(default_service);
-       if (str_list != NULL)
+       if (str_list)
                connman_dbus_dict_append_array(&dict, "Nameservers",
                                        DBUS_TYPE_STRING, append_string_list,
                                        str_list);
@@ -195,7 +195,7 @@ static void create_proxy_configuration(void)
        result = dbus_connection_send_with_reply(connection, msg,
                                                        &call, DBUS_TIMEOUT);
 
-       if (result == FALSE || call == NULL)
+       if (!result || !call)
                goto done;
 
        dbus_pending_call_set_notify(call, create_config_reply, NULL, NULL);
@@ -224,14 +224,14 @@ static void destroy_proxy_configuration(void)
        DBusPendingCall *call;
        dbus_bool_t result;
 
-       if (current_config == NULL)
+       if (!current_config)
                return;
 
        DBG("");
 
        msg = dbus_message_new_method_call(PACRUNNER_SERVICE, PACRUNNER_PATH,
                        PACRUNNER_INTERFACE, "DestroyProxyConfiguration");
-       if (msg == NULL)
+       if (!msg)
                return;
 
        dbus_message_set_auto_start(msg, FALSE);
@@ -244,7 +244,7 @@ static void destroy_proxy_configuration(void)
 
        dbus_message_unref(msg);
 
-       if (result == FALSE || call == NULL)
+       if (!result || !call)
                return;
 
        dbus_pending_call_set_notify(call, destroy_config_reply, NULL, NULL);
@@ -264,7 +264,7 @@ static void default_service_changed(struct connman_service *service)
 
        default_service = service;
 
-       if (daemon_running == FALSE)
+       if (!daemon_running)
                return;
 
        destroy_proxy_configuration();
@@ -279,7 +279,7 @@ static void proxy_changed(struct connman_service *service)
        if (service != default_service)
                return;
 
-       if (daemon_running == FALSE)
+       if (!daemon_running)
                return;
 
        destroy_proxy_configuration();
@@ -317,18 +317,18 @@ static char * parse_url(const char *url)
        char *scheme, *host, *path, *host_ret;
 
        scheme = g_strdup(url);
-       if (scheme == NULL)
+       if (!scheme)
                return NULL;
 
        host = strstr(scheme, "://");
-       if (host != NULL) {
+       if (host) {
                *host = '\0';
                host += 3;
        } else
                host = scheme;
 
        path = strchr(host, '/');
-       if (path != NULL)
+       if (path)
                *(path++) = '\0';
 
        host_ret = g_strdup(host);
@@ -352,8 +352,8 @@ static void request_lookup_reply(DBusPendingCall *call, void *user_data)
                goto done;
        }
 
-       if (dbus_message_get_args(reply, NULL, DBUS_TYPE_STRING, &proxy,
-                                               DBUS_TYPE_INVALID) == FALSE)
+       if (!dbus_message_get_args(reply, NULL, DBUS_TYPE_STRING,
+                                       &proxy, DBUS_TYPE_INVALID))
                proxy = NULL;
 
 done:
@@ -377,24 +377,21 @@ static int request_lookup(struct connman_service *service, const char *url)
 
        DBG("");
 
-       if (daemon_running == FALSE)
-               return -EINVAL;
-
        msg = dbus_message_new_method_call(PACRUNNER_SERVICE,
                                                PACRUNNER_CLIENT_PATH,
                                                PACRUNNER_CLIENT_INTERFACE,
                                                "FindProxyForURL");
-       if (msg == NULL)
+       if (!msg)
                return -1;
 
        host = parse_url(url);
-       if (host == NULL) {
+       if (!host) {
                dbus_message_unref(msg);
                return -EINVAL;
        }
 
        data = g_try_new0(struct proxy_data, 1);
-       if (data == NULL) {
+       if (!data) {
                dbus_message_unref(msg);
                g_free(host);
                return -ENOMEM;
@@ -403,8 +400,6 @@ static int request_lookup(struct connman_service *service, const char *url)
        data->url = g_strdup(url);
        data->service = connman_service_ref(service);
 
-       dbus_message_set_auto_start(msg, FALSE);
-
        dbus_message_append_args(msg, DBUS_TYPE_STRING, &url,
                                        DBUS_TYPE_STRING, &host,
                                        DBUS_TYPE_INVALID);
@@ -414,7 +409,7 @@ static int request_lookup(struct connman_service *service, const char *url)
 
        dbus_message_unref(msg);
 
-       if (result == FALSE || call == NULL) {
+       if (!result || !call) {
                g_free(host);
                g_free(data->url);
                g_free(data);
@@ -447,7 +442,7 @@ static guint pacrunner_watch;
 static int pacrunner_init(void)
 {
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        pacrunner_watch = g_dbus_add_service_watch(connection,
index 8a25c3c..4e8b5f2 100644 (file)
@@ -42,6 +42,8 @@
 #include <connman/dbus.h>
 #include <connman/inotify.h>
 
+#include "src/shared/util.h"
+
 #define POLICYDIR STORAGEDIR "/session_policy_local"
 
 #define MODE           (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | \
@@ -168,11 +170,13 @@ static void finish_create(struct policy_config *policy,
                                connman_session_config_func_t cb,
                                void *user_data)
 {
-       struct policy_group *group;
+       struct policy_group *group = NULL;
        GSList *list;
 
-       group = g_hash_table_lookup(selinux_hash, policy->selinux);
-       if (group != NULL) {
+       if (policy->selinux)
+               group = g_hash_table_lookup(selinux_hash, policy->selinux);
+
+       if (group) {
                set_policy(policy, group);
 
                policy->config->id_type = CONNMAN_SESSION_ID_TYPE_LSM;
@@ -180,8 +184,10 @@ static void finish_create(struct policy_config *policy,
                goto done;
        }
 
-       group = g_hash_table_lookup(uid_hash, policy->uid);
-       if (group != NULL) {
+       if (policy->uid)
+               group = g_hash_table_lookup(uid_hash, policy->uid);
+
+       if (group) {
                set_policy(policy, group);
 
                policy->config->id_type = CONNMAN_SESSION_ID_TYPE_UID;
@@ -189,11 +195,11 @@ static void finish_create(struct policy_config *policy,
                goto done;
        }
 
-       for (list = policy->gids; list != NULL; list = list->next) {
+       for (list = policy->gids; list; list = list->next) {
                char *gid = list->data;
 
                group = g_hash_table_lookup(gid_hash, gid);
-               if (group == NULL)
+               if (!group)
                        continue;
 
                set_policy(policy, group);
@@ -227,8 +233,14 @@ static void selinux_context_reply(const unsigned char *context, void *user_data,
 
        DBG("session %p", policy->session);
 
+       if (err == -EIO) {
+               /* No SELinux support, drop back to UID/GID only mode */
+               finish_create(policy, cb, cbd->user_data);
+               goto done;
+       }
+
        if (err < 0) {
-               failed_create(policy, cb, user_data, err);
+               failed_create(policy, cb, cbd->user_data, err);
                goto done;
        }
 
@@ -236,7 +248,7 @@ static void selinux_context_reply(const unsigned char *context, void *user_data,
 
        policy->selinux_context = g_strdup((const char *)context);
        ident = parse_selinux_type(policy->selinux_context);
-       if (ident != NULL)
+       if (ident)
                policy->selinux = g_strdup(ident);
 
        finish_create(policy, cb, cbd->user_data);
@@ -265,7 +277,7 @@ static void get_uid_reply(unsigned int uid, void *user_data, int err)
        }
 
        pwd = getpwuid((uid_t)uid);
-       if (pwd == NULL) {
+       if (!pwd) {
                if (errno != 0)
                        err = -errno;
                else
@@ -278,7 +290,7 @@ static void get_uid_reply(unsigned int uid, void *user_data, int err)
        nrgroups = 0;
        getgrouplist(pwd->pw_name, pwd->pw_gid, NULL, &nrgroups);
        groups = g_try_new0(gid_t, nrgroups);
-       if (groups == NULL) {
+       if (!groups) {
                err = -ENOMEM;
                goto err;
        }
@@ -289,7 +301,7 @@ static void get_uid_reply(unsigned int uid, void *user_data, int err)
 
        for (i = 0; i < nrgroups; i++) {
                grp = getgrgid(groups[i]);
-               if (grp == NULL) {
+               if (!grp) {
                        if (errno != 0)
                                err = -errno;
                        else
@@ -321,7 +333,7 @@ static void get_uid_reply(unsigned int uid, void *user_data, int err)
        return;
 
 err:
-       failed_create(NULL, cb, user_data, err);
+       failed_create(NULL, cb, cbd->user_data, err);
        g_free(cbd);
        g_free(groups);
 }
@@ -364,7 +376,7 @@ static void policy_local_destroy(struct connman_session *session)
        DBG("session %p", session);
 
        policy = g_hash_table_lookup(session_hash, session);
-       if (policy == NULL)
+       if (!policy)
                return;
 
        g_hash_table_remove(session_hash, session);
@@ -384,7 +396,7 @@ static int load_keyfile(const char *pathname, GKeyFile **keyfile)
 
        *keyfile = g_key_file_new();
 
-       if (g_key_file_load_from_file(*keyfile, pathname, 0, &error) == FALSE)
+       if (!g_key_file_load_from_file(*keyfile, pathname, 0, &error))
                goto err;
 
        return 0;
@@ -421,7 +433,7 @@ static int load_policy(GKeyFile *keyfile, const char *groupname,
        group->uid = g_key_file_get_string(keyfile, groupname,
                                                "uid", NULL);
 
-       if (group->selinux == NULL && group->gid == NULL && group->uid == NULL)
+       if (!group->selinux && !group->gid && !group->uid)
                return -EINVAL;
 
        config->priority = g_key_file_get_boolean(keyfile, groupname,
@@ -429,14 +441,14 @@ static int load_policy(GKeyFile *keyfile, const char *groupname,
 
        str = g_key_file_get_string(keyfile, groupname, "RoamingPolicy",
                                NULL);
-       if (str != NULL) {
+       if (str) {
                config->roaming_policy = connman_session_parse_roaming_policy(str);
                g_free(str);
        }
 
        str = g_key_file_get_string(keyfile, groupname, "ConnectionType",
                                NULL);
-       if (str != NULL) {
+       if (str) {
                config->type = connman_session_parse_connection_type(str);
                g_free(str);
        }
@@ -446,10 +458,10 @@ static int load_policy(GKeyFile *keyfile, const char *groupname,
 
        str = g_key_file_get_string(keyfile, groupname, "AllowedBearers",
                                NULL);
-       if (str != NULL) {
+       if (str) {
                tokens = g_strsplit(str, " ", 0);
 
-               for (i = 0; tokens[i] != NULL; i++) {
+               for (i = 0; tokens[i]; i++) {
                        err = connman_session_parse_bearers(tokens[i],
                                        &config->allowed_bearers);
                        if (err < 0)
@@ -470,7 +482,7 @@ static void update_session(struct policy_config *policy)
 {
        DBG("policy %p session %p", policy, policy->session);
 
-       if (policy->session == NULL)
+       if (!policy->session)
                return;
 
        if (connman_session_config_update(policy->session) < 0)
@@ -492,7 +504,7 @@ static void cleanup_config(gpointer user_data)
 
        DBG("policy %p group %p", policy, policy->group);
 
-       if (policy->group != NULL)
+       if (policy->group)
                policy->group->sessions =
                        g_slist_remove(policy->group->sessions, policy);
 
@@ -517,11 +529,11 @@ static void cleanup_group(gpointer user_data)
        g_slist_free(group->config->allowed_bearers);
        g_free(group->config->id);
        g_free(group->config);
-       if (group->selinux != NULL)
+       if (group->selinux)
                g_hash_table_remove(selinux_hash, group->selinux);
-       if (group->uid != NULL)
+       if (group->uid)
                g_hash_table_remove(uid_hash, group->uid);
-       if (group->gid != NULL)
+       if (group->gid)
                g_hash_table_remove(gid_hash, group->gid);
        g_free(group->selinux);
        g_free(group->uid);
@@ -547,14 +559,16 @@ static void recheck_sessions(void)
        GSList *list;
 
        g_hash_table_iter_init(&iter, session_hash);
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct policy_config *policy = value;
 
-               if (policy->group != NULL)
+               if (policy->group)
                        continue;
 
-               group = g_hash_table_lookup(selinux_hash, policy->selinux);
-               if (group != NULL) {
+               if (policy->selinux)
+                       group = g_hash_table_lookup(selinux_hash,
+                                                       policy->selinux);
+               if (group) {
                        policy->config->id_type = CONNMAN_SESSION_ID_TYPE_LSM;
                        g_free(policy->config->id);
                        policy->config->id = g_strdup(policy->selinux_context);
@@ -563,7 +577,7 @@ static void recheck_sessions(void)
                }
 
                group = g_hash_table_lookup(uid_hash, policy->uid);
-               if (group != NULL) {
+               if (group) {
                        set_policy(policy, group);
 
                        policy->config->id_type = CONNMAN_SESSION_ID_TYPE_UID;
@@ -573,10 +587,10 @@ static void recheck_sessions(void)
                        continue;
                }
 
-               for (list = policy->gids; list != NULL; list = list->next) {
+               for (list = policy->gids; list; list = list->next) {
                        char *gid = list->data;
                        group = g_hash_table_lookup(gid_hash, gid);
-                       if (group != NULL) {
+                       if (group) {
                                set_policy(policy, group);
 
                                policy->config->id_type = CONNMAN_SESSION_ID_TYPE_GID;
@@ -607,7 +621,7 @@ static int load_file(const char *filename, struct policy_file *file)
 
        groupnames = g_key_file_get_groups(keyfile, NULL);
 
-       for (i = 0; groupnames[i] != NULL; i++) {
+       for (i = 0; groupnames[i]; i++) {
                group = g_new0(struct policy_group, 1);
                group->config = g_new0(struct connman_session_config, 1);
 
@@ -617,13 +631,13 @@ static int load_file(const char *filename, struct policy_file *file)
                        g_free(group);
                        break;
                }
-               if (group->selinux != NULL)
+               if (group->selinux)
                        g_hash_table_replace(selinux_hash, group->selinux, group);
 
-               if (group->uid != NULL)
+               if (group->uid)
                        g_hash_table_replace(uid_hash, group->uid, group);
 
-               if (group->gid != NULL)
+               if (group->gid)
                        g_hash_table_replace(gid_hash, group->gid, group);
 
                file->groups = g_slist_prepend(file->groups, group);
@@ -639,18 +653,18 @@ static int load_file(const char *filename, struct policy_file *file)
        return err;
 }
 
-static connman_bool_t is_filename_valid(const char *filename)
+static bool is_filename_valid(const char *filename)
 {
-       if (filename == NULL)
-               return FALSE;
+       if (!filename)
+               return false;
 
        if (filename[0] == '.')
-               return FALSE;
+               return false;
 
        return g_str_has_suffix(filename, ".policy");
 }
 
-static int read_policies()
+static int read_policies(void)
 {
        GDir *dir;
        const gchar *filename;
@@ -659,11 +673,11 @@ static int read_policies()
        DBG("");
 
        dir = g_dir_open(POLICYDIR, 0, NULL);
-       if (dir == NULL)
+       if (!dir)
                return -EINVAL;
 
-       while ((filename = g_dir_read_name(dir)) != NULL) {
-               if (is_filename_valid(filename) == FALSE)
+       while ((filename = g_dir_read_name(dir))) {
+               if (!is_filename_valid(filename))
                        continue;
 
                file = g_new0(struct policy_file, 1);
@@ -691,7 +705,7 @@ static void notify_handler(struct inotify_event *event,
        if (event->mask & IN_CREATE)
                return;
 
-       if (is_filename_valid(filename) == FALSE)
+       if (!is_filename_valid(filename))
                return;
 
        /*
@@ -725,7 +739,7 @@ static int session_policy_local_init(void)
        DBG("");
 
        /* If the dir doesn't exist, create it */
-       if (g_file_test(POLICYDIR, G_FILE_TEST_IS_DIR) == FALSE) {
+       if (!g_file_test(POLICYDIR, G_FILE_TEST_IS_DIR)) {
                if (mkdir(POLICYDIR, MODE) < 0) {
                        if (errno != EEXIST)
                                return -errno;
@@ -733,7 +747,7 @@ static int session_policy_local_init(void)
        }
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        file_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -764,19 +778,19 @@ err_notify:
        connman_inotify_unregister(POLICYDIR, notify_handler);
 
 err:
-       if (file_hash != NULL)
+       if (file_hash)
                g_hash_table_destroy(file_hash);
 
-       if (session_hash != NULL)
+       if (session_hash)
                g_hash_table_destroy(session_hash);
 
-       if (selinux_hash != NULL)
+       if (selinux_hash)
                g_hash_table_destroy(selinux_hash);
 
-       if (uid_hash != NULL)
+       if (uid_hash)
                g_hash_table_destroy(uid_hash);
 
-       if (gid_hash != NULL)
+       if (gid_hash)
                g_hash_table_destroy(gid_hash);
 
        connman_session_policy_unregister(&session_policy_local);
index 4d3561e..ad5ef79 100644 (file)
@@ -25,6 +25,7 @@
 
 #define _GNU_SOURCE
 #include <stdio.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -105,7 +106,7 @@ static int read_baud_rate(unsigned long *baud)
        DBG("");
 
        f = fopen(TIST_SYSFS_BAUD, "r");
-       if (f == NULL)
+       if (!f)
                return -EIO;
 
        err = fscanf(f, "%lu", baud);
@@ -126,7 +127,7 @@ static int read_uart_name(char uart_name[], size_t uart_name_len)
        memset(uart_name, 0, uart_name_len);
 
        f = fopen(TIST_SYSFS_UART, "r");
-       if (f == NULL)
+       if (!f)
                return -EIO;
 
         err = fscanf(f, "%s", uart_name);
@@ -342,7 +343,7 @@ err:
        return FALSE;
 }
 
-static int install_ldisc(GIOChannel *channel, gboolean install)
+static int install_ldisc(GIOChannel *channel, bool install)
 {
        int uart_fd, err;
        struct speed_change_cmd cmd;
@@ -350,11 +351,11 @@ static int install_ldisc(GIOChannel *channel, gboolean install)
 
        DBG("%d %p", install, uart_channel);
 
-       if (install == FALSE) {
+       if (!install) {
                install_count = 0;
                __sync_synchronize();
 
-               if (uart_channel == NULL) {
+               if (!uart_channel) {
                        DBG("UART channel is NULL");
                        return 0;
                }
@@ -367,19 +368,19 @@ static int install_ldisc(GIOChannel *channel, gboolean install)
                return 0;
        }
 
-       if (uart_channel != NULL) {
+       if (uart_channel) {
                g_io_channel_shutdown(uart_channel, TRUE, NULL);
                g_io_channel_unref(uart_channel);
                uart_channel = NULL;
        }
 
        DBG("opening %s custom baud %lu", uart_dev_name, baud_rate);
-       
+
        uart_fd = open(uart_dev_name, O_RDWR | O_CLOEXEC);
        if (uart_fd < 0)
                return -EIO;
 
-       uart_channel = g_io_channel_unix_new(uart_fd);  
+       uart_channel = g_io_channel_unix_new(uart_fd);
        g_io_channel_set_close_on_unref(uart_channel, TRUE);
 
        g_io_channel_set_encoding(uart_channel, NULL, NULL);
@@ -441,7 +442,7 @@ static gboolean install_event(GIOChannel *channel,
 {
        GIOStatus status = G_IO_STATUS_NORMAL;
        unsigned int install_state;
-       gboolean install;
+       bool install;
        char buf[8];
        gsize len;
 
@@ -462,7 +463,8 @@ static gboolean install_event(GIOChannel *channel,
                }
 
                /* Read the install value */
-               status = g_io_channel_read_chars(channel, (gchar *) buf, 8, &len, NULL);
+               status = g_io_channel_read_chars(channel, (gchar *) buf,
+                                               8, &len, NULL);
                if (status != G_IO_STATUS_NORMAL) {
                        g_io_channel_shutdown(channel, TRUE, NULL);
                        g_io_channel_unref(channel);
@@ -575,7 +577,7 @@ static int tist_init(void)
                install_count = 1;
                __sync_synchronize();
 
-               err = install_ldisc(install_channel, TRUE);
+               err = install_ldisc(install_channel, true);
                if (err < 0) {
                        connman_error("ldisc installtion failed");
                        return err;
@@ -597,7 +599,7 @@ static void tist_exit(void)
        g_io_channel_shutdown(install_channel, TRUE, NULL);
        g_io_channel_unref(install_channel);
 
-       if (uart_channel != NULL) {
+       if (uart_channel) {
                g_io_channel_shutdown(uart_channel, TRUE, NULL);
                g_io_channel_unref(uart_channel);
                uart_channel = NULL;
index 400112e..25711d7 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -71,7 +71,7 @@ struct connection_data {
        struct connman_provider *provider;
        int index;
        DBusPendingCall *call;
-       connman_bool_t connect_pending;
+       bool connect_pending;
        struct config_create_data *cb_data;
 
        char *state;
@@ -81,7 +81,7 @@ struct connection_data {
        char **host_ip;
        char *domain;
        char **nameservers;
-       gboolean immutable;
+       bool immutable;
 
        GHashTable *server_routes;
        GHashTable *user_routes;
@@ -99,22 +99,22 @@ static int set_string(struct connman_provider *provider,
        struct connection_data *data;
 
        data = connman_provider_get_data(provider);
-       if (data == NULL)
+       if (!data)
                return -EINVAL;
 
        DBG("data %p provider %p key %s value %s", data, provider, key, value);
 
-       if (g_str_equal(key, "Type") == TRUE) {
+       if (g_str_equal(key, "Type")) {
                g_free(data->type);
                data->type = g_strdup(value);
-       } else if (g_str_equal(key, "Name") == TRUE) {
+       } else if (g_str_equal(key, "Name")) {
                g_free(data->name);
                data->name = g_strdup(value);
-       } else if (g_str_equal(key, "Host") == TRUE) {
+       } else if (g_str_equal(key, "Host")) {
                g_free(data->host);
                data->host = g_strdup(value);
-       } else if (g_str_equal(key, "VPN.Domain") == TRUE ||
-                               g_str_equal(key, "Domain") == TRUE) {
+       } else if (g_str_equal(key, "VPN.Domain") ||
+                               g_str_equal(key, "Domain")) {
                g_free(data->domain);
                data->domain = g_strdup(value);
        } else
@@ -129,24 +129,24 @@ static const char *get_string(struct connman_provider *provider,
        struct connection_data *data;
 
        data = connman_provider_get_data(provider);
-       if (data == NULL)
+       if (!data)
                return NULL;
 
        DBG("data %p provider %p key %s", data, provider, key);
 
-       if (g_str_equal(key, "Type") == TRUE)
+       if (g_str_equal(key, "Type"))
                return data->type;
-       else if (g_str_equal(key, "Name") == TRUE)
+       else if (g_str_equal(key, "Name"))
                return data->name;
-       else if (g_str_equal(key, "Host") == TRUE)
+       else if (g_str_equal(key, "Host"))
                return data->host;
-       else if (g_str_equal(key, "HostIP") == TRUE) {
-               if (data->host_ip == NULL ||
-                               data->host_ip[0] == NULL)
+       else if (g_str_equal(key, "HostIP")) {
+               if (!data->host_ip ||
+                               !data->host_ip[0])
                        return data->host;
                else
                        return data->host_ip[0];
-       } else if (g_str_equal(key, "VPN.Domain") == TRUE)
+       } else if (g_str_equal(key, "VPN.Domain"))
                return data->domain;
 
        return g_hash_table_lookup(data->setting_strings, key);
@@ -160,7 +160,7 @@ static char *get_ident(const char *path)
                return NULL;
 
        pos = strrchr(path, '/');
-       if (pos == NULL)
+       if (!pos)
                return NULL;
 
        return pos + 1;
@@ -193,9 +193,11 @@ static void resolv_result(GResolvResultStatus status,
 
        DBG("status %d", status);
 
-       if (status == G_RESOLV_RESULT_STATUS_SUCCESS && results != NULL &&
-                                               g_strv_length(results) > 0)
+       if (status == G_RESOLV_RESULT_STATUS_SUCCESS && results &&
+                                               g_strv_length(results) > 0) {
+               g_strfreev(data->host_ip);
                data->host_ip = g_strdupv(results);
+       }
 
        /*
         * We cannot unref the resolver here as resolv struct is manipulated
@@ -208,17 +210,17 @@ static void resolv_result(GResolvResultStatus status,
 
 static void resolv_host_addr(struct connection_data *data)
 {
-       if (data->host == NULL)
+       if (!data->host)
                return;
 
        if (connman_inet_check_ipaddress(data->host) > 0)
                return;
 
-       if (data->host_ip != NULL)
+       if (data->host_ip)
                return;
 
        data->resolv = g_resolv_new(0);
-       if (data->resolv == NULL) {
+       if (!data->resolv) {
                DBG("Cannot resolv %s", data->host);
                return;
        }
@@ -231,13 +233,13 @@ static void resolv_host_addr(struct connection_data *data)
 
 static void free_config_cb_data(struct config_create_data *cb_data)
 {
-       if (cb_data == NULL)
+       if (!cb_data)
                return;
 
        g_free(cb_data->path);
        cb_data->path = NULL;
 
-       if (cb_data->message != NULL) {
+       if (cb_data->message) {
                dbus_message_unref(cb_data->message);
                cb_data->message = NULL;
        }
@@ -254,18 +256,18 @@ static void set_provider_state(struct connection_data *data)
 
        DBG("provider %p new state %s", data->provider, data->state);
 
-       if (g_str_equal(data->state, "ready") == TRUE) {
+       if (g_str_equal(data->state, "ready")) {
                state = CONNMAN_PROVIDER_STATE_READY;
                goto set;
-       } else if (g_str_equal(data->state, "configuration") == TRUE) {
+       } else if (g_str_equal(data->state, "configuration")) {
                state = CONNMAN_PROVIDER_STATE_CONNECT;
-       } else if (g_str_equal(data->state, "idle") == TRUE) {
+       } else if (g_str_equal(data->state, "idle")) {
                state = CONNMAN_PROVIDER_STATE_IDLE;
-       } else if (g_str_equal(data->state, "disconnect") == TRUE) {
+       } else if (g_str_equal(data->state, "disconnect")) {
                err = ECONNREFUSED;
                state = CONNMAN_PROVIDER_STATE_DISCONNECT;
                goto set;
-       } else if (g_str_equal(data->state, "failure") == TRUE) {
+       } else if (g_str_equal(data->state, "failure")) {
                err = ECONNREFUSED;
                state = CONNMAN_PROVIDER_STATE_FAILURE;
                goto set;
@@ -275,7 +277,7 @@ static void set_provider_state(struct connection_data *data)
        return;
 
 set:
-       if (data->cb_data != NULL)
+       if (data->cb_data)
                data->cb_data->callback(data->cb_data->message,
                                        err, data->ident);
 
@@ -293,7 +295,7 @@ static int create_provider(struct connection_data *data, void *user_data)
        DBG("%s", data->path);
 
        data->provider = connman_provider_get(data->ident);
-       if (data->provider == NULL)
+       if (!data->provider)
                return -ENOMEM;
 
        DBG("provider %p name %s", data->provider, data->name);
@@ -304,10 +306,10 @@ static int create_provider(struct connection_data *data, void *user_data)
        err = connman_provider_create_service(data->provider);
        if (err == 0) {
                connman_provider_set_immutable(data->provider, data->immutable);
-               if (g_str_equal(data->state, "ready") == TRUE) {
+               if (g_str_equal(data->state, "ready")) {
                        connman_provider_set_index(data->provider,
                                                        data->index);
-                       if (data->ip != NULL)
+                       if (data->ip)
                                connman_provider_set_ipaddress(data->provider,
                                                                data->ip);
                }
@@ -333,7 +335,7 @@ static struct connection_data *create_connection_data(const char *path)
        struct connection_data *data;
 
        data = g_try_new0(struct connection_data, 1);
-       if (data == NULL)
+       if (!data)
                return NULL;
 
        DBG("path %s", path);
@@ -375,19 +377,19 @@ static int extract_ip(DBusMessageIter *array, int family,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "Address") == TRUE) {
+               if (g_str_equal(key, "Address")) {
                        dbus_message_iter_get_basic(&value, &address);
                        DBG("address %s", address);
-               } else if (g_str_equal(key, "Netmask") == TRUE) {
+               } else if (g_str_equal(key, "Netmask")) {
                        dbus_message_iter_get_basic(&value, &netmask);
                        DBG("netmask %s", netmask);
-               } else if (g_str_equal(key, "PrefixLength") == TRUE) {
+               } else if (g_str_equal(key, "PrefixLength")) {
                        dbus_message_iter_get_basic(&value, &netmask);
                        DBG("prefix length %s", netmask);
-               } else if (g_str_equal(key, "Peer") == TRUE) {
+               } else if (g_str_equal(key, "Peer")) {
                        dbus_message_iter_get_basic(&value, &peer);
                        DBG("peer %s", peer);
-               } else if (g_str_equal(key, "Gateway") == TRUE) {
+               } else if (g_str_equal(key, "Gateway")) {
                        dbus_message_iter_get_basic(&value, &gateway);
                        DBG("gateway %s", gateway);
                }
@@ -397,7 +399,7 @@ static int extract_ip(DBusMessageIter *array, int family,
 
        connman_ipaddress_free(data->ip);
        data->ip = connman_ipaddress_alloc(family);
-       if (data->ip == NULL)
+       if (!data->ip)
                return -ENOMEM;
 
        switch (family) {
@@ -434,13 +436,13 @@ static int extract_nameservers(DBusMessageIter *array,
                dbus_message_iter_get_basic(&entry, &nameserver);
 
                nameservers = g_try_renew(char *, nameservers, i + 2);
-               if (nameservers == NULL)
+               if (!nameservers)
                        return -ENOMEM;
 
                DBG("[%d] %s", i, nameserver);
 
                nameservers[i] = g_strdup(nameserver);
-               if (nameservers[i] == NULL)
+               if (!nameservers[i])
                        return -ENOMEM;
 
                nameservers[++i] = NULL;
@@ -471,7 +473,7 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
        struct connection_data *data = user_data;
        struct config_create_data *cb_data = data->cb_data;
 
-       if (dbus_pending_call_get_completed(call) == FALSE)
+       if (!dbus_pending_call_get_completed(call))
                return;
 
        DBG("user_data %p path %s", user_data, cb_data ? cb_data->path : NULL);
@@ -480,7 +482,7 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                int err = errorstr2val(error.name);
                if (err != -EINPROGRESS) {
                        connman_error("Connect reply: %s (%s)", error.message,
@@ -488,7 +490,7 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
                        dbus_error_free(&error);
 
                        DBG("data %p cb_data %p", data, cb_data);
-                       if (cb_data != NULL) {
+                       if (cb_data) {
                                cb_data->callback(cb_data->message, err, NULL);
                                free_config_cb_data(cb_data);
                                data->cb_data = NULL;
@@ -518,28 +520,28 @@ static int connect_provider(struct connection_data *data, void *user_data)
 
        DBG("data %p user %p path %s", data, cb_data, data->path);
 
-       data->connect_pending = FALSE;
+       data->connect_pending = false;
 
        message = dbus_message_new_method_call(VPN_SERVICE, data->path,
                                        VPN_CONNECTION_INTERFACE,
                                        VPN_CONNECT);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                       &call, DBUS_TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, DBUS_TIMEOUT)) {
                connman_error("Unable to call %s.%s()",
                        VPN_CONNECTION_INTERFACE, VPN_CONNECT);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (cb_data != NULL) {
+       if (cb_data) {
                g_free(cb_data->path);
                cb_data->path = g_strdup(data->path);
        }
@@ -557,22 +559,22 @@ static void add_connection(const char *path, DBusMessageIter *properties,
        struct connection_data *data;
        int err;
        char *ident = get_ident(path);
-       connman_bool_t found = FALSE;
+       bool found = false;
 
        data = g_hash_table_lookup(vpn_connections, ident);
-       if (data != NULL) {
+       if (data) {
                /*
                 * We might have a dummy connection struct here that
                 * was created by configuration_create_reply() so in
                 * that case just continue.
                 */
-               if (data->connect_pending == FALSE)
+               if (!data->connect_pending)
                        return;
 
-               found = TRUE;
+               found = true;
        } else {
                data = create_connection_data(path);
-               if (data == NULL)
+               if (!data)
                        return;
        }
 
@@ -590,36 +592,39 @@ static void add_connection(const char *path, DBusMessageIter *properties,
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "State") == TRUE) {
+               if (g_str_equal(key, "State")) {
                        dbus_message_iter_get_basic(&value, &str);
                        DBG("state %s -> %s", data->state, str);
                        data->state = g_strdup(str);
-               } else if (g_str_equal(key, "IPv4") == TRUE) {
+               } else if (g_str_equal(key, "IPv4")) {
                        extract_ip(&value, AF_INET, data);
-               } else if (g_str_equal(key, "IPv6") == TRUE) {
+               } else if (g_str_equal(key, "IPv6")) {
                        extract_ip(&value, AF_INET6, data);
-               } else if (g_str_equal(key, "Name") == TRUE) {
+               } else if (g_str_equal(key, "Name")) {
                        dbus_message_iter_get_basic(&value, &str);
                        data->name = g_strdup(str);
-               } else if (g_str_equal(key, "Type") == TRUE) {
+               } else if (g_str_equal(key, "Type")) {
                        dbus_message_iter_get_basic(&value, &str);
                        data->type = g_strdup(str);
-               } else if (g_str_equal(key, "Immutable") == TRUE) {
-                       dbus_message_iter_get_basic(&value, &data->immutable);
-               } else if (g_str_equal(key, "Host") == TRUE) {
+               } else if (g_str_equal(key, "Immutable")) {
+                       dbus_bool_t immutable;
+
+                       dbus_message_iter_get_basic(&value, &immutable);
+                       data->immutable = immutable;
+               } else if (g_str_equal(key, "Host")) {
                        dbus_message_iter_get_basic(&value, &str);
                        data->host = g_strdup(str);
-               } else if (g_str_equal(key, "Domain") == TRUE) {
+               } else if (g_str_equal(key, "Domain")) {
                        dbus_message_iter_get_basic(&value, &str);
                        g_free(data->domain);
                        data->domain = g_strdup(str);
-               } else if (g_str_equal(key, "Nameservers") == TRUE) {
+               } else if (g_str_equal(key, "Nameservers")) {
                        extract_nameservers(&value, data);
-               } else if (g_str_equal(key, "Index") == TRUE) {
+               } else if (g_str_equal(key, "Index")) {
                        dbus_message_iter_get_basic(&value, &data->index);
-               } else if (g_str_equal(key, "ServerRoutes") == TRUE) {
+               } else if (g_str_equal(key, "ServerRoutes")) {
                        /* Ignored */
-               } else if (g_str_equal(key, "UserRoutes") == TRUE) {
+               } else if (g_str_equal(key, "UserRoutes")) {
                        /* Ignored */
                } else {
                        if (dbus_message_iter_get_arg_type(&value) ==
@@ -635,7 +640,7 @@ static void add_connection(const char *path, DBusMessageIter *properties,
                dbus_message_iter_next(properties);
        }
 
-       if (found == FALSE)
+       if (!found)
                g_hash_table_insert(vpn_connections, g_strdup(data->ident),
                                                                        data);
 
@@ -645,15 +650,15 @@ static void add_connection(const char *path, DBusMessageIter *properties,
 
        resolv_host_addr(data);
 
-       if (data->nameservers != NULL)
+       if (data->nameservers)
                connman_provider_set_nameservers(data->provider,
                                                data->nameservers);
 
-       if (data->domain != NULL)
+       if (data->domain)
                connman_provider_set_domain(data->provider,
                                                data->domain);
 
-       if (data->connect_pending == TRUE)
+       if (data->connect_pending)
                connect_provider(data, data->cb_data);
 
        return;
@@ -678,7 +683,7 @@ static void get_connections_reply(DBusPendingCall *call, void *user_data)
                DBUS_DICT_ENTRY_END_CHAR_AS_STRING
                DBUS_STRUCT_END_CHAR_AS_STRING;
 
-       if (dbus_pending_call_get_completed(call) == FALSE)
+       if (!dbus_pending_call_get_completed(call))
                return;
 
        DBG("");
@@ -687,20 +692,20 @@ static void get_connections_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_has_signature(reply, signature) == FALSE) {
+       if (!dbus_message_has_signature(reply, signature)) {
                connman_error("vpnd signature \"%s\" does not match "
                                                        "expected \"%s\"",
                        dbus_message_get_signature(reply), signature);
                goto done;
        }
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                goto done;
 
        dbus_message_iter_recurse(&array, &dict);
@@ -736,18 +741,18 @@ static int get_connections(void *user_data)
        message = dbus_message_new_method_call(VPN_SERVICE, "/",
                                        VPN_MANAGER_INTERFACE,
                                        GET_CONNECTIONS);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                       &call, DBUS_TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, DBUS_TIMEOUT)) {
                connman_error("Unable to call %s.%s()", VPN_MANAGER_INTERFACE,
                                                        GET_CONNECTIONS);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                return -EINVAL;
        }
@@ -770,7 +775,7 @@ static void remove_connection_reply(DBusPendingCall *call, void *user_data)
        DBusMessage *reply;
        DBusError error;
 
-       if (dbus_pending_call_get_completed(call) == FALSE)
+       if (!dbus_pending_call_get_completed(call))
                return;
 
        DBG("");
@@ -779,13 +784,13 @@ static void remove_connection_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                /*
                 * If the returned error is NotFound, it means that we
                 * have actually removed the provider in vpnd already.
                 */
-               if (dbus_error_has_name(&error, CONNMAN_ERROR_INTERFACE
-                                               ".NotFound") == FALSE)
+               if (!dbus_error_has_name(&error,
+                               CONNMAN_ERROR_INTERFACE".NotFound"))
                        connman_error("%s", error.message);
 
                dbus_error_free(&error);
@@ -806,7 +811,7 @@ static int provider_remove(struct connman_provider *provider)
 
        DBG("provider %p data %p", provider, data);
 
-       if (data == NULL) {
+       if (!data) {
                /*
                 * This means the provider is already removed,
                 * just ignore the dbus in this case.
@@ -825,21 +830,21 @@ static int provider_remove(struct connman_provider *provider)
        message = dbus_message_new_method_call(VPN_SERVICE, "/",
                                        VPN_MANAGER_INTERFACE,
                                        VPN_REMOVE);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_append_args(message, DBUS_TYPE_OBJECT_PATH, &data->path,
                                NULL);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                       &call, DBUS_TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, DBUS_TIMEOUT)) {
                connman_error("Unable to call %s.%s()", VPN_MANAGER_INTERFACE,
                                                        VPN_REMOVE);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                return -EINVAL;
        }
@@ -857,7 +862,7 @@ static int provider_connect(struct connman_provider *provider)
        struct connection_data *data;
 
        data = connman_provider_get_data(provider);
-       if (data == NULL)
+       if (!data)
                return -EINVAL;
 
        return connect_provider(data, NULL);
@@ -868,7 +873,7 @@ static void disconnect_reply(DBusPendingCall *call, void *user_data)
        DBusMessage *reply;
        DBusError error;
 
-       if (dbus_pending_call_get_completed(call) == FALSE)
+       if (!dbus_pending_call_get_completed(call))
                return;
 
        DBG("user %p", user_data);
@@ -877,7 +882,7 @@ static void disconnect_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("%s", error.message);
                dbus_error_free(&error);
                goto done;
@@ -899,18 +904,18 @@ static int disconnect_provider(struct connection_data *data)
        message = dbus_message_new_method_call(VPN_SERVICE, data->path,
                                        VPN_CONNECTION_INTERFACE,
                                        VPN_DISCONNECT);
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                       &call, DBUS_TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, DBUS_TIMEOUT)) {
                connman_error("Unable to call %s.%s()",
                        VPN_CONNECTION_INTERFACE, VPN_DISCONNECT);
                dbus_message_unref(message);
                return -EINVAL;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                return -EINVAL;
        }
@@ -938,11 +943,11 @@ static int provider_disconnect(struct connman_provider *provider)
        DBG("provider %p", provider);
 
        data = connman_provider_get_data(provider);
-       if (data == NULL)
+       if (!data)
                return -EINVAL;
 
-       if (g_str_equal(data->state, "ready") == TRUE ||
-                       g_str_equal(data->state, "configuration") == TRUE)
+       if (g_str_equal(data->state, "ready") ||
+                       g_str_equal(data->state, "configuration"))
                return disconnect_provider(data);
 
        return 0;
@@ -959,7 +964,7 @@ static void configuration_create_reply(DBusPendingCall *call, void *user_data)
        struct connection_data *data;
        struct config_create_data *cb_data = user_data;
 
-       if (dbus_pending_call_get_completed(call) == FALSE)
+       if (!dbus_pending_call_get_completed(call))
                return;
 
        DBG("user %p", cb_data);
@@ -968,20 +973,20 @@ static void configuration_create_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
-       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+       if (dbus_set_error_from_message(&error, reply)) {
                connman_error("dbus error: %s", error.message);
                dbus_error_free(&error);
                goto done;
        }
 
-       if (dbus_message_has_signature(reply, signature) == FALSE) {
+       if (!dbus_message_has_signature(reply, signature)) {
                connman_error("vpn configuration signature \"%s\" does not "
                                                "match expected \"%s\"",
                        dbus_message_get_signature(reply), signature);
                goto done;
        }
 
-       if (dbus_message_iter_init(reply, &iter) == FALSE)
+       if (!dbus_message_iter_init(reply, &iter))
                goto done;
 
        dbus_message_iter_get_basic(&iter, &path);
@@ -992,16 +997,16 @@ static void configuration_create_reply(DBusPendingCall *call, void *user_data)
        ident = get_ident(path);
 
        data = g_hash_table_lookup(vpn_connections, ident);
-       if (data == NULL) {
+       if (!data) {
                /*
                 * Someone removed the data. We cannot really continue.
                 */
                DBG("Pending data not found for %s, cannot continue!", ident);
        } else {
                data->call = NULL;
-               data->connect_pending = TRUE;
+               data->connect_pending = true;
 
-               if (data->cb_data == NULL)
+               if (!data->cb_data)
                        data->cb_data = cb_data;
                else
                        DBG("Connection callback data already in use!");
@@ -1043,33 +1048,33 @@ static struct vpn_route *parse_user_route(const char *user_route)
        int family = PF_UNSPEC;
        char **elems = g_strsplit(user_route, "/", 0);
 
-       if (elems == NULL)
+       if (!elems)
                return NULL;
 
        network = elems[0];
-       if (network == NULL || *network == '\0') {
+       if (!network || *network == '\0') {
                DBG("no network/netmask set");
                goto out;
        }
 
        netmask = elems[1];
-       if (netmask != NULL && *netmask == '\0') {
+       if (netmask && *netmask == '\0') {
                DBG("no netmask set");
                goto out;
        }
 
-       if (g_strrstr(network, ":") != NULL)
+       if (g_strrstr(network, ":"))
                family = AF_INET6;
-       else if (g_strrstr(network, ".") != NULL) {
+       else if (g_strrstr(network, ".")) {
                family = AF_INET;
 
-               if (g_strrstr(netmask, ".") == NULL) {
+               if (!g_strrstr(netmask, ".")) {
                        /* We have netmask length */
                        in_addr_t addr;
                        struct in_addr netmask_in;
                        unsigned char prefix_len = 32;
 
-                       if (netmask != NULL) {
+                       if (netmask) {
                                char *ptr;
                                long int value = strtol(netmask, &ptr, 10);
                                if (ptr != netmask && *ptr == '\0' &&
@@ -1086,7 +1091,7 @@ static struct vpn_route *parse_user_route(const char *user_route)
        }
 
        route = g_try_new(struct vpn_route, 1);
-       if (route == NULL)
+       if (!route)
                goto out;
 
        route->network = g_strdup(network);
@@ -1113,7 +1118,7 @@ static GSList *get_user_networks(DBusMessageIter *array)
                dbus_message_iter_get_basic(&entry, &val);
 
                route = parse_user_route(val);
-               if (route != NULL)
+               if (route)
                        list = g_slist_prepend(list, route);
 
                dbus_message_iter_next(&entry);
@@ -1130,7 +1135,7 @@ static void append_route(DBusMessageIter *iter, void *user_data)
 
        connman_dbus_dict_open(iter, &item);
 
-       if (route == NULL)
+       if (!route)
                goto empty_dict;
 
        if (route->family == AF_INET)
@@ -1142,15 +1147,15 @@ static void append_route(DBusMessageIter *iter, void *user_data)
                connman_dbus_dict_append_basic(&item, "ProtocolFamily",
                                        DBUS_TYPE_INT32, &family);
 
-       if (route->network != NULL)
+       if (route->network)
                connman_dbus_dict_append_basic(&item, "Network",
                                        DBUS_TYPE_STRING, &route->network);
 
-       if (route->netmask != NULL)
+       if (route->netmask)
                connman_dbus_dict_append_basic(&item, "Netmask",
                                        DBUS_TYPE_STRING, &route->netmask);
 
-       if (route->gateway != NULL)
+       if (route->gateway)
                connman_dbus_dict_append_basic(&item, "Gateway",
                                        DBUS_TYPE_STRING, &route->gateway);
 
@@ -1164,7 +1169,7 @@ static void append_routes(DBusMessageIter *iter, void *user_data)
 
        DBG("routes %p", routes);
 
-       for (list = routes; list != NULL; list = g_slist_next(list)) {
+       for (list = routes; list; list = g_slist_next(list)) {
                DBusMessageIter dict;
                struct vpn_route *route = list->data;
 
@@ -1220,24 +1225,23 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
                case DBUS_TYPE_STRING:
                        dbus_message_iter_get_basic(&value, &item_value);
 
-                       if (g_str_equal(key, "Type") == TRUE) {
+                       if (g_str_equal(key, "Type"))
                                type = (const char *)item_value;
-                       } else if (g_str_equal(key, "Name") == TRUE) {
+                       else if (g_str_equal(key, "Name"))
                                name = (const char *)item_value;
-                       } else if (g_str_equal(key, "Host") == TRUE) {
+                       else if (g_str_equal(key, "Host"))
                                host = (const char *)item_value;
-                       } else if (g_str_equal(key, "VPN.Domain") == TRUE) {
+                       else if (g_str_equal(key, "VPN.Domain"))
                                domain = (const char *)item_value;
-                       }
 
                        DBG("%s %s", key, (char *)item_value);
 
-                       if (item_value != NULL)
+                       if (item_value)
                                connman_dbus_dict_append_basic(&new_dict, key,
                                                value_type, &item_value);
                        break;
                case DBUS_TYPE_ARRAY:
-                       if (g_str_equal(key, "Networks") == TRUE) {
+                       if (g_str_equal(key, "Networks")) {
                                networks = get_user_networks(&value);
                                connman_dbus_dict_append_array(&new_dict,
                                                        "UserRoutes",
@@ -1256,12 +1260,12 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
        DBG("VPN type %s name %s host %s domain %s networks %p",
                type, name, host, domain, networks);
 
-       if (host == NULL || domain == NULL) {
+       if (!host || !domain) {
                err = -EINVAL;
                goto done;
        }
 
-       if (type == NULL || name == NULL) {
+       if (!type || !name) {
                err = -EOPNOTSUPP;
                goto done;
        }
@@ -1272,8 +1276,8 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
        DBG("ident %s", ident);
 
        data = g_hash_table_lookup(vpn_connections, ident);
-       if (data != NULL) {
-               if (data->call != NULL || data->cb_data != NULL) {
+       if (data) {
+               if (data->call || data->cb_data) {
                        DBG("create configuration call already pending");
                        err = -EINPROGRESS;
                        goto done;
@@ -1284,7 +1288,7 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
                data = create_connection_data(path);
                g_free(path);
 
-               if (data == NULL) {
+               if (!data) {
                        err = -ENOMEM;
                        goto done;
                }
@@ -1305,7 +1309,7 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
        dbus_message_set_member(new_msg, "Create");
 
        user_data = g_try_new0(struct config_create_data, 1);
-       if (user_data == NULL) {
+       if (!user_data) {
                err = -ENOMEM;
                goto done;
        }
@@ -1318,7 +1322,7 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
 
        result = dbus_connection_send_with_reply(connection, new_msg,
                                                &call, DBUS_TIMEOUT);
-       if (result == FALSE || call == NULL) {
+       if (!result || !call) {
                err = -EIO;
                goto done;
        }
@@ -1328,29 +1332,29 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
        data->call = call;
 
 done:
-       if (new_msg != NULL)
+       if (new_msg)
                dbus_message_unref(new_msg);
 
-       if (networks != NULL)
+       if (networks)
                g_slist_free_full(networks, destroy_route);
 
        g_free(me);
        return err;
 }
 
-static connman_bool_t check_host(char **hosts, char *host)
+static bool check_host(char **hosts, char *host)
 {
        int i;
 
-       if (hosts == NULL)
-               return FALSE;
+       if (!hosts)
+               return false;
 
-       for (i = 0; hosts[i] != NULL; i++) {
+       for (i = 0; hosts[i]; i++) {
                if (g_strcmp0(hosts[i], host) == 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 static void set_route(struct connection_data *data, struct vpn_route *route)
@@ -1360,7 +1364,7 @@ static void set_route(struct connection_data *data, struct vpn_route *route)
         * VPN server, then we must discard that because the
         * server cannot be contacted via VPN tunnel.
         */
-       if (check_host(data->host_ip, route->network) == TRUE) {
+       if (check_host(data->host_ip, route->network)) {
                DBG("Discarding VPN route to %s via %s at index %d",
                        route->network, route->gateway, data->index);
                return;
@@ -1390,14 +1394,14 @@ static int set_routes(struct connman_provider *provider,
        DBG("provider %p", provider);
 
        data = connman_provider_get_data(provider);
-       if (data == NULL)
+       if (!data)
                return -EINVAL;
 
        if (type == CONNMAN_PROVIDER_ROUTE_ALL ||
                                        type == CONNMAN_PROVIDER_ROUTE_USER) {
                g_hash_table_iter_init(&iter, data->user_routes);
 
-               while (g_hash_table_iter_next(&iter, &key, &value) == TRUE)
+               while (g_hash_table_iter_next(&iter, &key, &value))
                        set_route(data, value);
        }
 
@@ -1405,32 +1409,32 @@ static int set_routes(struct connman_provider *provider,
                                type == CONNMAN_PROVIDER_ROUTE_SERVER) {
                g_hash_table_iter_init(&iter, data->server_routes);
 
-               while (g_hash_table_iter_next(&iter, &key, &value) == TRUE)
+               while (g_hash_table_iter_next(&iter, &key, &value))
                        set_route(data, value);
        }
 
        return 0;
 }
 
-static connman_bool_t check_routes(struct connman_provider *provider)
+static bool check_routes(struct connman_provider *provider)
 {
        struct connection_data *data;
 
        DBG("provider %p", provider);
 
        data = connman_provider_get_data(provider);
-       if (data == NULL)
-               return FALSE;
+       if (!data)
+               return false;
 
-       if (data->user_routes != NULL &&
+       if (data->user_routes &&
                        g_hash_table_size(data->user_routes) > 0)
-               return TRUE;
+               return true;
 
-       if (data->server_routes != NULL &&
+       if (data->server_routes &&
                        g_hash_table_size(data->server_routes) > 0)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static struct connman_provider_driver provider_driver = {
@@ -1451,11 +1455,11 @@ static void destroy_provider(struct connection_data *data)
 {
        DBG("data %p", data);
 
-       if (g_str_equal(data->state, "ready") == TRUE ||
-                       g_str_equal(data->state, "configuration") == TRUE)
+       if (g_str_equal(data->state, "ready") ||
+                       g_str_equal(data->state, "configuration"))
                connman_provider_disconnect(data->provider);
 
-       if (data->call != NULL)
+       if (data->call)
                dbus_pending_call_cancel(data->call);
 
        connman_provider_set_data(data->provider, NULL);
@@ -1471,7 +1475,7 @@ static void connection_destroy(gpointer hash_data)
 
        DBG("data %p", data);
 
-       if (data->provider != NULL)
+       if (data->provider)
                destroy_provider(data);
 
        g_free(data->path);
@@ -1521,7 +1525,7 @@ static gboolean connection_removed(DBusConnection *conn, DBusMessage *message,
        const char *signature = DBUS_TYPE_OBJECT_PATH_AS_STRING;
        struct connection_data *data;
 
-       if (dbus_message_has_signature(message, signature) == FALSE) {
+       if (!dbus_message_has_signature(message, signature)) {
                connman_error("vpn removed signature \"%s\" does not match "
                                                        "expected \"%s\"",
                        dbus_message_get_signature(message), signature);
@@ -1532,7 +1536,7 @@ static gboolean connection_removed(DBusConnection *conn, DBusMessage *message,
                                DBUS_TYPE_INVALID);
 
        data = g_hash_table_lookup(vpn_connections, get_ident(path));
-       if (data != NULL)
+       if (data)
                remove_connection(conn, path);
 
        return TRUE;
@@ -1550,7 +1554,7 @@ static gboolean connection_added(DBusConnection *conn, DBusMessage *message,
                DBUS_TYPE_VARIANT_AS_STRING
                DBUS_DICT_ENTRY_END_CHAR_AS_STRING;
 
-       if (dbus_message_has_signature(message, signature) == FALSE) {
+       if (!dbus_message_has_signature(message, signature)) {
                connman_error("vpn ConnectionAdded signature \"%s\" does not "
                                                "match expected \"%s\"",
                        dbus_message_get_signature(message), signature);
@@ -1559,7 +1563,7 @@ static gboolean connection_added(DBusConnection *conn, DBusMessage *message,
 
        DBG("");
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &path);
@@ -1581,9 +1585,9 @@ static int save_route(GHashTable *routes, int family, const char *network,
        DBG("family %d network %s netmask %s", family, network, netmask);
 
        route = g_hash_table_lookup(routes, key);
-       if (route == NULL) {
+       if (!route) {
                route = g_try_new0(struct vpn_route, 1);
-               if (route == NULL) {
+               if (!route) {
                        connman_error("out of memory");
                        return -ENOMEM;
                }
@@ -1622,7 +1626,7 @@ static int read_route_dict(GHashTable *routes, DBusMessageIter *dicts)
                dbus_message_iter_next(&entry);
                dbus_message_iter_recurse(&entry, &value);
 
-               if (g_str_equal(key, "ProtocolFamily") == TRUE) {
+               if (g_str_equal(key, "ProtocolFamily")) {
                        int pf;
                        dbus_message_iter_get_basic(&value, &pf);
                        switch (pf) {
@@ -1634,13 +1638,13 @@ static int read_route_dict(GHashTable *routes, DBusMessageIter *dicts)
                                break;
                        }
                        DBG("family %d", family);
-               } else if (g_str_equal(key, "Netmask") == TRUE) {
+               } else if (g_str_equal(key, "Netmask")) {
                        dbus_message_iter_get_basic(&value, &netmask);
                        DBG("netmask %s", netmask);
-               } else if (g_str_equal(key, "Network") == TRUE) {
+               } else if (g_str_equal(key, "Network")) {
                        dbus_message_iter_get_basic(&value, &network);
                        DBG("host %s", network);
-               } else if (g_str_equal(key, "Gateway") == TRUE) {
+               } else if (g_str_equal(key, "Gateway")) {
                        dbus_message_iter_get_basic(&value, &gateway);
                        DBG("gateway %s", gateway);
                }
@@ -1648,7 +1652,7 @@ static int read_route_dict(GHashTable *routes, DBusMessageIter *dicts)
                dbus_message_iter_next(&dict);
        }
 
-       if (netmask == NULL || network == NULL || gateway == NULL) {
+       if (!netmask || !network || !gateway) {
                DBG("Value missing.");
                return -EINVAL;
        }
@@ -1700,14 +1704,14 @@ static gboolean property_changed(DBusConnection *conn,
        const char *path = dbus_message_get_path(message);
        struct connection_data *data = NULL;
        DBusMessageIter iter, value;
-       connman_bool_t ip_set = FALSE;
+       bool ip_set = false;
        int err;
        char *str;
        const char *key;
        const char *signature = DBUS_TYPE_STRING_AS_STRING
                DBUS_TYPE_VARIANT_AS_STRING;
 
-       if (dbus_message_has_signature(message, signature) == FALSE) {
+       if (!dbus_message_has_signature(message, signature)) {
                connman_error("vpn property signature \"%s\" does not match "
                                                        "expected \"%s\"",
                        dbus_message_get_signature(message), signature);
@@ -1715,10 +1719,10 @@ static gboolean property_changed(DBusConnection *conn,
        }
 
        data = g_hash_table_lookup(vpn_connections, get_ident(path));
-       if (data == NULL)
+       if (!data)
                return TRUE;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
        dbus_message_iter_get_basic(&iter, &key);
@@ -1728,28 +1732,28 @@ static gboolean property_changed(DBusConnection *conn,
 
        DBG("key %s", key);
 
-       if (g_str_equal(key, "State") == TRUE) {
+       if (g_str_equal(key, "State")) {
                dbus_message_iter_get_basic(&value, &str);
 
                DBG("%s %s -> %s", data->path, data->state, str);
 
-               if (g_str_equal(data->state, str) == TRUE)
+               if (g_str_equal(data->state, str))
                        return TRUE;
 
                g_free(data->state);
                data->state = g_strdup(str);
 
                set_provider_state(data);
-       } else if (g_str_equal(key, "Index") == TRUE) {
+       } else if (g_str_equal(key, "Index")) {
                dbus_message_iter_get_basic(&value, &data->index);
                connman_provider_set_index(data->provider, data->index);
-       } else if (g_str_equal(key, "IPv4") == TRUE) {
+       } else if (g_str_equal(key, "IPv4")) {
                err = extract_ip(&value, AF_INET, data);
-               ip_set = TRUE;
-       } else if (g_str_equal(key, "IPv6") == TRUE) {
+               ip_set = true;
+       } else if (g_str_equal(key, "IPv6")) {
                err = extract_ip(&value, AF_INET6, data);
-               ip_set = TRUE;
-       } else if (g_str_equal(key, "ServerRoutes") == TRUE) {
+               ip_set = true;
+       } else if (g_str_equal(key, "ServerRoutes")) {
                err = routes_changed(&value, data->server_routes);
                /*
                 * Note that the vpnd will delay the route sending a bit
@@ -1761,24 +1765,24 @@ static gboolean property_changed(DBusConnection *conn,
                if (err == 0)
                        set_routes(data->provider,
                                                CONNMAN_PROVIDER_ROUTE_SERVER);
-       } else if (g_str_equal(key, "UserRoutes") == TRUE) {
+       } else if (g_str_equal(key, "UserRoutes")) {
                err = routes_changed(&value, data->user_routes);
                if (err == 0)
                        set_routes(data->provider,
                                                CONNMAN_PROVIDER_ROUTE_USER);
-       } else if (g_str_equal(key, "Nameservers") == TRUE) {
+       } else if (g_str_equal(key, "Nameservers")) {
                if (extract_nameservers(&value, data) == 0 &&
-                                               data->nameservers != NULL)
+                                               data->nameservers)
                        connman_provider_set_nameservers(data->provider,
                                                        data->nameservers);
-       } else if (g_str_equal(key, "Domain") == TRUE) {
+       } else if (g_str_equal(key, "Domain")) {
                dbus_message_iter_get_basic(&value, &str);
                g_free(data->domain);
                data->domain = g_strdup(str);
                connman_provider_set_domain(data->provider, data->domain);
        }
 
-       if (ip_set == TRUE && err == 0) {
+       if (ip_set && err == 0) {
                err = connman_provider_set_ipaddress(data->provider, data->ip);
                if (err < 0)
                        DBG("setting provider IP address failed (%s/%d)",
@@ -1793,7 +1797,7 @@ static int vpn_init(void)
        int err;
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
        watch = g_dbus_add_service_watch(connection, VPN_SERVICE,
@@ -1850,7 +1854,7 @@ static void vpn_exit(void)
 
        connman_provider_driver_unregister(&provider_driver);
 
-       if (vpn_connections != NULL)
+       if (vpn_connections)
                g_hash_table_destroy(vpn_connections);
 
        dbus_connection_unref(connection);
index 5f07869..ef4dd95 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -48,6 +48,7 @@
 #include <connman/rtnl.h>
 #include <connman/technology.h>
 #include <connman/service.h>
+#include <connman/peer.h>
 #include <connman/log.h>
 #include <connman/option.h>
 #include <connman/storage.h>
 
 #define CLEANUP_TIMEOUT   8    /* in seconds */
 #define INACTIVE_TIMEOUT  12   /* in seconds */
-#define MAXIMUM_RETRIES   2
-#define FAVORITE_MAXIMUM_RETRIES 4
+#define FAVORITE_MAXIMUM_RETRIES 2
 
 #define BGSCAN_DEFAULT "simple:30:-45:300"
 #define AUTOSCAN_DEFAULT "exponential:3:300"
 
+#define P2P_FIND_TIMEOUT 30
+
 static struct connman_technology *wifi_technology = NULL;
+static struct connman_technology *p2p_technology = NULL;
 
 struct hidden_params {
        char ssid[32];
        unsigned int ssid_len;
        char *identity;
        char *passphrase;
+       char *security;
+       GSupplicantScanParams *scan_params;
        gpointer user_data;
 };
 
@@ -93,37 +98,59 @@ struct wifi_data {
        GSList *networks;
        GSupplicantInterface *interface;
        GSupplicantState state;
-       connman_bool_t connected;
-       connman_bool_t disconnecting;
-       connman_bool_t tethering;
-       connman_bool_t bridged;
+       bool connected;
+       bool disconnecting;
+       bool tethering;
+       bool bridged;
+       bool interface_ready;
        const char *bridge;
        int index;
        unsigned flags;
        unsigned int watch;
        int retries;
        struct hidden_params *hidden;
+       bool postpone_hidden;
        /**
         * autoscan "emulation".
         */
        struct autoscan_params *autoscan;
 
        GSupplicantScanParams *scan_params;
+       unsigned int p2p_find_timeout;
 };
 
 static GList *iface_list = NULL;
 
 static void start_autoscan(struct connman_device *device);
 
+static int p2p_tech_probe(struct connman_technology *technology)
+{
+       p2p_technology = technology;
+
+       return 0;
+}
+
+static void p2p_tech_remove(struct connman_technology *technology)
+{
+       p2p_technology = NULL;
+}
+
+static struct connman_technology_driver p2p_tech_driver = {
+       .name           = "p2p",
+       .type           = CONNMAN_SERVICE_TYPE_P2P,
+       .probe          = p2p_tech_probe,
+       .remove         = p2p_tech_remove,
+};
+
 static void handle_tethering(struct wifi_data *wifi)
 {
-       if (wifi->tethering == FALSE)
+       if (!wifi->tethering)
                return;
 
-       if (wifi->bridge == NULL)
+       if (!wifi->bridge)
                return;
 
-       if (wifi->bridged == TRUE)
+       if (wifi->bridged)
                return;
 
        DBG("index %d bridge %s", wifi->index, wifi->bridge);
@@ -131,7 +158,7 @@ static void handle_tethering(struct wifi_data *wifi)
        if (connman_inet_add_to_bridge(wifi->index, wifi->bridge) < 0)
                return;
 
-       wifi->bridged = TRUE;
+       wifi->bridged = true;
 }
 
 static void wifi_newlink(unsigned flags, unsigned change, void *user_data)
@@ -139,7 +166,7 @@ static void wifi_newlink(unsigned flags, unsigned change, void *user_data)
        struct connman_device *device = user_data;
        struct wifi_data *wifi = connman_device_get_data(device);
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        DBG("index %d flags %d change %d", wifi->index, flags, change);
@@ -170,14 +197,9 @@ static int wifi_probe(struct connman_device *device)
        DBG("device %p", device);
 
        wifi = g_try_new0(struct wifi_data, 1);
-       if (wifi == NULL)
+       if (!wifi)
                return -ENOMEM;
 
-       wifi->connected = FALSE;
-       wifi->disconnecting = FALSE;
-       wifi->tethering = FALSE;
-       wifi->bridged = FALSE;
-       wifi->bridge = NULL;
        wifi->state = G_SUPPLICANT_STATE_INACTIVE;
 
        connman_device_set_data(device, wifi);
@@ -199,7 +221,7 @@ static void remove_networks(struct connman_device *device,
 {
        GSList *list;
 
-       for (list = wifi->networks; list != NULL; list = list->next) {
+       for (list = wifi->networks; list; list = list->next) {
                struct connman_network *network = list->data;
 
                connman_device_remove_network(device, network);
@@ -217,7 +239,7 @@ static void reset_autoscan(struct connman_device *device)
 
        DBG("");
 
-       if (wifi == NULL || wifi->autoscan == NULL)
+       if (!wifi || !wifi->autoscan)
                return;
 
        autoscan = wifi->autoscan;
@@ -237,12 +259,29 @@ static void stop_autoscan(struct connman_device *device)
 {
        const struct wifi_data *wifi = connman_device_get_data(device);
 
-       if (wifi == NULL || wifi->autoscan == NULL)
+       if (!wifi || !wifi->autoscan)
                return;
 
        reset_autoscan(device);
 
-       connman_device_set_scanning(device, FALSE);
+       connman_device_set_scanning(device, CONNMAN_SERVICE_TYPE_WIFI, false);
+}
+
+static void check_p2p_technology(void)
+{
+       bool p2p_exists = false;
+       GList *list;
+
+       for (list = iface_list; list; list = list->next) {
+               struct wifi_data *w = list->data;
+
+               if (w->interface &&
+                               g_supplicant_interface_has_p2p(w->interface))
+                       p2p_exists = true;
+       }
+
+       if (!p2p_exists)
+               connman_technology_driver_unregister(&p2p_tech_driver);
 }
 
 static void wifi_remove(struct connman_device *device)
@@ -251,21 +290,30 @@ static void wifi_remove(struct connman_device *device)
 
        DBG("device %p wifi %p", device, wifi);
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
+       stop_autoscan(device);
+
        iface_list = g_list_remove(iface_list, wifi);
 
+       check_p2p_technology();
+
+       if (wifi->p2p_find_timeout) {
+               g_source_remove(wifi->p2p_find_timeout);
+               connman_device_unref(wifi->device);
+       }
+
        remove_networks(device, wifi);
 
-       connman_device_set_powered(device, FALSE);
+       connman_device_set_powered(device, false);
        connman_device_set_data(device, NULL);
        connman_device_unref(wifi->device);
        connman_rtnl_remove_watch(wifi->watch);
 
        g_supplicant_interface_set_data(wifi->interface, NULL);
 
-       if (wifi->scan_params != NULL)
+       if (wifi->scan_params)
                g_supplicant_free_scan_params(wifi->scan_params);
 
        g_free(wifi->autoscan);
@@ -273,19 +321,19 @@ static void wifi_remove(struct connman_device *device)
        g_free(wifi);
 }
 
-static gboolean is_duplicate(GSList *list, gchar *ssid, int ssid_len)
+static bool is_duplicate(GSList *list, gchar *ssid, int ssid_len)
 {
        GSList *iter;
 
-       for (iter = list; iter != NULL; iter = g_slist_next(iter)) {
+       for (iter = list; iter; iter = g_slist_next(iter)) {
                struct scan_ssid *scan_ssid = iter->data;
 
                if (ssid_len == scan_ssid->ssid_len &&
                                memcmp(ssid, scan_ssid->ssid, ssid_len) == 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
@@ -297,15 +345,15 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
 
        if ((driver_max_scan_ssids == 0 ||
                        driver_max_scan_ssids > scan_data->num_ssids) &&
-                       (hex_ssid != NULL || raw_ssid != NULL)) {
+                       (hex_ssid || raw_ssid)) {
                gchar *ssid;
                unsigned int j = 0, hex;
 
-               if (hex_ssid != NULL) {
+               if (hex_ssid) {
                        size_t hex_ssid_len = strlen(hex_ssid);
 
                        ssid = g_try_malloc0(hex_ssid_len / 2);
-                       if (ssid == NULL)
+                       if (!ssid)
                                return -ENOMEM;
 
                        for (i = 0; i < hex_ssid_len; i += 2) {
@@ -323,12 +371,16 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
                 * used or are using multiple wifi cards, so in that case
                 * you might have multiple service files for same AP.
                 */
-               if (is_duplicate(scan_data->ssids, ssid, j) == TRUE)
+               if (is_duplicate(scan_data->ssids, ssid, j)) {
+                       if (hex_ssid)
+                               g_free(ssid);
                        return 0;
+               }
 
                scan_ssid = g_try_new(struct scan_ssid, 1);
-               if (scan_ssid == NULL) {
-                       g_free(ssid);
+               if (!scan_ssid) {
+                       if (hex_ssid)
+                               g_free(ssid);
                        return -ENOMEM;
                }
 
@@ -342,16 +394,16 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
                DBG("SSID %s added to scanned list of %d entries", ssid_name,
                                                        scan_data->num_ssids);
 
-               if (hex_ssid != NULL)
+               if (hex_ssid)
                        g_free(ssid);
        } else
                return -EINVAL;
 
        scan_data->ssids = g_slist_reverse(scan_data->ssids);
 
-       if (scan_data->freqs == NULL) {
+       if (!scan_data->freqs) {
                scan_data->freqs = g_try_malloc0(sizeof(uint16_t));
-               if (scan_data->freqs == NULL) {
+               if (!scan_data->freqs) {
                        g_slist_free_full(scan_data->ssids, g_free);
                        return -ENOMEM;
                }
@@ -359,21 +411,21 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
                scan_data->num_freqs = 1;
                scan_data->freqs[0] = freq;
        } else {
-               connman_bool_t duplicate = FALSE;
+               bool duplicate = false;
 
                /* Don't add duplicate entries */
                for (i = 0; i < scan_data->num_freqs; i++) {
                        if (scan_data->freqs[i] == freq) {
-                               duplicate = TRUE;
+                               duplicate = true;
                                break;
                        }
                }
 
-               if (duplicate == FALSE) {
+               if (!duplicate) {
                        scan_data->num_freqs++;
                        scan_data->freqs = g_try_realloc(scan_data->freqs,
                                sizeof(uint16_t) * scan_data->num_freqs);
-                       if (scan_data->freqs == NULL) {
+                       if (!scan_data->freqs) {
                                g_slist_free_full(scan_data->ssids, g_free);
                                return -ENOMEM;
                        }
@@ -391,7 +443,7 @@ static int get_hidden_connections(GSupplicantScanParams *scan_data)
        gchar **services;
        char *ssid, *name;
        int i, freq, ret;
-       gboolean value;
+       bool value;
        int num_ssids = 0, add_param_failed = 0;
 
        services = connman_storage_get_services();
@@ -400,19 +452,19 @@ static int get_hidden_connections(GSupplicantScanParams *scan_data)
                        continue;
 
                keyfile = connman_storage_load_service(services[i]);
-               if (keyfile == NULL)
+               if (!keyfile)
                        continue;
 
                value = g_key_file_get_boolean(keyfile,
                                        services[i], "Hidden", NULL);
-               if (value == FALSE) {
+               if (!value) {
                        g_key_file_free(keyfile);
                        continue;
                }
 
                value = g_key_file_get_boolean(keyfile,
                                        services[i], "Favorite", NULL);
-               if (value == FALSE) {
+               if (!value) {
                        g_key_file_free(keyfile);
                        continue;
                }
@@ -444,10 +496,10 @@ static int get_hidden_connections(GSupplicantScanParams *scan_data)
        for (i = 0; entries && entries[i]; i++) {
                int len;
 
-               if (entries[i]->hidden == FALSE)
+               if (!entries[i]->hidden)
                        continue;
 
-               if (entries[i]->ssid == NULL) {
+               if (!entries[i]->ssid) {
                        ssid = entries[i]->name;
                        len = strlen(ssid);
                } else {
@@ -455,7 +507,7 @@ static int get_hidden_connections(GSupplicantScanParams *scan_data)
                        len = entries[i]->ssid_len;
                }
 
-               if (ssid == NULL)
+               if (!ssid)
                        continue;
 
                ret = add_scan_param(NULL, ssid, len, 0, scan_data, 0, ssid);
@@ -493,9 +545,9 @@ static int get_hidden_connections_params(struct wifi_data *wifi,
 
        DBG("max ssids %d", driver_max_ssids);
 
-       if (wifi->scan_params == NULL) {
+       if (!wifi->scan_params) {
                wifi->scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
-               if (wifi->scan_params == NULL)
+               if (!wifi->scan_params)
                        return 0;
 
                if (get_hidden_connections(wifi->scan_params) == 0) {
@@ -512,7 +564,7 @@ static int get_hidden_connections_params(struct wifi_data *wifi,
        for (i = 0; i < driver_max_ssids; i++) {
                struct scan_ssid *ssid;
 
-               if (wifi->scan_params->ssids == NULL)
+               if (!wifi->scan_params->ssids)
                        break;
 
                ssid = orig_params->ssids->data;
@@ -526,7 +578,7 @@ static int get_hidden_connections_params(struct wifi_data *wifi,
 
                scan_params->freqs = g_memdup(orig_params->freqs,
                                sizeof(uint16_t) * orig_params->num_freqs);
-               if (scan_params->freqs == NULL)
+               if (!scan_params->freqs)
                        goto err;
 
                scan_params->num_freqs = orig_params->num_freqs;
@@ -552,24 +604,25 @@ static int throw_wifi_scan(struct connman_device *device,
        struct wifi_data *wifi = connman_device_get_data(device);
        int ret;
 
-       if (wifi == NULL)
+       if (!wifi)
                return -ENODEV;
 
        DBG("device %p %p", device, wifi->interface);
 
-       if (wifi->tethering == TRUE)
+       if (wifi->tethering)
                return -EBUSY;
 
-       if (connman_device_get_scanning(device) == TRUE)
+       if (connman_device_get_scanning(device))
                return -EALREADY;
 
        connman_device_ref(device);
 
        ret = g_supplicant_interface_scan(wifi->interface, NULL,
                                                callback, device);
-       if (ret == 0)
-               connman_device_set_scanning(device, TRUE);
-       else
+       if (ret == 0) {
+               connman_device_set_scanning(device,
+                               CONNMAN_SERVICE_TYPE_WIFI, true);
+       } else
                connman_device_unref(device);
 
        return ret;
@@ -577,11 +630,14 @@ static int throw_wifi_scan(struct connman_device *device,
 
 static void hidden_free(struct hidden_params *hidden)
 {
-       if (hidden == NULL)
+       if (!hidden)
                return;
 
+       if (hidden->scan_params)
+               g_supplicant_free_scan_params(hidden->scan_params);
        g_free(hidden->identity);
        g_free(hidden->passphrase);
+       g_free(hidden->security);
        g_free(hidden);
 }
 
@@ -590,18 +646,18 @@ static void scan_callback(int result, GSupplicantInterface *interface,
 {
        struct connman_device *device = user_data;
        struct wifi_data *wifi = connman_device_get_data(device);
-       connman_bool_t scanning;
+       bool scanning;
 
        DBG("result %d wifi %p", result, wifi);
 
-       if (wifi != NULL) {
-               if (wifi->hidden != NULL) {
+       if (wifi) {
+               if (wifi->hidden && !wifi->postpone_hidden) {
                        connman_network_clear_hidden(wifi->hidden->user_data);
                        hidden_free(wifi->hidden);
                        wifi->hidden = NULL;
                }
 
-               if (wifi->scan_params != NULL) {
+               if (wifi->scan_params) {
                        g_supplicant_free_scan_params(wifi->scan_params);
                        wifi->scan_params = NULL;
                }
@@ -610,10 +666,32 @@ static void scan_callback(int result, GSupplicantInterface *interface,
        if (result < 0)
                connman_device_reset_scanning(device);
 
+       /* User is connecting to a hidden AP, let's wait for finished event */
+       if (wifi && wifi->hidden && wifi->postpone_hidden) {
+               GSupplicantScanParams *scan_params;
+               int ret;
+
+               wifi->postpone_hidden = false;
+               scan_params = wifi->hidden->scan_params;
+               wifi->hidden->scan_params = NULL;
+
+               reset_autoscan(device);
+
+               ret = g_supplicant_interface_scan(wifi->interface, scan_params,
+                                                       scan_callback, device);
+               if (ret == 0)
+                       return;
+
+               /* On error, let's recall scan_callback, which will cleanup */
+               return scan_callback(ret, interface, user_data);
+       }
+
        scanning = connman_device_get_scanning(device);
 
-       if (scanning == TRUE)
-               connman_device_set_scanning(device, FALSE);
+       if (scanning) {
+               connman_device_set_scanning(device,
+                               CONNMAN_SERVICE_TYPE_WIFI, false);
+       }
 
        if (result != -ENOLINK)
                start_autoscan(device);
@@ -625,7 +703,7 @@ static void scan_callback(int result, GSupplicantInterface *interface,
         * unreferenced the device, obviating the need to do it here.
         */
 
-       if (scanning == TRUE)
+       if (scanning)
                connman_device_unref(device);
 }
 
@@ -639,11 +717,15 @@ static void scan_callback_hidden(int result,
 
        DBG("result %d wifi %p", result, wifi);
 
-       if (wifi == NULL)
+       if (!wifi)
+               goto out;
+
+       /* User is trying to connect to a hidden AP */
+       if (wifi->hidden && wifi->postpone_hidden)
                goto out;
 
        scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
-       if (scan_params == NULL)
+       if (!scan_params)
                goto out;
 
        if (get_hidden_connections_params(wifi, scan_params) > 0) {
@@ -668,7 +750,7 @@ static gboolean autoscan_timeout(gpointer data)
        struct autoscan_params *autoscan;
        int interval;
 
-       if (wifi == NULL)
+       if (!wifi)
                return FALSE;
 
        autoscan = wifi->autoscan;
@@ -702,11 +784,11 @@ static void start_autoscan(struct connman_device *device)
 
        DBG("");
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        autoscan = wifi->autoscan;
-       if (autoscan == NULL)
+       if (!autoscan)
                return;
 
        if (autoscan->timeout > 0 || autoscan->interval > 0)
@@ -741,7 +823,7 @@ static struct autoscan_params *parse_autoscan_params(const char *params)
        g_strfreev(list_params);
 
        autoscan = g_try_malloc0(sizeof(struct autoscan_params));
-       if (autoscan == NULL) {
+       if (!autoscan) {
                DBG("Could not allocate memory for autoscan");
                return NULL;
        }
@@ -755,7 +837,7 @@ static struct autoscan_params *parse_autoscan_params(const char *params)
 
 static void setup_autoscan(struct wifi_data *wifi)
 {
-       if (wifi->autoscan == NULL)
+       if (!wifi->autoscan)
                wifi->autoscan = parse_autoscan_params(AUTOSCAN_DEFAULT);
 
        start_autoscan(wifi->device);
@@ -773,35 +855,20 @@ static void interface_autoscan_callback(int result,
        }
 }
 
-static void interface_create_callback(int result,
-                                       GSupplicantInterface *interface,
-                                                       void *user_data)
+static void finalize_interface_creation(struct wifi_data *wifi)
 {
-       struct wifi_data *wifi = user_data;
-
-       DBG("result %d ifname %s, wifi %p", result,
-                               g_supplicant_interface_get_ifname(interface),
-                               wifi);
-
-       if (result < 0 || wifi == NULL)
-               return;
-
-       wifi->interface = interface;
-       g_supplicant_interface_set_data(interface, wifi);
-
-       if (g_supplicant_interface_get_ready(interface) == FALSE)
-               return;
+       GSupplicantInterface *interface = wifi->interface;
 
        DBG("interface is ready wifi %p tethering %d", wifi, wifi->tethering);
 
-       if (wifi->device == NULL) {
+       if (!wifi->device) {
                connman_error("WiFi device not set");
                return;
        }
 
-       connman_device_set_powered(wifi->device, TRUE);
+       connman_device_set_powered(wifi->device, true);
 
-       if (connman_setting_get_bool("BackgroundScanning") == FALSE)
+       if (!connman_setting_get_bool("BackgroundScanning"))
                return;
 
        /* Setting up automatic scanning */
@@ -812,21 +879,48 @@ static void interface_create_callback(int result,
        }
 }
 
+static void interface_create_callback(int result,
+                                       GSupplicantInterface *interface,
+                                                       void *user_data)
+{
+       struct wifi_data *wifi = user_data;
+
+       DBG("result %d ifname %s, wifi %p", result,
+                               g_supplicant_interface_get_ifname(interface),
+                               wifi);
+
+       if (result < 0 || !wifi)
+               return;
+
+       wifi->interface = interface;
+       g_supplicant_interface_set_data(interface, wifi);
+
+       if (g_supplicant_interface_get_ready(interface)) {
+               wifi->interface_ready = true;
+               finalize_interface_creation(wifi);
+       }
+}
+
 static int wifi_enable(struct connman_device *device)
 {
        struct wifi_data *wifi = connman_device_get_data(device);
-       const char *interface = connman_device_get_string(device, "Interface");
+       int index;
+       char *interface;
        const char *driver = connman_option_get_string("wifi");
        int ret;
 
        DBG("device %p %p", device, wifi);
 
-       if (wifi == NULL)
+       index = connman_device_get_index(device);
+       if (!wifi || index < 0)
                return -ENODEV;
 
+       interface = connman_inet_ifname(index);
        ret = g_supplicant_interface_create(interface, driver, NULL,
                                                interface_create_callback,
                                                        wifi);
+       g_free(interface);
+
        if (ret < 0)
                return ret;
 
@@ -840,20 +934,27 @@ static int wifi_disable(struct connman_device *device)
 
        DBG("device %p wifi %p", device, wifi);
 
-       if (wifi == NULL)
+       if (!wifi)
                return -ENODEV;
 
-       wifi->connected = FALSE;
-       wifi->disconnecting = FALSE;
+       wifi->connected = false;
+       wifi->disconnecting = false;
 
-       if (wifi->pending_network != NULL)
+       if (wifi->pending_network)
                wifi->pending_network = NULL;
 
        stop_autoscan(device);
 
+       if (wifi->p2p_find_timeout) {
+               g_source_remove(wifi->p2p_find_timeout);
+               wifi->p2p_find_timeout = 0;
+               connman_device_unref(wifi->device);
+       }
+
        /* In case of a user scan, device is still referenced */
-       if (connman_device_get_scanning(device) == TRUE) {
-               connman_device_set_scanning(device, FALSE);
+       if (connman_device_get_scanning(device)) {
+               connman_device_set_scanning(device,
+                               CONNMAN_SERVICE_TYPE_WIFI, false);
                connman_device_unref(wifi->device);
        }
 
@@ -910,7 +1011,7 @@ static int get_latest_connections(int max_ssids,
        int num_ssids = 0;
 
        latest_list = g_sequence_new(free_entry);
-       if (latest_list == NULL)
+       if (!latest_list)
                return -ENOMEM;
 
        services = connman_storage_get_services();
@@ -919,14 +1020,13 @@ static int get_latest_connections(int max_ssids,
                        continue;
 
                keyfile = connman_storage_load_service(services[i]);
-               if (keyfile == NULL)
+               if (!keyfile)
                        continue;
 
                str = g_key_file_get_string(keyfile,
                                        services[i], "Favorite", NULL);
-               if (str == NULL || g_strcmp0(str, "true")) {
-                       if (str)
-                               g_free(str);
+               if (!str || g_strcmp0(str, "true")) {
+                       g_free(str);
                        g_key_file_free(keyfile);
                        continue;
                }
@@ -934,9 +1034,8 @@ static int get_latest_connections(int max_ssids,
 
                str = g_key_file_get_string(keyfile,
                                        services[i], "AutoConnect", NULL);
-               if (str == NULL || g_strcmp0(str, "true")) {
-                       if (str)
-                               g_free(str);
+               if (!str || g_strcmp0(str, "true")) {
+                       g_free(str);
                        g_key_file_free(keyfile);
                        continue;
                }
@@ -944,10 +1043,12 @@ static int get_latest_connections(int max_ssids,
 
                str = g_key_file_get_string(keyfile,
                                        services[i], "Modified", NULL);
-               if (str != NULL) {
-                       g_time_val_from_iso8601(str, &modified);
-                       g_free(str);
+               if (!str) {
+                       g_key_file_free(keyfile);
+                       continue;
                }
+               g_time_val_from_iso8601(str, &modified);
+               g_free(str);
 
                ssid = g_key_file_get_string(keyfile,
                                        services[i], "SSID", NULL);
@@ -956,7 +1057,7 @@ static int get_latest_connections(int max_ssids,
                                        "Frequency", NULL);
                if (freq) {
                        entry = g_try_new(struct last_connected, 1);
-                       if (entry == NULL) {
+                       if (!entry) {
                                g_sequence_free(latest_list);
                                g_key_file_free(keyfile);
                                g_free(ssid);
@@ -1005,14 +1106,86 @@ static int wifi_scan_simple(struct connman_device *device)
        return throw_wifi_scan(device, scan_callback_hidden);
 }
 
+static gboolean p2p_find_stop(gpointer data)
+{
+       struct connman_device *device = data;
+       struct wifi_data *wifi = connman_device_get_data(device);
+
+       DBG("");
+
+       wifi->p2p_find_timeout = 0;
+
+       connman_device_set_scanning(device, CONNMAN_SERVICE_TYPE_P2P, false);
+
+       g_supplicant_interface_p2p_stop_find(wifi->interface);
+
+       connman_device_unref(device);
+       reset_autoscan(device);
+
+       return FALSE;
+}
+
+static void p2p_find_callback(int result, GSupplicantInterface *interface,
+                                                       void *user_data)
+{
+       struct connman_device *device = user_data;
+       struct wifi_data *wifi = connman_device_get_data(device);
+
+       DBG("result %d wifi %p", result, wifi);
+
+       if (wifi->p2p_find_timeout) {
+               g_source_remove(wifi->p2p_find_timeout);
+               wifi->p2p_find_timeout = 0;
+       }
+
+       if (result)
+               goto error;
+
+       wifi->p2p_find_timeout = g_timeout_add_seconds(P2P_FIND_TIMEOUT,
+                                                       p2p_find_stop, device);
+       if (!wifi->p2p_find_timeout)
+               goto error;
+
+       return;
+error:
+       p2p_find_stop(device);
+}
+
+static int p2p_find(struct connman_device *device)
+{
+       struct wifi_data *wifi = connman_device_get_data(device);
+       int ret;
+
+       DBG("");
+
+       if (!p2p_technology)
+               return -ENOTSUP;
+
+       reset_autoscan(device);
+       connman_device_ref(device);
+
+       ret = g_supplicant_interface_p2p_find(wifi->interface,
+                                               p2p_find_callback, device);
+       if (ret) {
+               connman_device_unref(device);
+               start_autoscan(device);
+       } else {
+               connman_device_set_scanning(device,
+                               CONNMAN_SERVICE_TYPE_P2P, true);
+       }
+
+       return ret;
+}
+
 /*
  * Note that the hidden scan is only used when connecting to this specific
  * hidden AP first time. It is not used when system autoconnects to hidden AP.
  */
-static int wifi_scan(struct connman_device *device,
-               const char *ssid, unsigned int ssid_len,
-               const char *identity, const char* passphrase,
-               gpointer user_data)
+static int wifi_scan(enum connman_service_type type,
+                       struct connman_device *device,
+                       const char *ssid, unsigned int ssid_len,
+                       const char *identity, const char* passphrase,
+                       const char *security, void *user_data)
 {
        struct wifi_data *wifi = connman_device_get_data(device);
        GSupplicantScanParams *scan_params = NULL;
@@ -1020,43 +1193,47 @@ static int wifi_scan(struct connman_device *device,
        struct hidden_params *hidden;
        int ret;
        int driver_max_ssids = 0;
-       connman_bool_t do_hidden;
+       bool do_hidden;
+       bool scanning;
 
-       if (wifi == NULL)
+       if (!wifi)
                return -ENODEV;
 
+       if (type == CONNMAN_SERVICE_TYPE_P2P)
+               return p2p_find(device);
+
        DBG("device %p wifi %p hidden ssid %s", device, wifi->interface, ssid);
 
-       if (wifi->tethering == TRUE)
+       if (wifi->tethering)
                return 0;
 
-       if (connman_device_get_scanning(device) == TRUE)
-               return -EALREADY;
-
-       if (ssid == NULL || ssid_len == 0 || ssid_len > 32) {
-               do_hidden = FALSE;
-       } else {
-               if (wifi->hidden != NULL)
-                       return -EBUSY;
+       scanning = connman_device_get_scanning(device);
 
-               do_hidden = TRUE;
-       }
+       if (!ssid || ssid_len == 0 || ssid_len > 32) {
+               if (scanning)
+                       return -EALREADY;
 
-       if (do_hidden == FALSE) {
                driver_max_ssids = g_supplicant_interface_get_max_scan_ssids(
                                                        wifi->interface);
                DBG("max ssids %d", driver_max_ssids);
                if (driver_max_ssids == 0)
                        return wifi_scan_simple(device);
+
+               do_hidden = false;
+       } else {
+               if (scanning && wifi->hidden && wifi->postpone_hidden)
+                       return -EALREADY;
+
+               do_hidden = true;
        }
 
        scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
-       if (scan_params == NULL)
+       if (!scan_params)
                return -ENOMEM;
 
-       if (do_hidden == TRUE) {
+       if (do_hidden) {
                scan_ssid = g_try_new(struct scan_ssid, 1);
-               if (scan_ssid == NULL) {
+               if (!scan_ssid) {
                        g_free(scan_params);
                        return -ENOMEM;
                }
@@ -1068,18 +1245,32 @@ static int wifi_scan(struct connman_device *device,
                scan_params->num_ssids = 1;
 
                hidden = g_try_new0(struct hidden_params, 1);
-               if (hidden == NULL) {
-                       g_free(scan_params);
+               if (!hidden) {
+                       g_supplicant_free_scan_params(scan_params);
                        return -ENOMEM;
                }
 
+               if (wifi->hidden) {
+                       hidden_free(wifi->hidden);
+                       wifi->hidden = NULL;
+               }
+
                memcpy(hidden->ssid, ssid, ssid_len);
                hidden->ssid_len = ssid_len;
                hidden->identity = g_strdup(identity);
                hidden->passphrase = g_strdup(passphrase);
+               hidden->security = g_strdup(security);
                hidden->user_data = user_data;
                wifi->hidden = hidden;
 
+               if (scanning) {
+                       /* Let's keep this active scan for later,
+                        * when current scan will be over. */
+                       wifi->postpone_hidden = TRUE;
+                       hidden->scan_params = scan_params;
+
+                       return 0;
+               }
        } else {
                ret = get_latest_connections(driver_max_ssids, scan_params);
                if (ret <= 0) {
@@ -1094,13 +1285,14 @@ static int wifi_scan(struct connman_device *device,
 
        ret = g_supplicant_interface_scan(wifi->interface, scan_params,
                                                scan_callback, device);
-       if (ret == 0)
-               connman_device_set_scanning(device, TRUE);
-       else {
+       if (ret == 0) {
+               connman_device_set_scanning(device,
+                               CONNMAN_SERVICE_TYPE_WIFI, true);
+       } else {
                g_supplicant_free_scan_params(scan_params);
                connman_device_unref(device);
 
-               if (do_hidden == TRUE) {
+               if (do_hidden) {
                        hidden_free(wifi->hidden);
                        wifi->hidden = NULL;
                }
@@ -1125,7 +1317,7 @@ static int wifi_set_regdom(struct connman_device *device, const char *alpha2)
        struct wifi_data *wifi = connman_device_get_data(device);
        int ret;
 
-       if (wifi == NULL)
+       if (!wifi)
                return -EINVAL;
 
        connman_device_ref(device);
@@ -1181,7 +1373,7 @@ static void network_remove(struct connman_network *network)
        DBG("network %p", network);
 
        wifi = connman_device_get_data(device);
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        if (wifi->network != network)
@@ -1204,21 +1396,23 @@ static void connect_callback(int result, GSupplicantInterface *interface,
                connman_network_set_error(network,
                                        CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
        }
+
+       connman_network_unref(network);
 }
 
 static GSupplicantSecurity network_security(const char *security)
 {
-       if (g_str_equal(security, "none") == TRUE)
+       if (g_str_equal(security, "none"))
                return G_SUPPLICANT_SECURITY_NONE;
-       else if (g_str_equal(security, "wep") == TRUE)
+       else if (g_str_equal(security, "wep"))
                return G_SUPPLICANT_SECURITY_WEP;
-       else if (g_str_equal(security, "psk") == TRUE)
+       else if (g_str_equal(security, "psk"))
                return G_SUPPLICANT_SECURITY_PSK;
-       else if (g_str_equal(security, "wpa") == TRUE)
+       else if (g_str_equal(security, "wpa"))
                return G_SUPPLICANT_SECURITY_PSK;
-       else if (g_str_equal(security, "rsn") == TRUE)
+       else if (g_str_equal(security, "rsn"))
                return G_SUPPLICANT_SECURITY_PSK;
-       else if (g_str_equal(security, "ieee8021x") == TRUE)
+       else if (g_str_equal(security, "ieee8021x"))
                return G_SUPPLICANT_SECURITY_IEEE8021X;
 
        return G_SUPPLICANT_SECURITY_UNKNOWN;
@@ -1226,7 +1420,7 @@ static GSupplicantSecurity network_security(const char *security)
 
 static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
 {
-       const char *security, *passphrase, *agent_passphrase;
+       const char *security;
 
        memset(ssid, 0, sizeof(*ssid));
        ssid->mode = G_SUPPLICANT_MODE_INFRA;
@@ -1235,20 +1429,8 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
        ssid->scan_ssid = 1;
        security = connman_network_get_string(network, "WiFi.Security");
        ssid->security = network_security(security);
-       passphrase = connman_network_get_string(network,
+       ssid->passphrase = connman_network_get_string(network,
                                                "WiFi.Passphrase");
-       if (passphrase == NULL || strlen(passphrase) == 0) {
-
-               /* Use agent provided passphrase as a fallback */
-               agent_passphrase = connman_network_get_string(network,
-                                               "WiFi.AgentPassphrase");
-
-               if (agent_passphrase == NULL || strlen(agent_passphrase) == 0)
-                       ssid->passphrase = NULL;
-               else
-                       ssid->passphrase = agent_passphrase;
-       } else
-               ssid->passphrase = passphrase;
 
        ssid->eap = connman_network_get_string(network, "WiFi.EAP");
 
@@ -1258,8 +1440,7 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
         * for PEAP where 2 passphrases (identity and client
         * cert may have to be provided.
         */
-       if (connman_network_get_string(network,
-                                       "WiFi.PrivateKeyPassphrase") == NULL)
+       if (!connman_network_get_string(network, "WiFi.PrivateKeyPassphrase"))
                connman_network_set_string(network,
                                                "WiFi.PrivateKeyPassphrase",
                                                ssid->passphrase);
@@ -1267,7 +1448,7 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
        ssid->identity = connman_network_get_string(network, "WiFi.Identity");
 
        /* Use agent provided identity as a fallback */
-       if (ssid->identity == NULL || strlen(ssid->identity) == 0)
+       if (!ssid->identity || strlen(ssid->identity) == 0)
                ssid->identity = connman_network_get_string(network,
                                                        "WiFi.AgentIdentity");
 
@@ -1284,7 +1465,7 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
        ssid->use_wps = connman_network_get_bool(network, "WiFi.UseWPS");
        ssid->pin_wps = connman_network_get_string(network, "WiFi.PinWPS");
 
-       if (connman_setting_get_bool("BackgroundScanning") == TRUE)
+       if (connman_setting_get_bool("BackgroundScanning"))
                ssid->bgscan = BGSCAN_DEFAULT;
 }
 
@@ -1297,25 +1478,26 @@ static int network_connect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (device == NULL)
+       if (!device)
                return -ENODEV;
 
        wifi = connman_device_get_data(device);
-       if (wifi == NULL)
+       if (!wifi)
                return -ENODEV;
 
        ssid = g_try_malloc0(sizeof(GSupplicantSSID));
-       if (ssid == NULL)
+       if (!ssid)
                return -ENOMEM;
 
        interface = wifi->interface;
 
        ssid_init(ssid, network);
 
-       if (wifi->disconnecting == TRUE)
+       if (wifi->disconnecting) {
                wifi->pending_network = network;
-       else {
-               wifi->network = network;
+               g_free(ssid);
+       } else {
+               wifi->network = connman_network_ref(network);
                wifi->retries = 0;
 
                return g_supplicant_interface_connect(interface, ssid,
@@ -1338,7 +1520,7 @@ static void disconnect_callback(int result, GSupplicantInterface *interface,
                return;
        }
 
-       if (wifi->network != NULL) {
+       if (wifi->network) {
                /*
                 * if result < 0 supplican return an error because
                 * the network is not current.
@@ -1347,14 +1529,14 @@ static void disconnect_callback(int result, GSupplicantInterface *interface,
                 * disconnect is completed.
                 */
                if (result < 0)
-                       connman_network_set_connected(wifi->network, FALSE);
+                       connman_network_set_connected(wifi->network, false);
        }
 
        wifi->network = NULL;
 
-       wifi->disconnecting = FALSE;
+       wifi->disconnecting = false;
 
-       if (wifi->pending_network != NULL) {
+       if (wifi->pending_network) {
                network_connect(wifi->pending_network);
                wifi->pending_network = NULL;
        }
@@ -1371,20 +1553,20 @@ static int network_disconnect(struct connman_network *network)
        DBG("network %p", network);
 
        wifi = connman_device_get_data(device);
-       if (wifi == NULL || wifi->interface == NULL)
+       if (!wifi || !wifi->interface)
                return -ENODEV;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 
-       if (wifi->disconnecting == TRUE)
+       if (wifi->disconnecting)
                return -EALREADY;
 
-       wifi->disconnecting = TRUE;
+       wifi->disconnecting = true;
 
        err = g_supplicant_interface_disconnect(wifi->interface,
                                                disconnect_callback, wifi);
        if (err < 0)
-               wifi->disconnecting = FALSE;
+               wifi->disconnecting = false;
 
        return err;
 }
@@ -1412,24 +1594,24 @@ static void interface_added(GSupplicantInterface *interface)
         * the interface added signal is sent before the
         * interface creation callback is called.
         */
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        DBG("ifname %s driver %s wifi %p tethering %d",
                        ifname, driver, wifi, wifi->tethering);
 
-       if (wifi->device == NULL) {
+       if (!wifi->device) {
                connman_error("WiFi device not set");
                return;
        }
 
-       connman_device_set_powered(wifi->device, TRUE);
+       connman_device_set_powered(wifi->device, true);
 
-       if (wifi->tethering == TRUE)
+       if (wifi->tethering)
                return;
 }
 
-static connman_bool_t is_idle(struct wifi_data *wifi)
+static bool is_idle(struct wifi_data *wifi)
 {
        DBG("state %d", wifi->state);
 
@@ -1439,7 +1621,7 @@ static connman_bool_t is_idle(struct wifi_data *wifi)
        case G_SUPPLICANT_STATE_DISCONNECTED:
        case G_SUPPLICANT_STATE_INACTIVE:
        case G_SUPPLICANT_STATE_SCANNING:
-               return TRUE;
+               return true;
 
        case G_SUPPLICANT_STATE_AUTHENTICATING:
        case G_SUPPLICANT_STATE_ASSOCIATING:
@@ -1447,19 +1629,19 @@ static connman_bool_t is_idle(struct wifi_data *wifi)
        case G_SUPPLICANT_STATE_4WAY_HANDSHAKE:
        case G_SUPPLICANT_STATE_GROUP_HANDSHAKE:
        case G_SUPPLICANT_STATE_COMPLETED:
-               return FALSE;
+               return false;
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t is_idle_wps(GSupplicantInterface *interface,
+static bool is_idle_wps(GSupplicantInterface *interface,
                                                struct wifi_data *wifi)
 {
        /* First, let's check if WPS processing did not went wrong */
        if (g_supplicant_interface_get_wps_state(interface) ==
                G_SUPPLICANT_WPS_STATE_FAIL)
-               return FALSE;
+               return false;
 
        /* Unlike normal connection, being associated while processing wps
         * actually means that we are idling. */
@@ -1470,27 +1652,27 @@ static connman_bool_t is_idle_wps(GSupplicantInterface *interface,
        case G_SUPPLICANT_STATE_INACTIVE:
        case G_SUPPLICANT_STATE_SCANNING:
        case G_SUPPLICANT_STATE_ASSOCIATED:
-               return TRUE;
+               return true;
        case G_SUPPLICANT_STATE_AUTHENTICATING:
        case G_SUPPLICANT_STATE_ASSOCIATING:
        case G_SUPPLICANT_STATE_4WAY_HANDSHAKE:
        case G_SUPPLICANT_STATE_GROUP_HANDSHAKE:
        case G_SUPPLICANT_STATE_COMPLETED:
-               return FALSE;
+               return false;
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t handle_wps_completion(GSupplicantInterface *interface,
+static bool handle_wps_completion(GSupplicantInterface *interface,
                                        struct connman_network *network,
                                        struct connman_device *device,
                                        struct wifi_data *wifi)
 {
-       connman_bool_t wps;
+       bool wps;
 
        wps = connman_network_get_bool(network, "WiFi.UseWPS");
-       if (wps == TRUE) {
+       if (wps) {
                const unsigned char *ssid, *wps_ssid;
                unsigned int ssid_len, wps_ssid_len;
                const char *wps_key;
@@ -1503,12 +1685,12 @@ static connman_bool_t handle_wps_completion(GSupplicantInterface *interface,
                wps_ssid = g_supplicant_interface_get_wps_ssid(
                        interface, &wps_ssid_len);
 
-               if (wps_ssid == NULL || wps_ssid_len != ssid_len ||
+               if (!wps_ssid || wps_ssid_len != ssid_len ||
                                memcmp(ssid, wps_ssid, ssid_len) != 0) {
-                       connman_network_set_associating(network, FALSE);
+                       connman_network_set_associating(network, false);
                        g_supplicant_interface_disconnect(wifi->interface,
                                                disconnect_callback, wifi);
-                       return FALSE;
+                       return false;
                }
 
                wps_key = g_supplicant_interface_get_wps_key(interface);
@@ -1518,33 +1700,33 @@ static connman_bool_t handle_wps_completion(GSupplicantInterface *interface,
                connman_network_set_string(network, "WiFi.PinWPS", NULL);
        }
 
-       return TRUE;
+       return true;
 }
 
-static connman_bool_t handle_4way_handshake_failure(GSupplicantInterface *interface,
+static bool handle_4way_handshake_failure(GSupplicantInterface *interface,
                                        struct connman_network *network,
                                        struct wifi_data *wifi)
 {
        struct connman_service *service;
 
        if (wifi->state != G_SUPPLICANT_STATE_4WAY_HANDSHAKE)
-               return FALSE;
+               return false;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
-               return FALSE;
+       if (!service)
+               return false;
 
        wifi->retries++;
 
-       if (connman_service_get_favorite(service) == TRUE) {
+       if (connman_service_get_favorite(service)) {
                if (wifi->retries < FAVORITE_MAXIMUM_RETRIES)
-                       return TRUE;
-       } else if (wifi->retries < MAXIMUM_RETRIES)
-               return TRUE;
+                       return true;
+       }
 
+       wifi->retries = 0;
        connman_network_set_error(network, CONNMAN_NETWORK_ERROR_INVALID_KEY);
 
-       return FALSE;
+       return false;
 }
 
 static void interface_state(GSupplicantInterface *interface)
@@ -1553,19 +1735,27 @@ static void interface_state(GSupplicantInterface *interface)
        struct connman_device *device;
        struct wifi_data *wifi;
        GSupplicantState state = g_supplicant_interface_get_state(interface);
-       connman_bool_t wps;
+       bool wps;
 
        wifi = g_supplicant_interface_get_data(interface);
 
        DBG("wifi %p interface state %d", wifi, state);
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
-       network = wifi->network;
        device = wifi->device;
+       if (!device)
+               return;
 
-       if (device == NULL || network == NULL)
+       if (g_supplicant_interface_get_ready(interface) &&
+                                       !wifi->interface_ready) {
+               wifi->interface_ready = true;
+               finalize_interface_creation(wifi);
+       }
+
+       network = wifi->network;
+       if (!network)
                return;
 
        switch (state) {
@@ -1576,8 +1766,8 @@ static void interface_state(GSupplicantInterface *interface)
        case G_SUPPLICANT_STATE_ASSOCIATING:
                stop_autoscan(device);
 
-               if (wifi->connected == FALSE)
-                       connman_network_set_associating(network, TRUE);
+               if (!wifi->connected)
+                       connman_network_set_associating(network, true);
 
                break;
 
@@ -1585,11 +1775,10 @@ static void interface_state(GSupplicantInterface *interface)
                /* though it should be already stopped: */
                stop_autoscan(device);
 
-               if (handle_wps_completion(interface, network, device, wifi) ==
-                                                                       FALSE)
+               if (!handle_wps_completion(interface, network, device, wifi))
                        break;
 
-               connman_network_set_connected(network, TRUE);
+               connman_network_set_connected(network, true);
                break;
 
        case G_SUPPLICANT_STATE_DISCONNECTED:
@@ -1600,8 +1789,8 @@ static void interface_state(GSupplicantInterface *interface)
                 * in progress.
                 */
                wps = connman_network_get_bool(network, "WiFi.UseWPS");
-               if (wps == TRUE)
-                       if (is_idle_wps(interface, wifi) == TRUE)
+               if (wps)
+                       if (is_idle_wps(interface, wifi))
                                break;
 
                if (is_idle(wifi))
@@ -1612,7 +1801,7 @@ static void interface_state(GSupplicantInterface *interface)
                 * or if we reach the maximum retries we declare the
                 * psk as wrong */
                if (handle_4way_handshake_failure(interface,
-                                               network, wifi) == TRUE)
+                                               network, wifi))
                        break;
 
                /* We disable the selected network, if not then
@@ -1621,16 +1810,16 @@ static void interface_state(GSupplicantInterface *interface)
                                                FALSE) != 0)
                        DBG("Could not disables selected network");
 
-               connman_network_set_connected(network, FALSE);
-               connman_network_set_associating(network, FALSE);
-               wifi->disconnecting = FALSE;
+               connman_network_set_connected(network, false);
+               connman_network_set_associating(network, false);
+               wifi->disconnecting = false;
 
                start_autoscan(device);
 
                break;
 
        case G_SUPPLICANT_STATE_INACTIVE:
-               connman_network_set_associating(network, FALSE);
+               connman_network_set_associating(network, false);
                start_autoscan(device);
 
                break;
@@ -1659,17 +1848,17 @@ static void interface_state(GSupplicantInterface *interface)
        case G_SUPPLICANT_STATE_ASSOCIATED:
        case G_SUPPLICANT_STATE_4WAY_HANDSHAKE:
        case G_SUPPLICANT_STATE_GROUP_HANDSHAKE:
-               if (wifi->connected == TRUE)
+               if (wifi->connected)
                        connman_warn("Probably roaming right now!"
                                                " Staying connected...");
                else
-                       wifi->connected = FALSE;
+                       wifi->connected = false;
                break;
        case G_SUPPLICANT_STATE_COMPLETED:
-               wifi->connected = TRUE;
+               wifi->connected = true;
                break;
        default:
-               wifi->connected = FALSE;
+               wifi->connected = false;
                break;
        }
 
@@ -1685,16 +1874,29 @@ static void interface_removed(GSupplicantInterface *interface)
 
        wifi = g_supplicant_interface_get_data(interface);
 
-       if (wifi != NULL && wifi->tethering == TRUE)
+       if (wifi && wifi->tethering)
                return;
 
-       if (wifi == NULL || wifi->device == NULL) {
+       if (!wifi || !wifi->device) {
                DBG("wifi interface already removed");
                return;
        }
 
        wifi->interface = NULL;
-       connman_device_set_powered(wifi->device, FALSE);
+       connman_device_set_powered(wifi->device, false);
+
+       check_p2p_technology();
+}
+
+static void p2p_support(GSupplicantInterface *interface)
+{
+       DBG("");
+
+       if (!g_supplicant_interface_has_p2p(interface))
+               return;
+
+       if (connman_technology_driver_register(&p2p_tech_driver) == 0)
+               DBG("Could not register P2P technology driver");
 }
 
 static void scan_started(GSupplicantInterface *interface)
@@ -1726,17 +1928,22 @@ static void network_added(GSupplicantNetwork *supplicant_network)
        const char *name, *identifier, *security, *group, *mode;
        const unsigned char *ssid;
        unsigned int ssid_len;
-       connman_bool_t wps;
-       connman_bool_t wps_pbc;
-       connman_bool_t wps_ready;
-       connman_bool_t wps_advertizing;
+       bool wps;
+       bool wps_pbc;
+       bool wps_ready;
+       bool wps_advertizing;
 
-       DBG("");
+       mode = g_supplicant_network_get_mode(supplicant_network);
+       identifier = g_supplicant_network_get_identifier(supplicant_network);
+
+       DBG("%s", identifier);
+
+       if (!g_strcmp0(mode, "adhoc"))
+               return;
 
        interface = g_supplicant_network_get_interface(supplicant_network);
        wifi = g_supplicant_interface_get_data(interface);
        name = g_supplicant_network_get_name(supplicant_network);
-       identifier = g_supplicant_network_get_identifier(supplicant_network);
        security = g_supplicant_network_get_security(supplicant_network);
        group = g_supplicant_network_get_identifier(supplicant_network);
        wps = g_supplicant_network_get_wps(supplicant_network);
@@ -1744,19 +1951,18 @@ static void network_added(GSupplicantNetwork *supplicant_network)
        wps_ready = g_supplicant_network_is_wps_active(supplicant_network);
        wps_advertizing = g_supplicant_network_is_wps_advertizing(
                                                        supplicant_network);
-       mode = g_supplicant_network_get_mode(supplicant_network);
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        ssid = g_supplicant_network_get_ssid(supplicant_network, &ssid_len);
 
        network = connman_device_get_network(wifi->device, identifier);
 
-       if (network == NULL) {
+       if (!network) {
                network = connman_network_create(identifier,
                                                CONNMAN_NETWORK_TYPE_WIFI);
-               if (network == NULL)
+               if (!network)
                        return;
 
                connman_network_set_index(network, wifi->index);
@@ -1769,7 +1975,7 @@ static void network_added(GSupplicantNetwork *supplicant_network)
                wifi->networks = g_slist_prepend(wifi->networks, network);
        }
 
-       if (name != NULL && name[0] != '\0')
+       if (name && name[0] != '\0')
                connman_network_set_name(network, name);
 
        connman_network_set_blob(network, "WiFi.SSID",
@@ -1779,27 +1985,27 @@ static void network_added(GSupplicantNetwork *supplicant_network)
                                calculate_strength(supplicant_network));
        connman_network_set_bool(network, "WiFi.WPS", wps);
 
-       if (wps == TRUE) {
+       if (wps) {
                /* Is AP advertizing for WPS association?
                 * If so, we decide to use WPS by default */
-               if (wps_ready == TRUE && wps_pbc == TRUE &&
-                                               wps_advertizing == TRUE)
-                       connman_network_set_bool(network, "WiFi.UseWPS", TRUE);
+               if (wps_ready && wps_pbc &&
+                                               wps_advertizing)
+                       connman_network_set_bool(network, "WiFi.UseWPS", true);
        }
 
        connman_network_set_frequency(network,
                        g_supplicant_network_get_frequency(supplicant_network));
 
-       connman_network_set_available(network, TRUE);
+       connman_network_set_available(network, true);
        connman_network_set_string(network, "WiFi.Mode", mode);
 
-       if (ssid != NULL)
+       if (ssid)
                connman_network_set_group(network, group);
 
-       if (wifi->hidden != NULL && ssid != NULL) {
-               if (wifi->hidden->ssid_len == ssid_len &&
-                               memcmp(wifi->hidden->ssid, ssid,
-                                               ssid_len) == 0) {
+       if (wifi->hidden && ssid) {
+               if (!g_strcmp0(wifi->hidden->security, security) &&
+                               wifi->hidden->ssid_len == ssid_len &&
+                               !memcmp(wifi->hidden->ssid, ssid, ssid_len)) {
                        connman_network_connect_hidden(network,
                                        wifi->hidden->identity,
                                        wifi->hidden->passphrase,
@@ -1825,11 +2031,11 @@ static void network_removed(GSupplicantNetwork *network)
 
        DBG("name %s", name);
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        connman_network = connman_device_get_network(wifi->device, identifier);
-       if (connman_network == NULL)
+       if (!connman_network)
                return;
 
        wifi->networks = g_slist_remove(wifi->networks, connman_network);
@@ -1852,20 +2058,54 @@ static void network_changed(GSupplicantNetwork *network, const char *property)
 
        DBG("name %s", name);
 
-       if (wifi == NULL)
+       if (!wifi)
                return;
 
        connman_network = connman_device_get_network(wifi->device, identifier);
-       if (connman_network == NULL)
+       if (!connman_network)
                return;
 
-       if (g_str_equal(property, "Signal") == TRUE) {
+       if (g_str_equal(property, "Signal")) {
               connman_network_set_strength(connman_network,
                                        calculate_strength(network));
               connman_network_update(connman_network);
        }
 }
 
+static void peer_found(GSupplicantPeer *peer)
+{
+       struct connman_peer *connman_peer;
+       const char *identifier, *name;
+
+       identifier = g_supplicant_peer_get_identifier(peer);
+       name = g_supplicant_peer_get_name(peer);
+
+       DBG("ident: %s", identifier);
+
+       connman_peer = connman_peer_get(identifier);
+       if (connman_peer)
+               return;
+
+       connman_peer = connman_peer_create(identifier);
+       connman_peer_set_name(connman_peer, name);
+
+       connman_peer_register(connman_peer);
+}
+
+static void peer_lost(GSupplicantPeer *peer)
+{
+       struct connman_peer *connman_peer;
+       const char *identifier;
+
+       identifier = g_supplicant_peer_get_identifier(peer);
+
+       DBG("ident: %s", identifier);
+
+       connman_peer = connman_peer_get(identifier);
+       if (connman_peer)
+               connman_peer_unregister(connman_peer);
+}
+
 static void debug(const char *str)
 {
        if (getenv("CONNMAN_SUPPLICANT_DEBUG"))
@@ -1878,11 +2118,14 @@ static const GSupplicantCallbacks callbacks = {
        .interface_added        = interface_added,
        .interface_state        = interface_state,
        .interface_removed      = interface_removed,
+       .p2p_support            = p2p_support,
        .scan_started           = scan_started,
        .scan_finished          = scan_finished,
        .network_added          = network_added,
        .network_removed        = network_removed,
        .network_changed        = network_changed,
+       .peer_found             = peer_found,
+       .peer_lost              = peer_lost,
        .debug                  = debug,
 };
 
@@ -1911,7 +2154,7 @@ static GSupplicantSSID *ssid_ap_init(const char *ssid, const char *passphrase)
        GSupplicantSSID *ap;
 
        ap = g_try_malloc0(sizeof(GSupplicantSSID));
-       if (ap == NULL)
+       if (!ap)
                return NULL;
 
        ap->mode = G_SUPPLICANT_MODE_MASTER;
@@ -1920,7 +2163,7 @@ static GSupplicantSSID *ssid_ap_init(const char *ssid, const char *passphrase)
        ap->scan_ssid = 0;
        ap->freq = 2412;
 
-       if (passphrase == NULL || strlen(passphrase) == 0) {
+       if (!passphrase || strlen(passphrase) == 0) {
                ap->security = G_SUPPLICANT_SECURITY_NONE;
                ap->passphrase = NULL;
        } else {
@@ -1945,7 +2188,7 @@ static void ap_start_callback(int result, GSupplicantInterface *interface,
        if (result < 0) {
                connman_inet_remove_from_bridge(info->wifi->index,
                                                        info->wifi->bridge);
-               connman_technology_tethering_notify(info->technology, FALSE);
+               connman_technology_tethering_notify(info->technology, false);
        }
 
        g_free(info->ifname);
@@ -1964,9 +2207,10 @@ static void ap_create_callback(int result,
        if (result < 0) {
                connman_inet_remove_from_bridge(info->wifi->index,
                                                        info->wifi->bridge);
-               connman_technology_tethering_notify(info->technology, FALSE);
+               connman_technology_tethering_notify(info->technology, false);
 
                g_free(info->ifname);
+               g_free(info->ssid);
                g_free(info);
                return;
        }
@@ -1991,16 +2235,17 @@ static void sta_remove_callback(int result,
        DBG("ifname %s result %d ", info->ifname, result);
 
        if (result < 0) {
-               info->wifi->tethering = TRUE;
+               info->wifi->tethering = true;
 
                g_free(info->ifname);
+               g_free(info->ssid);
                g_free(info);
                return;
        }
 
        info->wifi->interface = NULL;
 
-       connman_technology_tethering_notify(info->technology, TRUE);
+       connman_technology_tethering_notify(info->technology, true);
 
        g_supplicant_interface_create(info->ifname, driver, info->wifi->bridge,
                                                ap_create_callback,
@@ -2009,7 +2254,7 @@ static void sta_remove_callback(int result,
 
 static int tech_set_tethering(struct connman_technology *technology,
                                const char *identifier, const char *passphrase,
-                               const char *bridge, connman_bool_t enabled)
+                               const char *bridge, bool enabled)
 {
        GList *list;
        GSupplicantInterface *interface;
@@ -2021,20 +2266,20 @@ static int tech_set_tethering(struct connman_technology *technology,
 
        DBG("");
 
-       if (enabled == FALSE) {
+       if (!enabled) {
                for (list = iface_list; list; list = list->next) {
                        wifi = list->data;
 
-                       if (wifi->tethering == TRUE) {
-                               wifi->tethering = FALSE;
+                       if (wifi->tethering) {
+                               wifi->tethering = false;
 
                                connman_inet_remove_from_bridge(wifi->index,
                                                                        bridge);
-                               wifi->bridged = FALSE;
+                               wifi->bridged = false;
                        }
                }
 
-               connman_technology_tethering_notify(technology, FALSE);
+               connman_technology_tethering_notify(technology, false);
 
                return 0;
        }
@@ -2044,7 +2289,7 @@ static int tech_set_tethering(struct connman_technology *technology,
 
                interface = wifi->interface;
 
-               if (interface == NULL)
+               if (!interface)
                        continue;
 
                ifname = g_supplicant_interface_get_ifname(wifi->interface);
@@ -2056,24 +2301,25 @@ static int tech_set_tethering(struct connman_technology *technology,
                }
 
                info = g_try_malloc0(sizeof(struct wifi_tethering_info));
-               if (info == NULL)
+               if (!info)
                        return -ENOMEM;
 
                info->wifi = wifi;
                info->technology = technology;
                info->wifi->bridge = bridge;
                info->ssid = ssid_ap_init(identifier, passphrase);
-               if (info->ssid == NULL) {
+               if (!info->ssid) {
                        g_free(info);
                        continue;
                }
                info->ifname = g_strdup(ifname);
-               if (info->ifname == NULL) {
+               if (!info->ifname) {
+                       g_free(info->ssid);
                        g_free(info);
                        continue;
                }
 
-               info->wifi->tethering = TRUE;
+               info->wifi->tethering = true;
 
                err = g_supplicant_interface_remove(interface,
                                                sta_remove_callback,
@@ -2089,7 +2335,7 @@ static void regdom_callback(int result, const char *alpha2, void *user_data)
 {
        DBG("");
 
-       if (wifi_technology == NULL)
+       if (!wifi_technology)
                return;
 
        if (result != 0)
index e77b8cc..0dd8b47 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -76,7 +76,7 @@ static void append(DBusMessageIter *dict, const char *key, const char *value)
 }
 
 
-static int ppp_have_secret()
+static int ppp_have_secret(void)
 {
        return 1;
 }
@@ -87,27 +87,27 @@ static int ppp_get_secret(char *username, char *password)
        const char *user, *pass;
        DBusError err;
 
-       if (username == NULL && password == NULL)
+       if (!username && !password)
                return -1;
 
-       if (password == NULL)
+       if (!password)
                return 1;
 
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        dbus_error_init(&err);
 
        msg = dbus_message_new_method_call(busname, path, interface, "getsec");
-       if (msg == NULL)
+       if (!msg)
                return -1;
 
        dbus_message_append_args(msg, DBUS_TYPE_INVALID, DBUS_TYPE_INVALID);
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                                msg, -1, &err);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&err) == TRUE)
+       if (!reply) {
+               if (dbus_error_is_set(&err))
                        dbus_error_free(&err);
 
                dbus_message_unref(msg);
@@ -118,17 +118,17 @@ static int ppp_get_secret(char *username, char *password)
 
        dbus_error_init(&err);
 
-       if (dbus_message_get_args(reply, &err, DBUS_TYPE_STRING, &user,
-                                               DBUS_TYPE_STRING, &pass,
-                                               DBUS_TYPE_INVALID) == FALSE) {
-               if (dbus_error_is_set(&err) == TRUE)
+       if (!dbus_message_get_args(reply, &err, DBUS_TYPE_STRING, &user,
+                                       DBUS_TYPE_STRING, &pass,
+                                       DBUS_TYPE_INVALID)) {
+               if (dbus_error_is_set(&err))
                        dbus_error_free(&err);
 
                dbus_message_unref(reply);
                return -1;
        }
 
-       if (username != NULL)
+       if (username)
                strcpy(username, user);
 
        strcpy(password, pass);
@@ -147,7 +147,7 @@ static void ppp_up(void *data, int arg)
        DBusMessageIter iter, dict;
        DBusMessage *msg;
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        if (ipcp_gotoptions[0].ouraddr == 0)
@@ -155,7 +155,7 @@ static void ppp_up(void *data, int arg)
 
        msg = dbus_message_new_method_call(busname, path,
                                                interface, "notify");
-       if (msg == NULL)
+       if (!msg)
                return;
 
        dbus_message_set_no_reply(msg, TRUE);
@@ -193,7 +193,7 @@ static void ppp_up(void *data, int arg)
                if (ipcp_gotoptions[0].dnsaddr[1]) {
                        inet_ntop(AF_INET, &ipcp_gotoptions[0].dnsaddr[1],
                                                        buf, INET_ADDRSTRLEN);
-                       if (add_blank == TRUE)
+                       if (add_blank)
                                strcat(dns, " ");
 
                        strcat(dns, buf);
@@ -214,22 +214,22 @@ static void ppp_up(void *data, int arg)
 
 static void ppp_exit(void *data, int arg)
 {
-       if (connection != NULL) {
+       if (connection) {
                dbus_connection_unref(connection);
                connection = NULL;
        }
 
-       if (busname != NULL) {
+       if (busname) {
                free(busname);
                busname = NULL;
        }
 
-       if (interface != NULL) {
+       if (interface) {
                free(interface);
                interface = NULL;
        }
 
-       if (path != NULL) {
+       if (path) {
                free(path);
                path = NULL;
        }
@@ -241,7 +241,7 @@ static void ppp_phase_change(void *data, int arg)
        DBusMessage *msg;
        int send_msg = 0;
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        if (prev_phase == PHASE_AUTHENTICATE &&
@@ -253,7 +253,7 @@ static void ppp_phase_change(void *data, int arg)
        if (send_msg > 0 || arg == PHASE_DEAD || arg == PHASE_DISCONNECT) {
                msg = dbus_message_new_method_call(busname, path,
                                                interface, "notify");
-               if (msg == NULL)
+               if (!msg)
                        return;
 
                dbus_message_set_no_reply(msg, TRUE);
@@ -282,21 +282,21 @@ int plugin_init(void)
        inter = getenv("CONNMAN_INTERFACE");
        p = getenv("CONNMAN_PATH");
 
-       if (bus == NULL || inter == NULL || p == NULL)
+       if (!bus || !inter || !p)
                return -1;
 
        busname = strdup(bus);
        interface = strdup(inter);
        path = strdup(p);
 
-       if (busname == NULL || interface == NULL || path == NULL) {
+       if (!busname || !interface || !path) {
                ppp_exit(NULL, 0);
                return -1;
        }
 
        connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
-       if (connection == NULL) {
-               if (dbus_error_is_set(&error) == TRUE)
+       if (!connection) {
+               if (dbus_error_is_set(&error))
                        dbus_error_free(&error);
 
                ppp_exit(NULL, 0);
index d6e42eb..5e04144 100644 (file)
@@ -101,8 +101,8 @@ int main(int argc, char *argv[])
        dbus_error_init(&error);
 
        conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
-       if (conn == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!conn) {
+               if (dbus_error_is_set(&error)) {
                        print("%s", error.message);
                        dbus_error_free(&error);
                } else
@@ -113,7 +113,7 @@ int main(int argc, char *argv[])
 
        msg = dbus_message_new_method_call(busname, path,
                                                interface, "notify");
-       if (msg == NULL) {
+       if (!msg) {
                dbus_connection_unref(conn);
                print("Failed to allocate method call");
                goto out;
@@ -137,7 +137,7 @@ int main(int argc, char *argv[])
 
        dbus_message_iter_close_container(&iter, &dict);
 
-       if (dbus_connection_send(conn, msg, NULL) == FALSE) {
+       if (!dbus_connection_send(conn, msg, NULL)) {
                print("Failed to send message");
                goto out;
        }
index f37eab2..e703c86 100644 (file)
@@ -90,8 +90,8 @@ int main(int argc, char *argv[])
        dbus_error_init(&error);
 
        conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
-       if (conn == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!conn) {
+               if (dbus_error_is_set(&error)) {
                        print("%s", error.message);
                        dbus_error_free(&error);
                } else
@@ -102,7 +102,7 @@ int main(int argc, char *argv[])
 
        msg = dbus_message_new_method_call(busname, path,
                                                interface, "notify");
-       if (msg == NULL) {
+       if (!msg) {
                dbus_connection_unref(conn);
                print("Failed to allocate method call");
                goto out;
@@ -126,7 +126,7 @@ int main(int argc, char *argv[])
 
        dbus_message_iter_close_container(&iter, &dict);
 
-       if (dbus_connection_send(conn, msg, NULL) == FALSE) {
+       if (!dbus_connection_send(conn, msg, NULL)) {
                print("Failed to send message");
                goto out;
        }
index 340b69e..0e3a7a1 100644 (file)
@@ -77,21 +77,23 @@ static int tunnel_create(struct in_addr *addr)
        p.iph.protocol = IPPROTO_IPV6;
        p.iph.saddr = addr->s_addr;
        p.iph.ttl = 64;
-       strncpy(p.name, "tun6to4", IFNAMSIZ);
+       strncpy(p.name, "tun6to4", sizeof(p.name) - 1);
 
-       strncpy(ifr.ifr_name, "sit0", IFNAMSIZ);
+       strncpy(ifr.ifr_name, "sit0", sizeof(ifr.ifr_name) - 1);
        ifr.ifr_ifru.ifru_data = (void *)&p;
        fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+       if (fd < 0)
+               return -errno;
        ret = ioctl(fd, SIOCADDTUNNEL, &ifr);
        if (ret)
                connman_error("add tunnel %s failed: %s", ifr.ifr_name,
                                                        strerror(errno));
        close(fd);
 
-       return ret;
+       return -ret;
 }
 
-static void tunnel_destroy()
+static void tunnel_destroy(void)
 {
        struct ip_tunnel_parm p;
        struct ifreq ifr;
@@ -109,9 +111,9 @@ static void tunnel_destroy()
        p.iph.version = 4;
        p.iph.ihl = 5;
        p.iph.protocol = IPPROTO_IPV6;
-       strncpy(p.name, "tun6to4", IFNAMSIZ);
+       strncpy(p.name, "tun6to4", sizeof(p.name) - 1);
 
-       strncpy(ifr.ifr_name, "tun6to4", IFNAMSIZ);
+       strncpy(ifr.ifr_name, "tun6to4", sizeof(ifr.ifr_name) - 1);
        ifr.ifr_ifru.ifru_data = (void *)&p;
        fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (fd < 0) {
@@ -133,7 +135,7 @@ static void tunnel_destroy()
        tunnel_ip_address = NULL;
 }
 
-static int tunnel_add_route()
+static int tunnel_add_route(void)
 {
        struct __connman_inet_rtnl_handle rth;
        struct in6_addr addr6;
@@ -231,12 +233,12 @@ static gboolean unref_web(gpointer user_data)
        return FALSE;
 }
 
-static gboolean web_result(GWebResult *result, gpointer user_data)
+static bool web_result(GWebResult *result, gpointer user_data)
 {
        guint16 status;
 
        if (web_request_id == 0)
-               return FALSE;
+               return false;
 
        status = g_web_result_get_status(result);
 
@@ -251,7 +253,7 @@ static gboolean web_result(GWebResult *result, gpointer user_data)
 
        g_timeout_add_seconds(1, unref_web, NULL);
 
-       return FALSE;
+       return false;
 }
 
 static void web_debug(const char *str, void *data)
@@ -303,7 +305,7 @@ static void tun_newlink(unsigned flags, unsigned change, void *user_data)
                }
 
                web = g_web_new(index);
-               if (web == NULL) {
+               if (!web) {
                        tunnel_destroy();
                        return;
                }
@@ -384,7 +386,7 @@ static void receive_rs_reply(struct nd_router_advert *reply,
        /* We try to create tunnel if autoconfiguration did not work i.e.,
         * we did not receive any reply to router solicitation message.
         */
-       if (reply == NULL && inet_aton(address, &ip4addr) != 0)
+       if (!reply && inet_aton(address, &ip4addr) != 0)
                init_6to4(&ip4addr);
 
        g_free(address);
@@ -406,15 +408,15 @@ int __connman_6to4_probe(struct connman_service *service)
        if (tunnel_created || tunnel_pending)
                return 0;
 
-       if (service == NULL)
+       if (!service)
                return -1;
 
        ip4config = __connman_service_get_ip4config(service);
-       if (ip4config == NULL)
+       if (!ip4config)
                return -1;
 
        ip6config = __connman_service_get_ip6config(service);
-       if (ip6config == NULL)
+       if (!ip6config)
                return -1;
 
        method = __connman_ipconfig_get_method(ip6config);
@@ -422,7 +424,7 @@ int __connman_6to4_probe(struct connman_service *service)
                return -1;
 
        address = __connman_ipconfig_get_local(ip4config);
-       if (address == NULL)
+       if (!address)
                return -1;
 
        if (inet_aton(address, &ip4addr) == 0)
@@ -455,11 +457,11 @@ void __connman_6to4_remove(struct connman_ipconfig *ip4config)
 
        DBG("tunnel ip address %s", tunnel_ip_address);
 
-       if (ip4config == NULL)
+       if (!ip4config)
                return;
 
        address = __connman_ipconfig_get_local(ip4config);
-       if (address == NULL)
+       if (!address)
                return;
 
        if (g_strcmp0(address, tunnel_ip_address) != 0)
@@ -473,14 +475,14 @@ int __connman_6to4_check(struct connman_ipconfig *ip4config)
 {
        const char *address;
 
-       if (ip4config == NULL || tunnel_created == 0 ||
+       if (!ip4config || tunnel_created == 0 ||
                                        tunnel_pending == 1)
                return -1;
 
        DBG("tunnel ip address %s", tunnel_ip_address);
 
        address = __connman_ipconfig_get_local(ip4config);
-       if (address == NULL)
+       if (!address)
                return -1;
 
        if (g_strcmp0(address, tunnel_ip_address) == 0)
index 9ccba72..ab538f3 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -34,7 +34,7 @@
 
 #include "connman.h"
 
-static connman_bool_t check_reply_has_dict(DBusMessage *reply)
+static bool check_reply_has_dict(DBusMessage *reply)
 {
        const char *signature = DBUS_TYPE_ARRAY_AS_STRING
                DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
@@ -42,8 +42,8 @@ static connman_bool_t check_reply_has_dict(DBusMessage *reply)
                DBUS_TYPE_VARIANT_AS_STRING
                DBUS_DICT_ENTRY_END_CHAR_AS_STRING;
 
-       if (dbus_message_has_signature(reply, signature) == TRUE)
-               return TRUE;
+       if (dbus_message_has_signature(reply, signature))
+               return true;
 
        connman_warn("Reply %s to %s from %s has wrong signature %s",
                        signature,
@@ -51,7 +51,7 @@ static connman_bool_t check_reply_has_dict(DBusMessage *reply)
                        dbus_message_get_sender(reply),
                        dbus_message_get_signature(reply));
 
-       return FALSE;
+       return false;
 }
 
 struct request_input_reply {
@@ -63,8 +63,8 @@ struct request_input_reply {
 static void request_input_passphrase_reply(DBusMessage *reply, void *user_data)
 {
        struct request_input_reply *passphrase_reply = user_data;
-       connman_bool_t values_received = FALSE;
-       connman_bool_t wps = FALSE;
+       bool values_received = false;
+       bool wps = false;
        const char *error = NULL;
        char *identity = NULL;
        char *passphrase = NULL;
@@ -74,15 +74,18 @@ static void request_input_passphrase_reply(DBusMessage *reply, void *user_data)
        int name_len = 0;
        DBusMessageIter iter, dict;
 
+       if (!reply)
+               goto out;
+
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                error = dbus_message_get_error_name(reply);
                goto done;
        }
 
-       if (check_reply_has_dict(reply) == FALSE)
+       if (!check_reply_has_dict(reply))
                goto done;
 
-       values_received = TRUE;
+       values_received = true;
 
        dbus_message_iter_init(reply, &iter);
        dbus_message_iter_recurse(&iter, &dict);
@@ -105,13 +108,14 @@ static void request_input_passphrase_reply(DBusMessage *reply, void *user_data)
 
                } else if (g_str_equal(key, "Passphrase")) {
                        dbus_message_iter_next(&entry);
-                       if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT)
+                       if (dbus_message_iter_get_arg_type(&entry)
+                                                       != DBUS_TYPE_VARIANT)
                                break;
                        dbus_message_iter_recurse(&entry, &value);
                        dbus_message_iter_get_basic(&value, &passphrase);
 
                } else if (g_str_equal(key, "WPS")) {
-                       wps = TRUE;
+                       wps = true;
 
                        dbus_message_iter_next(&entry);
                        if (dbus_message_iter_get_arg_type(&entry)
@@ -152,6 +156,8 @@ done:
                                identity, passphrase,
                                wps, wpspin, error,
                                passphrase_reply->user_data);
+
+out:
        g_free(passphrase_reply);
 }
 
@@ -161,14 +167,14 @@ static void request_input_append_alternates(DBusMessageIter *iter,
        const char *str = user_data;
        char **alternates, **alternative;
 
-       if (str == NULL)
+       if (!str)
                return;
 
        alternates = g_strsplit(str, ",", 0);
-       if (alternates == NULL)
+       if (!alternates)
                return;
 
-       for (alternative = alternates; *alternative != NULL; alternative++)
+       for (alternative = alternates; *alternative; alternative++)
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                                                alternative);
 
@@ -204,9 +210,9 @@ static void request_input_append_passphrase(DBusMessageIter *iter,
        case CONNMAN_SERVICE_SECURITY_8021X:
                phase2 = __connman_service_get_phase2(service);
 
-               if (phase2 != NULL && (
-                               g_str_has_suffix(phase2, "GTC") == TRUE ||
-                               g_str_has_suffix(phase2, "OTP") == TRUE))
+               if (phase2 && (
+                               g_str_has_suffix(phase2, "GTC") ||
+                               g_str_has_suffix(phase2, "OTP")))
                        value = "response";
                else
                        value = "passphrase";
@@ -222,7 +228,7 @@ static void request_input_append_passphrase(DBusMessageIter *iter,
        connman_dbus_dict_append_basic(iter, "Requirement",
                                DBUS_TYPE_STRING, &value);
 
-       if (__connman_service_wps_enabled(service) == TRUE) {
+       if (__connman_service_wps_enabled(service)) {
                connman_dbus_dict_append_array(iter, "Alternates",
                                        DBUS_TYPE_STRING,
                                        request_input_append_alternates,
@@ -310,12 +316,12 @@ static void previous_passphrase_handler(DBusMessageIter *iter,
        network = __connman_service_get_network(service);
        data.passphrase = connman_network_get_string(network, "WiFi.PinWPS");
 
-       if (connman_network_get_bool(network, "WiFi.UseWPS") == TRUE &&
-                                               data.passphrase != NULL) {
+       if (connman_network_get_bool(network, "WiFi.UseWPS") &&
+                                               data.passphrase) {
                data.type = "wpspin";
        } else {
                data.passphrase = __connman_service_get_passphrase(service);
-               if (data.passphrase == NULL)
+               if (!data.passphrase)
                        return;
 
                security = __connman_service_get_security(service);
@@ -342,21 +348,24 @@ static void request_input_login_reply(DBusMessage *reply, void *user_data)
 {
        struct request_input_reply *username_password_reply = user_data;
        const char *error = NULL;
-       connman_bool_t values_received = FALSE;
+       bool values_received = false;
        char *username = NULL;
        char *password = NULL;
        char *key;
        DBusMessageIter iter, dict;
 
+       if (!reply)
+               goto out;
+
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                error = dbus_message_get_error_name(reply);
                goto done;
        }
 
-       if (check_reply_has_dict(reply) == FALSE)
+       if (!check_reply_has_dict(reply))
                goto done;
 
-       values_received = TRUE;
+       values_received = true;
 
        dbus_message_iter_init(reply, &iter);
        dbus_message_iter_recurse(&iter, &dict);
@@ -395,11 +404,14 @@ done:
                                        username, password,
                                        FALSE, NULL, error,
                                        username_password_reply->user_data);
+
+out:
        g_free(username_password_reply);
 }
 
 int __connman_agent_request_passphrase_input(struct connman_service *service,
-                               authentication_cb_t callback, void *user_data)
+                               authentication_cb_t callback,
+                               const char *dbus_sender, void *user_data)
 {
        DBusMessage *message;
        const char *path, *agent_sender, *agent_path;
@@ -407,16 +419,20 @@ int __connman_agent_request_passphrase_input(struct connman_service *service,
        DBusMessageIter dict;
        struct request_input_reply *passphrase_reply;
        int err;
+       void *agent;
 
-       connman_agent_get_info(&agent_sender, &agent_path);
+       agent = connman_agent_get_info(dbus_sender, &agent_sender,
+                                                       &agent_path);
 
-       if (service == NULL || agent_path == NULL || callback == NULL)
+       DBG("agent %p service %p path %s", agent, service, agent_path);
+
+       if (!service || !agent || !agent_path || !callback)
                return -ESRCH;
 
        message = dbus_message_new_method_call(agent_sender, agent_path,
                                        CONNMAN_AGENT_INTERFACE,
                                        "RequestInput");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -443,20 +459,19 @@ int __connman_agent_request_passphrase_input(struct connman_service *service,
        if (__connman_service_get_security(service) !=
                        CONNMAN_SERVICE_SECURITY_NONE) {
                connman_dbus_dict_append_dict(&dict, "Passphrase",
-                                       request_input_append_passphrase, service);
+                               request_input_append_passphrase, service);
 
                previous_passphrase_handler(&dict, service);
        }
 
-       if (__connman_service_wps_enabled(service) == TRUE) {
-           connman_dbus_dict_append_dict(&dict, "WPS",
+       if (__connman_service_wps_enabled(service))
+               connman_dbus_dict_append_dict(&dict, "WPS",
                                request_input_append_wps, NULL);
-       }
 
        connman_dbus_dict_close(&iter, &dict);
 
        passphrase_reply = g_try_new0(struct request_input_reply, 1);
-       if (passphrase_reply == NULL) {
+       if (!passphrase_reply) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -468,7 +483,7 @@ int __connman_agent_request_passphrase_input(struct connman_service *service,
        err = connman_agent_queue_message(service, message,
                        connman_timeout_input_request(),
                        request_input_passphrase_reply,
-                       passphrase_reply);
+                       passphrase_reply, agent);
 
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending agent message", err);
@@ -491,16 +506,17 @@ int __connman_agent_request_login_input(struct connman_service *service,
        DBusMessageIter dict;
        struct request_input_reply *username_password_reply;
        int err;
+       void *agent;
 
-       connman_agent_get_info(&agent_sender, &agent_path);
+       agent = connman_agent_get_info(NULL, &agent_sender, &agent_path);
 
-       if (service == NULL || agent_path == NULL || callback == NULL)
+       if (!service || !agent || !agent_path || !callback)
                return -ESRCH;
 
        message = dbus_message_new_method_call(agent_sender, agent_path,
                                        CONNMAN_AGENT_INTERFACE,
                                        "RequestInput");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -520,7 +536,7 @@ int __connman_agent_request_login_input(struct connman_service *service,
        connman_dbus_dict_close(&iter, &dict);
 
        username_password_reply = g_try_new0(struct request_input_reply, 1);
-       if (username_password_reply == NULL) {
+       if (!username_password_reply) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -531,7 +547,8 @@ int __connman_agent_request_login_input(struct connman_service *service,
 
        err = connman_agent_queue_message(service, message,
                        connman_timeout_input_request(),
-                       request_input_login_reply, username_password_reply);
+                       request_input_login_reply, username_password_reply,
+                       agent);
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending agent request", err);
                dbus_message_unref(message);
@@ -553,7 +570,7 @@ struct request_browser_reply_data {
 static void request_browser_reply(DBusMessage *reply, void *user_data)
 {
        struct request_browser_reply_data *browser_reply_data = user_data;
-       connman_bool_t result = FALSE;
+       bool result = false;
        const char *error = NULL;
 
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
@@ -561,7 +578,7 @@ static void request_browser_reply(DBusMessage *reply, void *user_data)
                goto done;
        }
 
-       result = TRUE;
+       result = true;
 
 done:
        browser_reply_data->callback(browser_reply_data->service, result,
@@ -578,19 +595,20 @@ int __connman_agent_request_browser(struct connman_service *service,
        DBusMessageIter iter;
        const char *path, *agent_sender, *agent_path;
        int err;
+       void *agent;
 
-       connman_agent_get_info(&agent_sender, &agent_path);
+       agent = connman_agent_get_info(NULL, &agent_sender, &agent_path);
 
-       if (service == NULL || agent_path == NULL || callback == NULL)
+       if (!service || !agent || !agent_path || !callback)
                return -ESRCH;
 
-       if (url == NULL)
+       if (!url)
                url = "";
 
        message = dbus_message_new_method_call(agent_sender, agent_path,
                                        CONNMAN_AGENT_INTERFACE,
                                        "RequestBrowser");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -601,7 +619,7 @@ int __connman_agent_request_browser(struct connman_service *service,
        dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &url);
 
        browser_reply_data = g_try_new0(struct request_browser_reply_data, 1);
-       if (browser_reply_data == NULL) {
+       if (!browser_reply_data) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -612,7 +630,8 @@ int __connman_agent_request_browser(struct connman_service *service,
 
        err = connman_agent_queue_message(service, message,
                                connman_timeout_browser_launch(),
-                               request_browser_reply, browser_reply_data);
+                               request_browser_reply, browser_reply_data,
+                               agent);
 
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending browser request", err);
index 5c3bd28..37cf524 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
 
 #include "connman.h"
 
+#define agent_ref(agent) \
+       agent_ref_debug(agent, __FILE__, __LINE__, __func__)
+#define agent_unref(agent) \
+       agent_unref_debug(agent, __FILE__, __LINE__, __func__)
+
 static DBusConnection *connection = NULL;
-static guint agent_watch = 0;
-static gchar *agent_path = NULL;
-static gchar *agent_sender = NULL;
+static GHashTable *agent_hash = NULL;
+static struct connman_agent *default_agent = NULL;
 
 struct connman_agent {
+       int refcount;
+       char *owner;
+       char *path;
+       struct connman_agent_request *pending;
+       GList *queue;   /* queued requests for this agent */
+       guint watch;
+};
+
+struct connman_agent_request {
        void *user_context;
        void *user_data;
        DBusMessage *msg;
@@ -48,119 +61,150 @@ struct connman_agent {
        struct connman_agent_driver *driver;
 };
 
-static GList *agent_queue = NULL;
-static struct connman_agent *agent_request = NULL;
 static GSList *driver_list = NULL;
 
-void connman_agent_get_info(const char **sender, const char **path)
+void *connman_agent_get_info(const char *dbus_sender, const char **sender,
+                                                       const char **path)
 {
-       *sender = agent_sender;
-       *path = agent_path;
+       struct connman_agent *agent;
+
+       if (!dbus_sender)
+               agent = default_agent;
+       else {
+               agent = g_hash_table_lookup(agent_hash, dbus_sender);
+               if (!agent)
+                       agent = default_agent;
+       }
+
+       if (agent) {
+               if (sender)
+                       *sender = agent->owner;
+               if (path)
+                       *path = agent->path;
+       } else {
+               if (sender)
+                       *sender = NULL;
+               if (path)
+                       *path = NULL;
+       }
+
+       return agent;
 }
 
-static void agent_data_free(struct connman_agent *data)
+static void agent_request_free(struct connman_agent_request *request)
 {
-       if (data == NULL)
+       if (!request)
                return;
-       if (data->user_context != NULL) {
-               if (data->driver != NULL && data->driver->context_unref != NULL)
-                       data->driver->context_unref(data->user_context);
+
+       if (request->user_context) {
+               if (request->driver && request->driver->context_unref)
+                       request->driver->context_unref(request->user_context);
+       }
+
+       if (request->msg)
+               dbus_message_unref(request->msg);
+
+       if (request->call) {
+               dbus_pending_call_cancel(request->call);
+               dbus_pending_call_unref(request->call);
        }
-       if (data->msg != NULL)
-               dbus_message_unref(data->msg);
-       if (data->call != NULL)
-               dbus_pending_call_cancel(data->call);
 
-       g_free(data);
+       g_free(request);
+}
+
+static void agent_finalize_pending(struct connman_agent *agent,
+                               DBusMessage *reply)
+{
+       struct connman_agent_request *pending = agent->pending;
+       if (pending) {
+               agent->pending = NULL;
+               pending->callback(reply, pending->user_data);
+               agent_request_free(pending);
+       }
 }
 
 static void agent_receive_message(DBusPendingCall *call, void *user_data);
 
-static int agent_send_next_request(void)
+static int agent_send_next_request(struct connman_agent *agent)
 {
-       if (agent_request != NULL)
+       if (agent->pending)
                return -EBUSY;
 
-       if (agent_queue == NULL)
+       if (!agent->queue)
                return 0;
 
-       agent_request = agent_queue->data;
-       agent_queue = g_list_remove(agent_queue, agent_request);
+       agent->pending = agent->queue->data;
+       agent->queue = g_list_remove(agent->queue, agent->pending);
+
+       if (!agent->pending->msg)
+               goto fail;
 
-       if (dbus_connection_send_with_reply(connection, agent_request->msg,
-                                       &agent_request->call,
-                                       agent_request->timeout) == FALSE)
+       if (!dbus_connection_send_with_reply(connection, agent->pending->msg,
+                                               &agent->pending->call,
+                                               agent->pending->timeout))
                goto fail;
 
-       if (agent_request->call == NULL)
+       if (!agent->pending->call)
                goto fail;
 
-       if (dbus_pending_call_set_notify(agent_request->call,
-                       agent_receive_message, agent_request, NULL) == FALSE)
+       if (!dbus_pending_call_set_notify(agent->pending->call,
+                                               agent_receive_message,
+                                               agent, NULL))
                goto fail;
 
-       dbus_message_unref(agent_request->msg);
-       agent_request->msg = NULL;
+       dbus_message_unref(agent->pending->msg);
+       agent->pending->msg = NULL;
        return 0;
 
 fail:
-       agent_data_free(agent_request);
-       agent_request = NULL;
+       agent_finalize_pending(agent, NULL);
        return -ESRCH;
 }
 
-static int agent_send_cancel(struct connman_agent *agent)
+static int send_cancel_request(struct connman_agent *agent,
+                       struct connman_agent_request *request)
 {
        DBusMessage *message;
 
-       if (agent_sender == NULL || agent == NULL || agent->driver == NULL)
-               return 0;
+       DBG("send cancel req to %s %s", agent->owner, agent->path);
 
-       message = dbus_message_new_method_call(agent_sender, agent_path,
-                       agent->driver->interface, "Cancel");
-       if (message != NULL) {
-               dbus_message_set_no_reply(message, TRUE);
-               g_dbus_send_message(connection, message);
-               return 0;
+       message = dbus_message_new_method_call(agent->owner,
+                                       agent->path,
+                                       request->driver->interface,
+                                       "Cancel");
+       if (!message) {
+               connman_error("Couldn't allocate D-Bus message");
+               return -ENOMEM;
        }
 
-       connman_warn("Failed to send Cancel message to agent");
-       return -ESRCH;
+       g_dbus_send_message(connection, message);
+       return 0;
 }
 
 static void agent_receive_message(DBusPendingCall *call, void *user_data)
 {
-       struct connman_agent *queue_data = user_data;
+       struct connman_agent *agent = user_data;
        DBusMessage *reply;
        int err;
 
-       DBG("waiting for %p received %p", agent_request, queue_data);
-
-       if (agent_request != queue_data) {
-               connman_error("Agent callback expected %p got %p",
-                               agent_request, queue_data);
-               return;
-       }
+       DBG("agent %p req %p", agent, agent->pending);
 
        reply = dbus_pending_call_steal_reply(call);
        dbus_pending_call_unref(call);
-       queue_data->call = NULL;
+       agent->pending->call = NULL;
 
        if (dbus_message_is_error(reply,
-                       "org.freedesktop.DBus.Error.Timeout") == TRUE ||
+                       "org.freedesktop.DBus.Error.Timeout") ||
                        dbus_message_is_error(reply,
-                       "org.freedesktop.DBus.Error.TimedOut") == TRUE) {
-               agent_send_cancel(queue_data->user_context);
+                       "org.freedesktop.DBus.Error.TimedOut")) {
+               send_cancel_request(agent, agent->pending);
        }
 
-       queue_data->callback(reply, queue_data->user_data);
+       agent_finalize_pending(agent, reply);
        dbus_message_unref(reply);
 
-       agent_data_free(queue_data);
-       agent_request = NULL;
-
-       err = agent_send_next_request();
-       if (err < 0)
+       err = agent_send_next_request(agent);
+       if (err < 0 && err != -EBUSY)
                DBG("send next request failed (%s/%d)", strerror(-err), -err);
 }
 
@@ -171,23 +215,25 @@ static struct connman_agent_driver *get_driver(void)
 
 int connman_agent_queue_message(void *user_context,
                                DBusMessage *msg, int timeout,
-                               agent_queue_cb callback, void *user_data)
+                               agent_queue_cb callback, void *user_data,
+                               void *agent_data)
 {
-       struct connman_agent *queue_data;
+       struct connman_agent_request *queue_data;
        struct connman_agent_driver *driver;
+       struct connman_agent *agent = agent_data;
        int err;
 
-       if (user_context == NULL || callback == NULL)
+       if (!user_context || !callback)
                return -EBADMSG;
 
-       queue_data = g_new0(struct connman_agent, 1);
-       if (queue_data == NULL)
+       queue_data = g_new0(struct connman_agent_request, 1);
+       if (!queue_data)
                return -ENOMEM;
 
        driver = get_driver();
        DBG("driver %p", driver);
 
-       if (driver != NULL && driver->context_ref != NULL) {
+       if (driver && driver->context_ref) {
                queue_data->user_context = driver->context_ref(user_context);
                queue_data->driver = driver;
        } else
@@ -197,103 +243,97 @@ int connman_agent_queue_message(void *user_context,
        queue_data->timeout = timeout;
        queue_data->callback = callback;
        queue_data->user_data = user_data;
-       agent_queue = g_list_append(agent_queue, queue_data);
+       agent->queue = g_list_append(agent->queue, queue_data);
 
-       err = agent_send_next_request();
-       if (err < 0)
+       err = agent_send_next_request(agent);
+       if (err < 0 && err != -EBUSY)
                DBG("send next request failed (%s/%d)", strerror(-err), -err);
 
        return err;
 }
 
-void connman_agent_cancel(void *user_context)
+static void set_default_agent(void)
 {
-       GList *item, *next;
-       struct connman_agent *queued_req;
-       int err;
-
-       DBG("context %p", user_context);
-
-       item = agent_queue;
-
-       while (item != NULL) {
-               next = g_list_next(item);
-               queued_req = item->data;
-
-               if (queued_req->user_context == user_context ||
-                                                       user_context == NULL) {
-                       agent_data_free(queued_req);
-                       agent_queue = g_list_delete_link(agent_queue, item);
-               }
-
-               item = next;
-       }
+       struct connman_agent *agent = NULL;
+       GHashTableIter iter;
+       gpointer key, value;
 
-       if (agent_request == NULL)
+       if (default_agent)
                return;
 
-       if (agent_request->user_context != user_context &&
-                                               user_context != NULL)
-               return;
-
-       agent_send_cancel(agent_request);
+       g_hash_table_iter_init(&iter, agent_hash);
+       if (g_hash_table_iter_next(&iter, &key, &value))
+               agent = value;
 
-       agent_data_free(agent_request);
-       agent_request = NULL;
+       if (agent)
+               DBG("default agent set to %s %s", agent->owner, agent->path);
+       else
+               DBG("default agent cleared");
 
-       err = agent_send_next_request();
-       if (err < 0)
-               DBG("send next request failed (%s/%d)", strerror(-err), -err);
+       default_agent = agent;
 }
 
-static void agent_free(void)
+static void agent_disconnect(DBusConnection *conn, void *user_data)
 {
-       if (agent_watch > 0)
-               g_dbus_remove_watch(connection, agent_watch);
+       struct connman_agent *agent = user_data;
 
-       agent_watch = 0;
+       DBG("agent %s disconnected", agent->owner);
 
-       g_free(agent_sender);
-       agent_sender = NULL;
-
-       g_free(agent_path);
-       agent_path = NULL;
+       if (agent->watch > 0) {
+               g_dbus_remove_watch(conn, agent->watch);
+               agent->watch = 0;
+       }
 
-       connman_agent_cancel(NULL);
+       g_hash_table_remove(agent_hash, agent->owner);
 }
 
-static void agent_disconnect(DBusConnection *conn, void *data)
+static struct connman_agent *agent_ref_debug(struct connman_agent *agent,
+                               const char *file, int line, const char *caller)
 {
-       DBG("data %p", data);
-       agent_free();
+       DBG("%p ref %d by %s:%d:%s()", agent, agent->refcount + 1,
+               file, line, caller);
+
+       __sync_fetch_and_add(&agent->refcount, 1);
+
+       return agent;
 }
 
-int connman_agent_register(const char *sender, const char *path)
+static struct connman_agent *agent_create(const char *name, const char *path)
 {
-       DBG("sender %s path %s", sender, path);
-       if (agent_path != NULL)
-               return -EEXIST;
+       struct connman_agent *agent;
 
-       agent_sender = g_strdup(sender);
-       agent_path = g_strdup(path);
+       agent = g_new0(struct connman_agent, 1);
 
-       agent_watch = g_dbus_add_disconnect_watch(connection, sender,
-                                               agent_disconnect, NULL, NULL);
+       agent->owner = g_strdup(name);
+       agent->path = g_strdup(path);
 
-       return 0;
+       agent->watch = g_dbus_add_disconnect_watch(connection,
+                                                       name, agent_disconnect,
+                                                       agent, NULL);
+
+       return agent_ref(agent);
 }
 
-int connman_agent_unregister(const char *sender, const char *path)
+int connman_agent_register(const char *sender, const char *path)
 {
+       struct connman_agent *agent;
+
        DBG("sender %s path %s", sender, path);
 
-       if (agent_path == NULL)
-               return -ESRCH;
+       agent = g_hash_table_lookup(agent_hash, sender);
+       if (agent)
+               return -EEXIST;
+
+       agent = agent_create(sender, path);
+       if (!agent)
+               return -EINVAL;
 
-       if (agent_watch > 0)
-               g_dbus_remove_watch(connection, agent_watch);
+       DBG("agent %s", agent->owner);
 
-       agent_free();
+       g_hash_table_replace(agent_hash, agent->owner, agent);
+
+       if (!default_agent)
+               set_default_agent();
 
        return 0;
 }
@@ -307,15 +347,15 @@ struct report_error_data {
 static void report_error_reply(DBusMessage *reply, void *user_data)
 {
        struct report_error_data *report_error = user_data;
-       gboolean retry = FALSE;
+       bool retry = false;
        const char *dbus_err;
 
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                dbus_err = dbus_message_get_error_name(reply);
-               if (dbus_err != NULL &&
+               if (dbus_err &&
                        strcmp(dbus_err,
                                CONNMAN_AGENT_INTERFACE ".Error.Retry") == 0)
-                       retry = TRUE;
+                       retry = true;
        }
 
        report_error->callback(report_error->user_context, retry,
@@ -325,21 +365,27 @@ static void report_error_reply(DBusMessage *reply, void *user_data)
 
 int connman_agent_report_error(void *user_context, const char *path,
                                const char *error,
-                               report_error_cb_t callback, void *user_data)
+                               report_error_cb_t callback,
+                               const char *dbus_sender, void *user_data)
 {
        DBusMessage *message;
        DBusMessageIter iter;
        struct report_error_data *report_error;
+       struct connman_agent *agent;
        int err;
 
-       if (user_context == NULL || agent_path == NULL || error == NULL ||
-                                                       callback == NULL)
+       agent = connman_agent_get_info(dbus_sender, NULL, NULL);
+
+       DBG("agent %p sender %s context %p path %s", agent,
+               dbus_sender, user_context, agent ? agent->path : "-");
+
+       if (!user_context || !agent || !agent->path || !error || !callback)
                return -ESRCH;
 
-       message = dbus_message_new_method_call(agent_sender, agent_path,
+       message = dbus_message_new_method_call(agent->owner, agent->path,
                                        CONNMAN_AGENT_INTERFACE,
                                        "ReportError");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -350,7 +396,7 @@ int connman_agent_report_error(void *user_context, const char *path,
                                DBUS_TYPE_STRING, &error);
 
        report_error = g_try_new0(struct report_error_data, 1);
-       if (report_error == NULL) {
+       if (!report_error) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -361,7 +407,8 @@ int connman_agent_report_error(void *user_context, const char *path,
 
        err = connman_agent_queue_message(user_context, message,
                                        connman_timeout_input_request(),
-                                       report_error_reply, report_error);
+                                       report_error_reply, report_error,
+                                       agent);
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending error request", err);
                g_free(report_error);
@@ -400,6 +447,143 @@ int connman_agent_driver_register(struct connman_agent_driver *driver)
        return 0;
 }
 
+static void release_driver(void)
+{
+       connman_agent_driver_unregister(get_driver());
+}
+
+static void cancel_all_requests(struct connman_agent *agent)
+{
+       GList *list;
+
+       DBG("request %p pending %p", agent->pending, agent->queue);
+
+       if (agent->pending) {
+               if (agent->pending->call)
+                       send_cancel_request(agent, agent->pending);
+
+               agent_finalize_pending(agent, NULL);
+       }
+
+       for (list = agent->queue; list; list = list->next) {
+               struct connman_agent_request *request = list->data;
+
+               if (!request)
+                       continue;
+
+               request->callback(NULL, request->user_data);
+               agent_request_free(request);
+       }
+
+       g_list_free(agent->queue);
+       agent->queue = NULL;
+}
+
+void connman_agent_cancel(void *user_context)
+{
+       GHashTableIter iter;
+       gpointer key, value;
+       int err;
+
+       DBG("context %p", user_context);
+
+       g_hash_table_iter_init(&iter, agent_hash);
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               GList *list;
+               struct connman_agent *agent = value;
+
+               /*
+                * Cancel all the pending requests to a given agent and service
+                */
+               list = agent->queue;
+               while (list) {
+                       struct connman_agent_request *request = list->data;
+
+                       if (request && request->user_context &&
+                                               request->user_context ==
+                                                               user_context) {
+                               DBG("cancel pending %p", request);
+
+                               request->callback(NULL, request->user_data);
+
+                               agent_request_free(request);
+
+                               agent->queue = list->next;
+                               list = g_list_delete_link(list, list);
+                       } else
+                               list = list->next;
+               }
+
+               /*
+                * If there is a request from client to a given service,
+                * we need to cancel it.
+                */
+               if (agent->pending && agent->pending->user_context &&
+                               agent->pending->user_context == user_context) {
+                       DBG("cancel request %p", agent->pending);
+
+                       if (agent->pending->call)
+                               send_cancel_request(agent, agent->pending);
+
+                       agent_finalize_pending(agent, NULL);
+
+                       err = agent_send_next_request(agent);
+                       if (err < 0 && err != -EBUSY)
+                               DBG("send next request failed (%s/%d)",
+                                               strerror(-err), -err);
+               }
+       }
+}
+
+static void agent_unref_debug(struct connman_agent *agent,
+                       const char *file, int line, const char *caller)
+{
+       DBG("%p ref %d by %s:%d:%s()", agent, agent->refcount - 1,
+               file, line, caller);
+
+       if (__sync_fetch_and_sub(&agent->refcount, 1) != 1)
+               return;
+
+       cancel_all_requests(agent);
+
+       g_free(agent->owner);
+       g_free(agent->path);
+
+       if (agent == default_agent) {
+               default_agent = NULL;
+               set_default_agent();
+       }
+
+       g_free(agent);
+}
+
+static void agent_release(struct connman_agent *agent, const char *interface)
+{
+       DBusMessage *message;
+
+       DBG("release agent %s %s", agent->owner, agent->path);
+
+       message = dbus_message_new_method_call(agent->owner, agent->path,
+                                               interface, "Release");
+       if (message == NULL) {
+               connman_error("Couldn't allocate D-Bus message");
+               return;
+       }
+
+       dbus_message_set_no_reply(message, TRUE);
+       g_dbus_send_message(connection, message);
+}
+
+static void release_agents(void)
+{
+       GHashTableIter iter;
+       gpointer key, value;
+
+       g_hash_table_iter_init(&iter, agent_hash);
+       while (g_hash_table_iter_next(&iter, &key, &value))
+               agent_release(value, get_driver()->interface);
+}
+
 /**
  * connman_agent_driver_unregister:
  * @driver: Agent driver definition
@@ -410,47 +594,46 @@ void connman_agent_driver_unregister(struct connman_agent_driver *driver)
 {
        GSList *list;
 
-       if (driver == NULL)
+       if (!driver)
                return;
 
        DBG("Unregistering driver %p name %s", driver, driver->name);
 
-       if (agent_sender == NULL && agent_path == NULL)
-               goto out;
+       release_agents();
 
        for (list = driver_list; list; list = list->next) {
-               DBusMessage *message;
-
                if (driver != list->data)
                        continue;
 
-               DBG("Sending release to %s path %s iface %s", agent_sender,
-                       agent_path, driver->interface);
+               g_hash_table_remove_all(agent_hash);
+               break;
+       }
 
-               message = dbus_message_new_method_call(agent_sender, agent_path,
-                               driver->interface, "Release");
-               if (message != NULL) {
-                       dbus_message_set_no_reply(message, TRUE);
-                       g_dbus_send_message(connection, message);
-               }
+       driver_list = g_slist_remove(driver_list, driver);
+}
 
-               agent_free();
+static void agent_destroy(gpointer data)
+{
+       struct connman_agent *agent = data;
 
-               /*
-                * ATM agent_free() unsets the agent_sender and agent_path
-                * variables so we can unregister only once.
-                * This needs proper fix later.
-                */
-               break;
+       DBG("agent %s req %p", agent->owner, agent->pending);
+
+       if (agent->watch > 0) {
+               g_dbus_remove_watch(connection, agent->watch);
+               agent->watch = 0;
        }
 
-out:
-       driver_list = g_slist_remove(driver_list, driver);
+       agent_unref(agent);
 }
 
-static void release_all_agents(void)
+int connman_agent_unregister(const char *sender, const char *path)
 {
-       connman_agent_driver_unregister(get_driver());
+       DBG("sender %s path %s", sender, path);
+
+       if (!g_hash_table_remove(agent_hash, sender))
+               return -ESRCH;
+
+       return 0;
 }
 
 int __connman_agent_init(void)
@@ -458,8 +641,13 @@ int __connman_agent_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
-               return -1;
+       if (!connection)
+               return -EINVAL;
+
+       agent_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                               NULL, agent_destroy);
+       if (!agent_hash)
+               return -ENOMEM;
 
        return 0;
 }
@@ -468,13 +656,12 @@ void __connman_agent_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
-       if (agent_watch > 0)
-               g_dbus_remove_watch(connection, agent_watch);
+       g_hash_table_destroy(agent_hash);
 
-       release_all_agents();
+       release_driver();
 
        dbus_connection_unref(connection);
        connection = NULL;
index e46cdda..034fa13 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
- *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  BMW Car IT GmbH. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -46,14 +46,14 @@ static int set_forward_delay(const char *name, unsigned int delay)
        forward_delay_path =
                g_strdup_printf("/sys/class/net/%s/bridge/forward_delay", name);
 
-       if (forward_delay_path == NULL)
+       if (!forward_delay_path)
                return -ENOMEM;
 
        f = fopen(forward_delay_path, "r+");
 
        g_free(forward_delay_path);
 
-       if (f == NULL)
+       if (!f)
                return -errno;
 
        fprintf(f, "%d", delay);
@@ -111,8 +111,8 @@ int __connman_bridge_remove(const char *name)
        return 0;
 }
 
-int __connman_bridge_enable(const char *name, const char *gateway,
-                               const char *broadcast)
+int __connman_bridge_enable(const char *name, const char *ip_address,
+                       int prefix_len, const char *broadcast)
 {
        int err, index;
 
@@ -121,8 +121,8 @@ int __connman_bridge_enable(const char *name, const char *gateway,
                return index;
 
        err = __connman_inet_modify_address(RTM_NEWADDR,
-                       NLM_F_REPLACE | NLM_F_ACK, index, AF_INET,
-                                       gateway, NULL, 24, broadcast);
+                               NLM_F_REPLACE | NLM_F_ACK, index, AF_INET,
+                               ip_address, NULL, prefix_len, broadcast);
        if (err < 0)
                return err;
 
index 2ce61d9..0fde2c3 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -96,7 +96,7 @@ static void clock_properties_load(void)
        enum timezone_updates timezone_value;
 
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
+       if (!keyfile)
                return;
 
        str = g_key_file_get_string(keyfile, "global", "TimeUpdates", NULL);
@@ -125,17 +125,17 @@ static void clock_properties_save(void)
        const char *str;
 
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
+       if (!keyfile)
                keyfile = g_key_file_new();
 
        str = time_updates2string(time_updates_config);
-       if (str != NULL)
+       if (str)
                g_key_file_set_string(keyfile, "global", "TimeUpdates", str);
        else
                g_key_file_remove_key(keyfile, "global", "TimeUpdates", NULL);
 
        str = timezone_updates2string(timezone_updates_config);
-       if (str != NULL)
+       if (str)
                g_key_file_set_string(keyfile, "global", "TimezoneUpdates",
                                str);
        else
@@ -157,10 +157,10 @@ static void append_timeservers(DBusMessageIter *iter, void *user_data)
        int i;
        char **timeservers = __connman_timeserver_system_get();
 
-       if (timeservers == NULL)
+       if (!timeservers)
                return;
 
-       for (i = 0; timeservers[i] != NULL; i++) {
+       for (i = 0; timeservers[i]; i++) {
                dbus_message_iter_append_basic(iter,
                                DBUS_TYPE_STRING, &timeservers[i]);
        }
@@ -179,7 +179,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
        DBG("conn %p", conn);
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_iter_init_append(reply, &array);
@@ -194,16 +194,16 @@ static DBusMessage *get_properties(DBusConnection *conn,
        }
 
        str = time_updates2string(time_updates_config);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(&dict, "TimeUpdates",
                                                DBUS_TYPE_STRING, &str);
 
-       if (timezone_config != NULL)
+       if (timezone_config)
                connman_dbus_dict_append_basic(&dict, "Timezone",
                                        DBUS_TYPE_STRING, &timezone_config);
 
        str = timezone_updates2string(timezone_updates_config);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(&dict, "TimezoneUpdates",
                                                DBUS_TYPE_STRING, &str);
 
@@ -224,7 +224,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -240,7 +240,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        type = dbus_message_iter_get_arg_type(&value);
 
-       if (g_str_equal(name, "Time") == TRUE) {
+       if (g_str_equal(name, "Time")) {
                struct timeval tv;
                dbus_uint64_t newval;
 
@@ -261,7 +261,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "Time",
                                DBUS_TYPE_UINT64, &newval);
-       } else if (g_str_equal(name, "TimeUpdates") == TRUE) {
+       } else if (g_str_equal(name, "TimeUpdates")) {
                const char *strval;
                enum time_updates newval;
 
@@ -283,7 +283,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "TimeUpdates",
                                DBUS_TYPE_STRING, &strval);
-       } else if (g_str_equal(name, "Timezone") == TRUE) {
+       } else if (g_str_equal(name, "Timezone")) {
                const char *strval;
 
                if (type != DBUS_TYPE_STRING)
@@ -295,8 +295,8 @@ static DBusMessage *set_property(DBusConnection *conn,
                dbus_message_iter_get_basic(&value, &strval);
 
                if (__connman_timezone_change(strval) < 0)
-                        return __connman_error_invalid_arguments(msg);
-       } else if (g_str_equal(name, "TimezoneUpdates") == TRUE) {
+                       return __connman_error_invalid_arguments(msg);
+       } else if (g_str_equal(name, "TimezoneUpdates")) {
                const char *strval;
                enum timezone_updates newval;
 
@@ -318,7 +318,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "TimezoneUpdates",
                                DBUS_TYPE_STRING, &strval);
-       } else if (g_str_equal(name, "Timeservers") == TRUE) {
+       } else if (g_str_equal(name, "Timeservers")) {
                DBusMessageIter entry;
                char **str = NULL;
                GSList *list = NULL;
@@ -344,10 +344,10 @@ static DBusMessage *set_property(DBusConnection *conn,
                        dbus_message_iter_next(&entry);
                }
 
-               if (list != NULL) {
+               if (list) {
                        str = g_new0(char *, count+1);
 
-                       while (list != NULL) {
+                       while (list) {
                                count--;
                                str[count] = list->data;
                                list = g_slist_delete_link(list, list);
@@ -356,7 +356,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                __connman_timeserver_system_set(str);
 
-               if (str != NULL)
+               if (str)
                        g_strfreev(str);
 
                connman_dbus_property_changed_array(CONNMAN_MANAGER_PATH,
@@ -393,7 +393,7 @@ void __connman_clock_update_timezone(void)
        g_free(timezone_config);
        timezone_config = __connman_timezone_lookup();
 
-       if (timezone_config == NULL)
+       if (!timezone_config)
                return;
 
        connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
@@ -406,7 +406,7 @@ int __connman_clock_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        __connman_timezone_init();
@@ -426,7 +426,7 @@ void __connman_clock_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        g_dbus_unregister_interface(connection, CONNMAN_MANAGER_PATH,
index e5c9c7e..330ae81 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -55,8 +55,8 @@ struct connman_config_service {
        GSList *service_identifiers;
        char *config_ident; /* file prefix */
        char *config_entry; /* entry name */
-       connman_bool_t hidden;
-       connman_bool_t virtual;
+       bool hidden;
+       bool virtual;
        char *virtual_file;
        char *ipv4_address;
        char *ipv4_netmask;
@@ -81,7 +81,7 @@ struct connman_config {
 
 static GHashTable *config_table = NULL;
 
-static connman_bool_t cleanup = FALSE;
+static bool cleanup = false;
 
 /* Definition of possible strings in the .config files */
 #define CONFIG_KEY_NAME                "Name"
@@ -162,38 +162,40 @@ static void unregister_service(gpointer data)
        char *service_id;
        GSList *list;
 
-       if (cleanup == TRUE)
+       if (cleanup)
                goto free_only;
 
        connman_info("Removing service configuration %s",
                                                config_service->ident);
 
-       if (config_service->virtual == TRUE)
+       if (config_service->virtual)
                goto free_only;
 
-       for (list = config_service->service_identifiers; list != NULL;
+       for (list = config_service->service_identifiers; list;
                                                        list = list->next) {
                service_id = list->data;
 
                service = __connman_service_lookup_from_ident(service_id);
-               if (service != NULL) {
-                       __connman_service_set_immutable(service, FALSE);
+               if (service) {
+                       __connman_service_set_immutable(service, false);
                        __connman_service_set_config(service, NULL, NULL);
                        __connman_service_remove(service);
 
                        /*
-                        * Ethernet service cannot be removed by
+                        * Ethernet or gadget service cannot be removed by
                         * __connman_service_remove() so reset the ipconfig
                         * here.
                         */
                        if (connman_service_get_type(service) ==
-                                               CONNMAN_SERVICE_TYPE_ETHERNET) {
+                                               CONNMAN_SERVICE_TYPE_ETHERNET ||
+                                       connman_service_get_type(service) ==
+                                               CONNMAN_SERVICE_TYPE_GADGET) {
                                __connman_service_disconnect(service);
                                __connman_service_reset_ipconfig(service,
                                        CONNMAN_IPCONFIG_TYPE_IPV4, NULL, NULL);
                                __connman_service_reset_ipconfig(service,
                                        CONNMAN_IPCONFIG_TYPE_IPV6, NULL, NULL);
-                               __connman_service_set_ignore(service, TRUE);
+                               __connman_service_set_ignore(service, true);
 
                                /*
                                 * After these operations, user needs to
@@ -203,7 +205,7 @@ static void unregister_service(gpointer data)
                        }
                }
 
-               if (__connman_storage_remove_service(service_id) == FALSE)
+               if (!__connman_storage_remove_service(service_id))
                        DBG("Could not remove all files for service %s",
                                                                service_id);
        }
@@ -247,7 +249,7 @@ static void check_keys(GKeyFile *keyfile, const char *group,
        gsize nb_avail_keys, i, j;
 
        avail_keys = g_key_file_get_keys(keyfile, group, &nb_avail_keys, NULL);
-       if (avail_keys == NULL)
+       if (!avail_keys)
                return;
 
        /*
@@ -259,7 +261,7 @@ static void check_keys(GKeyFile *keyfile, const char *group,
                        if (g_strcmp0(avail_keys[i], possible_keys[j]) == 0)
                                break;
 
-               if (possible_keys[j] == NULL)
+               if (!possible_keys[j])
                        connman_warn("Unknown configuration key %s in [%s]",
                                        avail_keys[i], group);
        }
@@ -313,11 +315,11 @@ static int parse_address(const char *address_str, int address_family,
        char **route;
 
        route = g_strsplit(address_str, "/", 0);
-       if (route == NULL)
+       if (!route)
                return -EINVAL;
 
        addr_str = route[0];
-       if (addr_str == NULL || addr_str[0] == '\0') {
+       if (!addr_str || addr_str[0] == '\0') {
                err = -EINVAL;
                goto out;
        }
@@ -326,20 +328,17 @@ static int parse_address(const char *address_str, int address_family,
                goto out;
 
        mask_str = route[1];
-       if (mask_str == NULL || mask_str[0] == '\0') {
+       if (!mask_str || mask_str[0] == '\0') {
                err = -EINVAL;
                goto out;
        }
 
        gw_str = route[2];
-       if (gw_str == NULL || gw_str[0] == '\0') {
-               err = -EINVAL;
-               goto out;
+       if (gw_str && gw_str[0]) {
+               if ((err = check_family(gw_str, address_family)) < 0)
+                       goto out;
        }
 
-       if ((err = check_family(gw_str, address_family)) < 0)
-               goto out;
-
        g_free(*address);
        *address = g_strdup(addr_str);
 
@@ -349,7 +348,10 @@ static int parse_address(const char *address_str, int address_family,
        g_free(*gateway);
        *gateway = g_strdup(gw_str);
 
-       DBG("address %s/%s via %s", *address, *netmask, *gateway);
+       if (*gateway)
+               DBG("address %s/%s via %s", *address, *netmask, *gateway);
+       else
+               DBG("address %s/%s", *address, *netmask);
 
 out:
        g_strfreev(route);
@@ -357,19 +359,19 @@ out:
        return err;
 }
 
-static connman_bool_t check_address(char *address_str, char **address)
+static bool check_address(char *address_str, char **address)
 {
        if (g_ascii_strcasecmp(address_str, "auto") == 0 ||
                        g_ascii_strcasecmp(address_str, "dhcp") == 0 ||
                        g_ascii_strcasecmp(address_str, "off") == 0) {
                *address = address_str;
-               return FALSE;
+               return false;
        }
 
-       return TRUE;
+       return true;
 }
 
-static connman_bool_t load_service_generic(GKeyFile *keyfile,
+static bool load_service_generic(GKeyFile *keyfile,
                        const char *group, struct connman_config *config,
                        struct connman_config_service *service)
 {
@@ -377,8 +379,8 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
        char **strlist;
        gsize length;
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_IPv4, NULL);
-       if (str != NULL && check_address(str, &service->ipv4_address) == TRUE) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_IPv4, NULL);
+       if (str && check_address(str, &service->ipv4_address)) {
                mask = NULL;
 
                if (parse_address(str, AF_INET, &service->ipv4_address,
@@ -389,7 +391,7 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
                        goto err;
                }
 
-               if (g_strrstr(mask, ".") == NULL) {
+               if (!g_strrstr(mask, ".")) {
                        /* We have netmask length */
                        in_addr_t addr;
                        struct in_addr netmask_in;
@@ -412,8 +414,8 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
                g_free(str);
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_IPv6, NULL);
-       if (str != NULL && check_address(str, &service->ipv6_address) == TRUE) {
+       str =  __connman_config_get_string(keyfile, group, SERVICE_KEY_IPv6, NULL);
+       if (str && check_address(str, &service->ipv6_address)) {
                long int value;
                char *ptr;
 
@@ -437,29 +439,29 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
                g_free(str);
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_IPv6_PRIVACY,
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_IPv6_PRIVACY,
                                                                        NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(service->ipv6_privacy);
                service->ipv6_privacy = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_MAC, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_MAC, NULL);
+       if (str) {
                g_free(service->mac);
                service->mac = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_DOMAIN, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_DOMAIN, NULL);
+       if (str) {
                g_free(service->domain_name);
                service->domain_name = str;
        }
 
-       strlist = g_key_file_get_string_list(keyfile, group,
+       strlist = __connman_config_get_string_list(keyfile, group,
                                        SERVICE_KEY_NAMESERVERS,
                                        &length, NULL);
-       if (strlist != NULL) {
+       if (strlist) {
                if (length != 0) {
                        g_strfreev(service->nameservers);
                        service->nameservers = strlist;
@@ -467,10 +469,10 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
                        g_strfreev(strlist);
        }
 
-       strlist = g_key_file_get_string_list(keyfile, group,
+       strlist = __connman_config_get_string_list(keyfile, group,
                                        SERVICE_KEY_SEARCH_DOMAINS,
                                        &length, NULL);
-       if (strlist != NULL) {
+       if (strlist) {
                if (length != 0) {
                        g_strfreev(service->search_domains);
                        service->search_domains = strlist;
@@ -478,10 +480,10 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
                        g_strfreev(strlist);
        }
 
-       strlist = g_key_file_get_string_list(keyfile, group,
+       strlist = __connman_config_get_string_list(keyfile, group,
                                        SERVICE_KEY_TIMESERVERS,
                                        &length, NULL);
-       if (strlist != NULL) {
+       if (strlist) {
                if (length != 0) {
                        g_strfreev(service->timeservers);
                        service->timeservers = strlist;
@@ -489,7 +491,7 @@ static connman_bool_t load_service_generic(GKeyFile *keyfile,
                        g_strfreev(strlist);
        }
 
-       return TRUE;
+       return true;
 
 err:
        g_free(service->ident);
@@ -502,39 +504,39 @@ err:
        g_free(service->mac);
        g_free(service);
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
+static bool load_service(GKeyFile *keyfile, const char *group,
                                                struct connman_config *config)
 {
        struct connman_config_service *service;
        const char *ident;
        char *str, *hex_ssid;
-       gboolean service_created = FALSE;
+       bool service_created = false;
 
        /* Strip off "service_" prefix */
        ident = group + 8;
 
        if (strlen(ident) < 1)
-               return FALSE;
+               return false;
 
        /* Verify that provided keys are good */
        check_keys(keyfile, group, service_possible_keys);
 
        service = g_hash_table_lookup(config->service_table, ident);
-       if (service == NULL) {
+       if (!service) {
                service = g_try_new0(struct connman_config_service, 1);
-               if (service == NULL)
-                       return FALSE;
+               if (!service)
+                       return false;
 
                service->ident = g_strdup(ident);
 
-               service_created = TRUE;
+               service_created = true;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_TYPE, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_TYPE, NULL);
+       if (str) {
                g_free(service->type);
                service->type = str;
        } else {
@@ -543,8 +545,8 @@ static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
                goto err;
        }
 
-       if (load_service_generic(keyfile, group, config, service) == FALSE)
-               return FALSE;
+       if (!load_service_generic(keyfile, group, config, service))
+               return false;
 
        if (g_strcmp0(str, "ethernet") == 0) {
                service->config_ident = g_strdup(config->ident);
@@ -553,24 +555,24 @@ static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
 
                g_hash_table_insert(config->service_table, service->ident,
                                                                service);
-               return 0;
+               return true;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_NAME, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_NAME, NULL);
+       if (str) {
                g_free(service->name);
                service->name = str;
        }
 
-       hex_ssid = g_key_file_get_string(keyfile, group, SERVICE_KEY_SSID,
+       hex_ssid = __connman_config_get_string(keyfile, group, SERVICE_KEY_SSID,
                                         NULL);
-       if (hex_ssid != NULL) {
+       if (hex_ssid) {
                char *ssid;
                unsigned int i, j = 0, hex;
                size_t hex_ssid_len = strlen(hex_ssid);
 
                ssid = g_try_malloc0(hex_ssid_len / 2);
-               if (ssid == NULL) {
+               if (!ssid) {
                        g_free(hex_ssid);
                        goto err;
                }
@@ -590,13 +592,13 @@ static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
                g_free(service->ssid);
                service->ssid = ssid;
                service->ssid_len = hex_ssid_len / 2;
-       } else if (service->name != NULL) {
+       } else if (service->name) {
                char *ssid;
                unsigned int ssid_len;
 
                ssid_len = strlen(service->name);
                ssid = g_try_malloc0(ssid_len);
-               if (ssid == NULL)
+               if (!ssid)
                        goto err;
 
                memcpy(ssid, service->name, ssid_len);
@@ -605,59 +607,59 @@ static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
                service->ssid_len = ssid_len;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_EAP, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_EAP, NULL);
+       if (str) {
                g_free(service->eap);
                service->eap = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_CA_CERT, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_CA_CERT, NULL);
+       if (str) {
                g_free(service->ca_cert_file);
                service->ca_cert_file = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_CL_CERT, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_CL_CERT, NULL);
+       if (str) {
                g_free(service->client_cert_file);
                service->client_cert_file = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_PRV_KEY, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_PRV_KEY, NULL);
+       if (str) {
                g_free(service->private_key_file);
                service->private_key_file = str;
        }
 
-       str = g_key_file_get_string(keyfile, group,
+       str = __connman_config_get_string(keyfile, group,
                                                SERVICE_KEY_PRV_KEY_PASS, NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(service->private_key_passphrase);
                service->private_key_passphrase = str;
        }
 
-       str = g_key_file_get_string(keyfile, group,
+       str = __connman_config_get_string(keyfile, group,
                                        SERVICE_KEY_PRV_KEY_PASS_TYPE, NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(service->private_key_passphrase_type);
                service->private_key_passphrase_type = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_IDENTITY, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_IDENTITY, NULL);
+       if (str) {
                g_free(service->identity);
                service->identity = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_PHASE2, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_PHASE2, NULL);
+       if (str) {
                g_free(service->phase2);
                service->phase2 = str;
        }
 
-       str = g_key_file_get_string(keyfile, group, SERVICE_KEY_PASSPHRASE,
+       str = __connman_config_get_string(keyfile, group, SERVICE_KEY_PASSPHRASE,
                                        NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(service->passphrase);
                service->passphrase = str;
        }
@@ -665,7 +667,7 @@ static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
        service->config_ident = g_strdup(config->ident);
        service->config_entry = g_strdup_printf("service_%s", service->ident);
 
-       service->hidden = g_key_file_get_boolean(keyfile, group,
+       service->hidden = __connman_config_get_bool(keyfile, group,
                                                SERVICE_KEY_HIDDEN, NULL);
 
        if (service_created)
@@ -674,10 +676,10 @@ static connman_bool_t load_service(GKeyFile *keyfile, const char *group,
 
        connman_info("Adding service configuration %s", service->ident);
 
-       return TRUE;
+       return true;
 
 err:
-       if (service_created == TRUE) {
+       if (service_created) {
                g_free(service->ident);
                g_free(service->type);
                g_free(service->name);
@@ -685,23 +687,23 @@ err:
                g_free(service);
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t load_service_from_keyfile(GKeyFile *keyfile,
+static bool load_service_from_keyfile(GKeyFile *keyfile,
                                                struct connman_config *config)
 {
-       connman_bool_t found = FALSE;
+       bool found = false;
        char **groups;
        int i;
 
        groups = g_key_file_get_groups(keyfile, NULL);
 
-       for (i = 0; groups[i] != NULL; i++) {
-               if (g_str_has_prefix(groups[i], "service_") == FALSE)
+       for (i = 0; groups[i]; i++) {
+               if (!g_str_has_prefix(groups[i], "service_"))
                        continue;
-               if (load_service(keyfile, groups[i], config) == TRUE)
-                       found = TRUE;
+               if (load_service(keyfile, groups[i], config))
+                       found = true;
        }
 
        g_strfreev(groups);
@@ -717,25 +719,27 @@ static int load_config(struct connman_config *config)
        DBG("config %p", config);
 
        keyfile = __connman_storage_load_config(config->ident);
-       if (keyfile == NULL)
+       if (!keyfile)
                return -EIO;
 
+       g_key_file_set_list_separator(keyfile, ',');
+
        /* Verify keys validity of the global section */
        check_keys(keyfile, "global", config_possible_keys);
 
-       str = g_key_file_get_string(keyfile, "global", CONFIG_KEY_NAME, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, "global", CONFIG_KEY_NAME, NULL);
+       if (str) {
                g_free(config->name);
                config->name = str;
        }
 
-       str = g_key_file_get_string(keyfile, "global", CONFIG_KEY_DESC, NULL);
-       if (str != NULL) {
+       str = __connman_config_get_string(keyfile, "global", CONFIG_KEY_DESC, NULL);
+       if (str) {
                g_free(config->description);
                config->description = str;
        }
 
-       if (load_service_from_keyfile(keyfile, config) == FALSE)
+       if (!load_service_from_keyfile(keyfile, config))
                connman_warn("Config file %s/%s.config does not contain any "
                        "configuration that can be provisioned!",
                        STORAGEDIR, config->ident);
@@ -751,11 +755,11 @@ static struct connman_config *create_config(const char *ident)
 
        DBG("ident %s", ident);
 
-       if (g_hash_table_lookup(config_table, ident) != NULL)
+       if (g_hash_table_lookup(config_table, ident))
                return NULL;
 
        config = g_try_new0(struct connman_config, 1);
-       if (config == NULL)
+       if (!config)
                return NULL;
 
        config->ident = g_strdup(ident);
@@ -770,18 +774,18 @@ static struct connman_config *create_config(const char *ident)
        return config;
 }
 
-static connman_bool_t validate_ident(const char *ident)
+static bool validate_ident(const char *ident)
 {
        unsigned int i;
 
-       if (ident == NULL)
-               return FALSE;
+       if (!ident)
+               return false;
 
        for (i = 0; i < strlen(ident); i++)
-               if (g_ascii_isprint(ident[i]) == FALSE)
-                       return FALSE;
+               if (!g_ascii_isprint(ident[i]))
+                       return false;
 
-       return TRUE;
+       return true;
 }
 
 static int read_configs(void)
@@ -791,31 +795,31 @@ static int read_configs(void)
        DBG("");
 
        dir = g_dir_open(STORAGEDIR, 0, NULL);
-       if (dir != NULL) {
+       if (dir) {
                const gchar *file;
 
-               while ((file = g_dir_read_name(dir)) != NULL) {
+               while ((file = g_dir_read_name(dir))) {
                        GString *str;
                        gchar *ident;
 
-                       if (g_str_has_suffix(file, ".config") == FALSE)
+                       if (!g_str_has_suffix(file, ".config"))
                                continue;
 
                        ident = g_strrstr(file, ".config");
-                       if (ident == NULL)
+                       if (!ident)
                                continue;
 
                        str = g_string_new_len(file, ident - file);
-                       if (str == NULL)
+                       if (!str)
                                continue;
 
                        ident = g_string_free(str, FALSE);
 
-                       if (validate_ident(ident) == TRUE) {
+                       if (validate_ident(ident)) {
                                struct connman_config *config;
 
                                config = create_config(ident);
-                               if (config != NULL)
+                               if (config)
                                        load_config(config);
                        } else {
                                connman_error("Invalid config ident %s", ident);
@@ -834,19 +838,19 @@ static void config_notify_handler(struct inotify_event *event,
 {
        char *ext;
 
-       if (ident == NULL)
+       if (!ident)
                return;
 
-       if (g_str_has_suffix(ident, ".config") == FALSE)
+       if (!g_str_has_suffix(ident, ".config"))
                return;
 
        ext = g_strrstr(ident, ".config");
-       if (ext == NULL)
+       if (!ext)
                return;
 
        *ext = '\0';
 
-       if (validate_ident(ident) == FALSE) {
+       if (!validate_ident(ident)) {
                connman_error("Invalid config ident %s", ident);
                return;
        }
@@ -858,7 +862,7 @@ static void config_notify_handler(struct inotify_event *event,
                struct connman_config *config;
 
                config = g_hash_table_lookup(config_table, ident);
-               if (config != NULL) {
+               if (config) {
                        int ret;
 
                        g_hash_table_remove_all(config->service_table);
@@ -896,14 +900,61 @@ void __connman_config_cleanup(void)
 {
        DBG("");
 
-       cleanup = TRUE;
+       cleanup = true;
 
        connman_inotify_unregister(STORAGEDIR, config_notify_handler);
 
        g_hash_table_destroy(config_table);
        config_table = NULL;
 
-       cleanup = FALSE;
+       cleanup = false;
+}
+
+char *__connman_config_get_string(GKeyFile *key_file,
+       const char *group_name, const char *key, GError **error)
+{
+       char *str = g_key_file_get_string(key_file, group_name, key, error);
+       if (!str)
+               return NULL;
+
+       return g_strchomp(str);
+}
+
+char **__connman_config_get_string_list(GKeyFile *key_file,
+       const char *group_name, const char *key, gsize *length, GError **error)
+{
+       char **p;
+       char **strlist = g_key_file_get_string_list(key_file, group_name, key,
+               length, error);
+       if (!strlist)
+               return NULL;
+
+       p = strlist;
+       while (*p) {
+               *p = g_strstrip(*p);
+               p++;
+       }
+
+       return strlist;
+}
+
+bool __connman_config_get_bool(GKeyFile *key_file,
+       const char *group_name, const char *key, GError **error)
+{
+       char *valstr;
+       bool val = false;
+
+       valstr = g_key_file_get_value(key_file, group_name, key, error);
+       if (!valstr)
+               return false;
+
+       valstr = g_strchomp(valstr);
+       if (strcmp(valstr, "true") == 0 || strcmp(valstr, "1") == 0)
+               val = true;
+
+       g_free(valstr);
+
+       return val;
 }
 
 static char *config_pem_fsid(const char *pem_file)
@@ -912,7 +963,7 @@ static char *config_pem_fsid(const char *pem_file)
        unsigned *fsid = (unsigned *) &buf.f_fsid;
        unsigned long long fsid64;
 
-       if (pem_file == NULL)
+       if (!pem_file)
                return NULL;
 
        if (statfs(pem_file, &buf) < 0) {
@@ -926,44 +977,43 @@ static char *config_pem_fsid(const char *pem_file)
        return g_strdup_printf("%llx", fsid64);
 }
 
-static void provision_service_wifi(gpointer key,
-                               struct connman_config_service *config,
+static void provision_service_wifi(struct connman_config_service *config,
                                struct connman_service *service,
                                struct connman_network *network,
                                const void *ssid, unsigned int ssid_len)
 {
-       if (config->eap != NULL)
+       if (config->eap)
                __connman_service_set_string(service, "EAP", config->eap);
 
-       if (config->identity != NULL)
+       if (config->identity)
                __connman_service_set_string(service, "Identity",
                                                        config->identity);
 
-       if (config->ca_cert_file != NULL)
+       if (config->ca_cert_file)
                __connman_service_set_string(service, "CACertFile",
                                                        config->ca_cert_file);
 
-       if (config->client_cert_file != NULL)
+       if (config->client_cert_file)
                __connman_service_set_string(service, "ClientCertFile",
                                                config->client_cert_file);
 
-       if (config->private_key_file != NULL)
+       if (config->private_key_file)
                __connman_service_set_string(service, "PrivateKeyFile",
                                                config->private_key_file);
 
        if (g_strcmp0(config->private_key_passphrase_type, "fsid") == 0 &&
-                                       config->private_key_file != NULL) {
+                                       config->private_key_file) {
                char *fsid;
 
                fsid = config_pem_fsid(config->private_key_file);
-               if (fsid == NULL)
+               if (!fsid)
                        return;
 
                g_free(config->private_key_passphrase);
                config->private_key_passphrase = fsid;
        }
 
-       if (config->private_key_passphrase != NULL) {
+       if (config->private_key_passphrase) {
                __connman_service_set_string(service, "PrivateKeyPassphrase",
                                                config->private_key_passphrase);
                /*
@@ -975,13 +1025,14 @@ static void provision_service_wifi(gpointer key,
                 */
        }
 
-       if (config->phase2 != NULL)
+       if (config->phase2)
                __connman_service_set_string(service, "Phase2", config->phase2);
 
-       if (config->passphrase != NULL)
-               __connman_service_set_string(service, "Passphrase", config->passphrase);
+       if (config->passphrase)
+               __connman_service_set_string(service, "Passphrase",
+                                               config->passphrase);
 
-       if (config->hidden == TRUE)
+       if (config->hidden)
                __connman_service_set_hidden(service);
 }
 
@@ -994,7 +1045,8 @@ static gboolean remove_virtual_config(gpointer user_data)
 {
        struct connect_virtual *virtual = user_data;
 
-       __connman_service_connect(virtual->service);
+       __connman_service_connect(virtual->service,
+                               CONNMAN_SERVICE_CONNECT_REASON_AUTO);
        g_hash_table_remove(config_table, virtual->vfile);
 
        g_free(virtual);
@@ -1002,11 +1054,9 @@ static gboolean remove_virtual_config(gpointer user_data)
        return FALSE;
 }
 
-static void provision_service(gpointer key, gpointer value,
-                                                       gpointer user_data)
+static int try_provision_service(struct connman_config_service *config,
+                               struct connman_service *service)
 {
-       struct connman_service *service = user_data;
-       struct connman_config_service *config = value;
        struct connman_network *network;
        const void *service_id;
        enum connman_service_type type;
@@ -1016,32 +1066,36 @@ static void provision_service(gpointer key, gpointer value,
        type = connman_service_get_type(service);
        if (type == CONNMAN_SERVICE_TYPE_WIFI &&
                                g_strcmp0(config->type, "wifi") != 0)
-               return;
+               return -ENOENT;
 
        if (type == CONNMAN_SERVICE_TYPE_ETHERNET &&
                                g_strcmp0(config->type, "ethernet") != 0)
-               return;
+               return -ENOENT;
+
+       if (type == CONNMAN_SERVICE_TYPE_GADGET &&
+                               g_strcmp0(config->type, "gadget") != 0)
+               return -ENOENT;
 
        DBG("service %p ident %s", service,
                                        __connman_service_get_ident(service));
 
        network = __connman_service_get_network(service);
-       if (network == NULL) {
+       if (!network) {
                connman_error("Service has no network set");
-               return;
+               return -EINVAL;
        }
 
        DBG("network %p ident %s", network,
                                connman_network_get_identifier(network));
 
-       if (config->mac != NULL) {
+       if (config->mac) {
                struct connman_device *device;
                const char *device_addr;
 
                device = connman_network_get_device(network);
-               if (device == NULL) {
+               if (!device) {
                        connman_error("Network device is missing");
-                       return;
+                       return -ENODEV;
                }
 
                device_addr = connman_device_get_string(device, "Address");
@@ -1049,26 +1103,26 @@ static void provision_service(gpointer key, gpointer value,
                DBG("wants %s has %s", config->mac, device_addr);
 
                if (g_ascii_strcasecmp(device_addr, config->mac) != 0)
-                       return;
+                       return -ENOENT;
        }
 
        if (g_strcmp0(config->type, "wifi") == 0 &&
                                type == CONNMAN_SERVICE_TYPE_WIFI) {
                ssid = connman_network_get_blob(network, "WiFi.SSID",
                                                &ssid_len);
-               if (ssid == NULL) {
+               if (!ssid) {
                        connman_error("Network SSID not set");
-                       return;
+                       return -EINVAL;
                }
 
-               if (config->ssid == NULL || ssid_len != config->ssid_len)
-                       return;
+               if (!config->ssid || ssid_len != config->ssid_len)
+                       return -ENOENT;
 
                if (memcmp(config->ssid, ssid, ssid_len) != 0)
-                       return;
+                       return -ENOENT;
        }
 
-       if (config->ipv6_address == NULL) {
+       if (!config->ipv6_address) {
                connman_network_set_ipv6_method(network,
                                                CONNMAN_IPCONFIG_METHOD_AUTO);
        } else if (g_ascii_strcasecmp(config->ipv6_address, "off") == 0) {
@@ -1081,15 +1135,14 @@ static void provision_service(gpointer key, gpointer value,
        } else {
                struct connman_ipaddress *address;
 
-               if (config->ipv6_prefix_length == 0 ||
-                                       config->ipv6_gateway == NULL) {
-                       DBG("IPv6 prefix or gateway missing");
-                       return;
+               if (config->ipv6_prefix_length == 0) {
+                       DBG("IPv6 prefix missing");
+                       return -EINVAL;
                }
 
                address = connman_ipaddress_alloc(AF_INET6);
-               if (address == NULL)
-                       return;
+               if (!address)
+                       return -ENOENT;
 
                connman_ipaddress_set_ipv6(address, config->ipv6_address,
                                        config->ipv6_prefix_length,
@@ -1105,16 +1158,16 @@ static void provision_service(gpointer key, gpointer value,
                connman_ipaddress_free(address);
        }
 
-       if (config->ipv6_privacy != NULL) {
+       if (config->ipv6_privacy) {
                struct connman_ipconfig *ipconfig;
 
                ipconfig = __connman_service_get_ip6config(service);
-               if (ipconfig != NULL)
+               if (ipconfig)
                        __connman_ipconfig_ipv6_set_privacy(ipconfig,
                                                        config->ipv6_privacy);
        }
 
-       if (config->ipv4_address == NULL) {
+       if (!config->ipv4_address) {
                connman_network_set_ipv4_method(network,
                                                CONNMAN_IPCONFIG_METHOD_DHCP);
        } else if (g_ascii_strcasecmp(config->ipv4_address, "off") == 0) {
@@ -1127,15 +1180,14 @@ static void provision_service(gpointer key, gpointer value,
        } else {
                struct connman_ipaddress *address;
 
-               if (config->ipv4_netmask == 0 ||
-                                       config->ipv4_gateway == NULL) {
-                       DBG("IPv4 netmask or gateway missing");
-                       return;
+               if (!config->ipv4_netmask) {
+                       DBG("IPv4 netmask missing");
+                       return -EINVAL;
                }
 
                address = connman_ipaddress_alloc(AF_INET);
-               if (address == NULL)
-                       return;
+               if (!address)
+                       return -ENOENT;
 
                connman_ipaddress_set_ipv4(address, config->ipv4_address,
                                        config->ipv4_netmask,
@@ -1158,48 +1210,49 @@ static void provision_service(gpointer key, gpointer value,
                g_slist_prepend(config->service_identifiers,
                                g_strdup(service_id));
 
-       if (config->virtual == FALSE)
-               __connman_service_set_immutable(service, TRUE);
+       if (!config->virtual)
+               __connman_service_set_immutable(service, true);
 
-       __connman_service_set_favorite_delayed(service, TRUE, TRUE);
+       __connman_service_set_favorite_delayed(service, true, true);
 
        __connman_service_set_config(service, config->config_ident,
                                                config->config_entry);
 
-       if (config->domain_name != NULL)
+       if (config->domain_name)
                __connman_service_set_domainname(service, config->domain_name);
 
-       if (config->nameservers != NULL) {
+       if (config->nameservers) {
                int i;
 
                __connman_service_nameserver_clear(service);
 
-               for (i = 0; config->nameservers[i] != NULL; i++) {
+               for (i = 0; config->nameservers[i]; i++) {
                        __connman_service_nameserver_append(service,
-                                               config->nameservers[i], FALSE);
+                                               config->nameservers[i], false);
                }
        }
 
-       if (config->search_domains != NULL)
+       if (config->search_domains)
                __connman_service_set_search_domains(service,
                                                config->search_domains);
 
-       if (config->timeservers != NULL)
+       if (config->timeservers)
                __connman_service_set_timeservers(service,
                                                config->timeservers);
 
        if (g_strcmp0(config->type, "wifi") == 0 &&
                                type == CONNMAN_SERVICE_TYPE_WIFI) {
-               provision_service_wifi(key, config, service, network,
+               provision_service_wifi(config, service, network,
                                                        ssid, ssid_len);
        } else
-               __connman_service_connect(service);
+               __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
        __connman_service_mark_dirty();
 
-       __connman_service_save(service);
+       __connman_service_load_modifiable(service);
 
-       if (config->virtual == TRUE) {
+       if (config->virtual) {
                struct connect_virtual *virtual;
 
                virtual = g_malloc0(sizeof(struct connect_virtual));
@@ -1208,34 +1261,47 @@ static void provision_service(gpointer key, gpointer value,
 
                g_timeout_add(0, remove_virtual_config, virtual);
        } else
-               __connman_service_auto_connect();
+               __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
+
+       return 0;
+}
+
+static int find_and_provision_service(struct connman_service *service)
+{
+       GHashTableIter iter, iter_service;
+       gpointer value, key, value_service, key_service;
+
+       g_hash_table_iter_init(&iter, config_table);
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               struct connman_config *config = value;
+
+               g_hash_table_iter_init(&iter_service, config->service_table);
+               while (g_hash_table_iter_next(&iter_service, &key_service,
+                                               &value_service)) {
+                       if (!try_provision_service(value_service, service))
+                               return 0;
+               }
+       }
+
+       return -ENOENT;
 }
 
 int __connman_config_provision_service(struct connman_service *service)
 {
        enum connman_service_type type;
-       GHashTableIter iter;
-       gpointer value, key;
 
-       /* For now only WiFi and Ethernet services are supported */
+       /* For now only WiFi, Gadget and Ethernet services are supported */
        type = connman_service_get_type(service);
 
        DBG("service %p type %d", service, type);
 
        if (type != CONNMAN_SERVICE_TYPE_WIFI &&
-                                       type != CONNMAN_SERVICE_TYPE_ETHERNET)
+                       type != CONNMAN_SERVICE_TYPE_ETHERNET &&
+                       type != CONNMAN_SERVICE_TYPE_GADGET)
                return -ENOSYS;
 
-       g_hash_table_iter_init(&iter, config_table);
-
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               struct connman_config *config = value;
-
-               g_hash_table_foreach(config->service_table,
-                                               provision_service, service);
-       }
-
-       return 0;
+       return find_and_provision_service(service);
 }
 
 int __connman_config_provision_service_ident(struct connman_service *service,
@@ -1245,20 +1311,21 @@ int __connman_config_provision_service_ident(struct connman_service *service,
        struct connman_config *config;
        int ret = 0;
 
-       /* For now only WiFi and Ethernet services are supported */
+       /* For now only WiFi, Gadget and Ethernet services are supported */
        type = connman_service_get_type(service);
 
        DBG("service %p type %d", service, type);
 
        if (type != CONNMAN_SERVICE_TYPE_WIFI &&
-                                       type != CONNMAN_SERVICE_TYPE_ETHERNET)
+                       type != CONNMAN_SERVICE_TYPE_ETHERNET &&
+                       type != CONNMAN_SERVICE_TYPE_GADGET)
                return -ENOSYS;
 
        config = g_hash_table_lookup(config_table, ident);
-       if (config != NULL) {
+       if (config) {
                GHashTableIter iter;
                gpointer value, key;
-               gboolean found = FALSE;
+               bool found = false;
 
                g_hash_table_iter_init(&iter, config->service_table);
 
@@ -1266,9 +1333,9 @@ int __connman_config_provision_service_ident(struct connman_service *service,
                 * Check if we need to remove individual service if it
                 * is missing from config file.
                 */
-               if (file != NULL && entry != NULL) {
+               if (file && entry) {
                        while (g_hash_table_iter_next(&iter, &key,
-                                                       &value) == TRUE) {
+                                                       &value)) {
                                struct connman_config_service *config_service;
 
                                config_service = value;
@@ -1281,14 +1348,14 @@ int __connman_config_provision_service_ident(struct connman_service *service,
                                                                entry) != 0)
                                        continue;
 
-                               found = TRUE;
+                               found = true;
                                break;
                        }
 
                        DBG("found %d ident %s file %s entry %s", found, ident,
                                                                file, entry);
 
-                       if (found == FALSE) {
+                       if (!found) {
                                /*
                                 * The entry+8 will skip "service_" prefix
                                 */
@@ -1298,8 +1365,7 @@ int __connman_config_provision_service_ident(struct connman_service *service,
                        }
                }
 
-               g_hash_table_foreach(config->service_table,
-                                               provision_service, service);
+               find_and_provision_service(service);
        }
 
        return ret;
@@ -1337,16 +1403,16 @@ int connman_config_provision_mutable_service(GKeyFile *keyfile)
        vfile = g_strdup_printf("service_mutable_%s.config", rstr);
 
        config = create_config(vfile);
-       if (config == NULL)
+       if (!config)
                return -ENOMEM;
 
-       if (load_service_from_keyfile(keyfile, config) == FALSE)
+       if (!load_service_from_keyfile(keyfile, config))
                goto error;
 
        group = g_key_file_get_start_group(keyfile);
 
        service_config = g_hash_table_lookup(config->service_table, group+8);
-       if (service_config == NULL)
+       if (!service_config)
                goto error;
 
        /* Specific to non file based config: */
@@ -1355,7 +1421,7 @@ int connman_config_provision_mutable_service(GKeyFile *keyfile)
        g_free(service_config->config_entry);
        service_config->config_entry = NULL;
 
-       service_config->virtual = TRUE;
+       service_config->virtual = true;
        service_config->virtual_file = vfile;
 
        __connman_service_provision_changed(vfile);
@@ -1381,35 +1447,35 @@ struct connman_config_entry **connman_config_get_entries(const char *type)
        int i = 0, count;
 
        g_hash_table_iter_init(&iter_file, config_table);
-       while (g_hash_table_iter_next(&iter_file, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter_file, &key, &value)) {
                struct connman_config *config_file = value;
 
                count = g_hash_table_size(config_file->service_table);
 
                entries = g_try_realloc(entries, (i + count + 1) *
                                        sizeof(struct connman_config_entry *));
-               if (entries == NULL)
+               if (!entries)
                        return NULL;
 
                g_hash_table_iter_init(&iter_config,
                                                config_file->service_table);
                while (g_hash_table_iter_next(&iter_config, &key,
-                                                       &value) == TRUE) {
+                                                       &value)) {
                        struct connman_config_service *config = value;
 
-                       if (type != NULL &&
+                       if (type &&
                                        g_strcmp0(config->type, type) != 0)
                                continue;
 
                        entries[i] = g_try_new0(struct connman_config_entry,
                                                1);
-                       if (entries[i] == NULL)
+                       if (!entries[i])
                                goto cleanup;
 
                        entries[i]->ident = g_strdup(config->ident);
                        entries[i]->name = g_strdup(config->name);
                        entries[i]->ssid = g_try_malloc0(config->ssid_len + 1);
-                       if (entries[i]->ssid == NULL)
+                       if (!entries[i]->ssid)
                                goto cleanup;
 
                        memcpy(entries[i]->ssid, config->ssid,
@@ -1421,10 +1487,10 @@ struct connman_config_entry **connman_config_get_entries(const char *type)
                }
        }
 
-       if (entries != NULL) {
+       if (entries) {
                entries = g_try_realloc(entries, (i + 1) *
                                        sizeof(struct connman_config_entry *));
-               if (entries == NULL)
+               if (!entries)
                        return NULL;
 
                entries[i] = NULL;
@@ -1443,7 +1509,7 @@ void connman_config_free_entries(struct connman_config_entry **entries)
 {
        int i;
 
-       if (entries == NULL)
+       if (!entries)
                return;
 
        for (i = 0; entries[i]; i++) {
@@ -1456,3 +1522,31 @@ void connman_config_free_entries(struct connman_config_entry **entries)
        g_free(entries);
        return;
 }
+
+bool __connman_config_address_provisioned(const char *address,
+                                       const char *netmask)
+{
+       GHashTableIter iter, siter;
+       gpointer value, key, svalue, skey;
+
+       if (!address || !netmask)
+               return false;
+
+       g_hash_table_iter_init(&iter, config_table);
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               struct connman_config *config = value;
+
+               g_hash_table_iter_init(&siter, config->service_table);
+               while (g_hash_table_iter_next(&siter, &skey, &svalue)) {
+                       struct connman_config_service *service = svalue;
+
+                       if (!g_strcmp0(address, service->ipv4_address) &&
+                                       !g_strcmp0(netmask,
+                                               service->ipv4_netmask))
+                               return true;
+               }
+       }
+
+       return false;
+}
index c7b1f62..e98ccb5 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
- *  Copyright (C) 2011  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2011-2013  BMW Car IT GmbH. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
 #include "connman.h"
 
 struct gateway_config {
-       gboolean active;
+       bool active;
        char *gateway;
 
        /* VPN extra data */
-       gboolean vpn;
+       bool vpn;
        char *vpn_ip;
        int vpn_phy_index;
        char *vpn_phy_ip;
@@ -49,7 +49,7 @@ struct gateway_data {
        unsigned int order;
        struct gateway_config *ipv4_gateway;
        struct gateway_config *ipv6_gateway;
-       connman_bool_t default_checked;
+       bool default_checked;
 };
 
 static GHashTable *gateway_hash = NULL;
@@ -59,22 +59,22 @@ static struct gateway_config *find_gateway(int index, const char *gateway)
        GHashTableIter iter;
        gpointer value, key;
 
-       if (gateway == NULL)
+       if (!gateway)
                return NULL;
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
-               if (data->ipv4_gateway != NULL && data->index == index &&
+               if (data->ipv4_gateway && data->index == index &&
                                g_str_equal(data->ipv4_gateway->gateway,
-                                       gateway) == TRUE)
+                                       gateway))
                        return data->ipv4_gateway;
 
-               if (data->ipv6_gateway != NULL && data->index == index &&
+               if (data->ipv6_gateway && data->index == index &&
                                g_str_equal(data->ipv6_gateway->gateway,
-                                       gateway) == TRUE)
+                                       gateway))
                        return data->ipv6_gateway;
        }
 
@@ -86,19 +86,19 @@ static struct gateway_data *lookup_gateway_data(struct gateway_config *config)
        GHashTableIter iter;
        gpointer value, key;
 
-       if (config == NULL)
+       if (!config)
                return NULL;
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
-               if (data->ipv4_gateway != NULL &&
+               if (data->ipv4_gateway &&
                                data->ipv4_gateway == config)
                        return data;
 
-               if (data->ipv6_gateway != NULL &&
+               if (data->ipv6_gateway &&
                                data->ipv6_gateway == config)
                        return data;
        }
@@ -111,22 +111,22 @@ static struct gateway_data *find_vpn_gateway(int index, const char *gateway)
        GHashTableIter iter;
        gpointer value, key;
 
-       if (gateway == NULL)
+       if (!gateway)
                return NULL;
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
-               if (data->ipv4_gateway != NULL && data->index == index &&
+               if (data->ipv4_gateway && data->index == index &&
                                g_str_equal(data->ipv4_gateway->gateway,
-                                       gateway) == TRUE)
+                                       gateway))
                        return data;
 
-               if (data->ipv6_gateway != NULL && data->index == index &&
+               if (data->ipv6_gateway && data->index == index &&
                                g_str_equal(data->ipv6_gateway->gateway,
-                                       gateway) == TRUE)
+                                       gateway))
                        return data;
        }
 
@@ -152,7 +152,7 @@ static void get_gateway_cb(const char *gateway, int index, void *user_data)
                params->vpn_index, params->vpn_gateway);
 
        data = find_vpn_gateway(params->vpn_index, params->vpn_gateway);
-       if (data == NULL) {
+       if (!data) {
                DBG("Cannot find VPN link route, index %d addr %s",
                        params->vpn_index, params->vpn_gateway);
                goto out;
@@ -199,18 +199,18 @@ static void set_vpn_routes(struct gateway_data *new_gateway,
        } else
                return;
 
-       if (config != NULL) {
+       if (config) {
                int index = __connman_ipconfig_get_index(ipconfig);
                struct get_gateway_params *params;
 
-               config->vpn = TRUE;
-               if (peer != NULL)
+               config->vpn = true;
+               if (peer)
                        config->vpn_ip = g_strdup(peer);
-               else if (gateway != NULL)
+               else if (gateway)
                        config->vpn_ip = g_strdup(gateway);
 
                params = g_try_malloc(sizeof(struct get_gateway_params));
-               if (params == NULL)
+               if (!params)
                        return;
 
                params->vpn_index = index;
@@ -222,7 +222,7 @@ static void set_vpn_routes(struct gateway_data *new_gateway,
                __connman_inet_get_route(gateway, get_gateway_cb, params);
        }
 
-       if (active_gateway == NULL)
+       if (!active_gateway)
                return;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
@@ -232,7 +232,7 @@ static void set_vpn_routes(struct gateway_data *new_gateway,
                 * the VPN. The route might already exist depending
                 * on network topology.
                 */
-               if (active_gateway->ipv4_gateway == NULL)
+               if (!active_gateway->ipv4_gateway)
                        return;
 
                DBG("active gw %s", active_gateway->ipv4_gateway->gateway);
@@ -248,7 +248,7 @@ static void set_vpn_routes(struct gateway_data *new_gateway,
 
        } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
 
-               if (active_gateway->ipv6_gateway == NULL)
+               if (!active_gateway->ipv6_gateway)
                        return;
 
                DBG("active gw %s", active_gateway->ipv6_gateway->gateway);
@@ -268,17 +268,17 @@ static int del_routes(struct gateway_data *data,
                        enum connman_ipconfig_type type)
 {
        int status4 = 0, status6 = 0;
-       int do_ipv4 = FALSE, do_ipv6 = FALSE;
+       bool do_ipv4 = false, do_ipv6 = false;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-               do_ipv4 = TRUE;
+               do_ipv4 = true;
        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-               do_ipv6 = TRUE;
+               do_ipv6 = true;
        else
-               do_ipv4 = do_ipv6 = TRUE;
+               do_ipv4 = do_ipv6 = true;
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL) {
-               if (data->ipv4_gateway->vpn == TRUE) {
+       if (do_ipv4 && data->ipv4_gateway) {
+               if (data->ipv4_gateway->vpn) {
                        status4 = connman_inet_clear_gateway_address(
                                                data->index,
                                                data->ipv4_gateway->vpn_ip);
@@ -296,8 +296,8 @@ static int del_routes(struct gateway_data *data,
                }
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL) {
-               if (data->ipv6_gateway->vpn == TRUE) {
+       if (do_ipv6 && data->ipv6_gateway) {
+               if (data->ipv6_gateway->vpn) {
                        status6 = connman_inet_clear_ipv6_gateway_address(
                                                data->index,
                                                data->ipv6_gateway->vpn_ip);
@@ -320,20 +320,20 @@ static int del_routes(struct gateway_data *data,
 static int disable_gateway(struct gateway_data *data,
                        enum connman_ipconfig_type type)
 {
-       gboolean active = FALSE;
+       bool active = false;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
-               if (data->ipv4_gateway != NULL)
+               if (data->ipv4_gateway)
                        active = data->ipv4_gateway->active;
        } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
-               if (data->ipv6_gateway != NULL)
+               if (data->ipv6_gateway)
                        active = data->ipv6_gateway->active;
        } else
-               active = TRUE;
+               active = true;
 
        DBG("type %d active %d", type, active);
 
-       if (active == TRUE)
+       if (active)
                return del_routes(data, type);
 
        return 0;
@@ -346,17 +346,17 @@ static struct gateway_data *add_gateway(struct connman_service *service,
        struct gateway_data *data, *old;
        struct gateway_config *config;
 
-       if (gateway == NULL || strlen(gateway) == 0)
+       if (!gateway || strlen(gateway) == 0)
                return NULL;
 
        data = g_try_new0(struct gateway_data, 1);
-       if (data == NULL)
+       if (!data)
                return NULL;
 
        data->index = index;
 
        config = g_try_new0(struct gateway_config, 1);
-       if (config == NULL) {
+       if (!config) {
                g_free(data);
                return NULL;
        }
@@ -364,9 +364,9 @@ static struct gateway_data *add_gateway(struct connman_service *service,
        config->gateway = g_strdup(gateway);
        config->vpn_ip = NULL;
        config->vpn_phy_ip = NULL;
-       config->vpn = FALSE;
+       config->vpn = false;
        config->vpn_phy_index = -1;
-       config->active = FALSE;
+       config->active = false;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                data->ipv4_gateway = config;
@@ -390,7 +390,7 @@ static struct gateway_data *add_gateway(struct connman_service *service,
         * from old gateway settings.
         */
        old = g_hash_table_lookup(gateway_hash, service);
-       if (old != NULL) {
+       if (old) {
                DBG("Replacing gw %p ipv4 %p ipv6 %p", old,
                        old->ipv4_gateway, old->ipv6_gateway);
                disable_gateway(old, type);
@@ -418,22 +418,22 @@ static void set_default_gateway(struct gateway_data *data,
 {
        int index;
        int status4 = 0, status6 = 0;
-       int do_ipv4 = FALSE, do_ipv6 = FALSE;
+       bool do_ipv4 = false, do_ipv6 = false;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-               do_ipv4 = TRUE;
+               do_ipv4 = true;
        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-               do_ipv6 = TRUE;
+               do_ipv6 = true;
        else
-               do_ipv4 = do_ipv6 = TRUE;
+               do_ipv4 = do_ipv6 = true;
 
        DBG("type %d gateway ipv4 %p ipv6 %p", type, data->ipv4_gateway,
                                                data->ipv6_gateway);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL &&
-                                       data->ipv4_gateway->vpn == TRUE) {
+       if (do_ipv4 && data->ipv4_gateway &&
+                                       data->ipv4_gateway->vpn) {
                connman_inet_set_gateway_interface(data->index);
-               data->ipv4_gateway->active = TRUE;
+               data->ipv4_gateway->active = true;
 
                DBG("set %p index %d vpn %s index %d phy %s",
                        data, data->index, data->ipv4_gateway->vpn_ip,
@@ -445,10 +445,10 @@ static void set_default_gateway(struct gateway_data *data,
                return;
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL &&
-                                       data->ipv6_gateway->vpn == TRUE) {
+       if (do_ipv6 && data->ipv6_gateway &&
+                                       data->ipv6_gateway->vpn) {
                connman_inet_set_ipv6_gateway_interface(data->index);
-               data->ipv6_gateway->active = TRUE;
+               data->ipv6_gateway->active = true;
 
                DBG("set %p index %d vpn %s index %d phy %s",
                        data, data->index, data->ipv6_gateway->vpn_ip,
@@ -462,7 +462,7 @@ static void set_default_gateway(struct gateway_data *data,
 
        index = __connman_service_get_index(data->service);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL &&
+       if (do_ipv4 && data->ipv4_gateway &&
                        g_strcmp0(data->ipv4_gateway->gateway,
                                                        "0.0.0.0") == 0) {
                if (connman_inet_set_gateway_interface(index) < 0)
@@ -470,7 +470,7 @@ static void set_default_gateway(struct gateway_data *data,
                goto done;
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL &&
+       if (do_ipv6 && data->ipv6_gateway &&
                        g_strcmp0(data->ipv6_gateway->gateway,
                                                        "::") == 0) {
                if (connman_inet_set_ipv6_gateway_interface(index) < 0)
@@ -478,13 +478,13 @@ static void set_default_gateway(struct gateway_data *data,
                goto done;
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL)
-               status6 = connman_inet_set_ipv6_gateway_address(index,
-                                               data->ipv6_gateway->gateway);
+       if (do_ipv6 && data->ipv6_gateway)
+               status6 = __connman_inet_add_default_to_table(RT_TABLE_MAIN,
+                                       index, data->ipv6_gateway->gateway);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL)
-               status4 = connman_inet_set_gateway_address(index,
-                                               data->ipv4_gateway->gateway);
+       if (do_ipv4 && data->ipv4_gateway)
+               status4 = __connman_inet_add_default_to_table(RT_TABLE_MAIN,
+                                       index, data->ipv4_gateway->gateway);
 
        if (status4 < 0 || status6 < 0)
                return;
@@ -497,22 +497,22 @@ static void unset_default_gateway(struct gateway_data *data,
                                enum connman_ipconfig_type type)
 {
        int index;
-       int do_ipv4 = FALSE, do_ipv6 = FALSE;
+       bool do_ipv4 = false, do_ipv6 = false;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-               do_ipv4 = TRUE;
+               do_ipv4 = true;
        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-               do_ipv6 = TRUE;
+               do_ipv6 = true;
        else
-               do_ipv4 = do_ipv6 = TRUE;
+               do_ipv4 = do_ipv6 = true;
 
        DBG("type %d gateway ipv4 %p ipv6 %p", type, data->ipv4_gateway,
                                                data->ipv6_gateway);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL &&
-                                       data->ipv4_gateway->vpn == TRUE) {
+       if (do_ipv4 && data->ipv4_gateway &&
+                                       data->ipv4_gateway->vpn) {
                connman_inet_clear_gateway_interface(data->index);
-               data->ipv4_gateway->active = FALSE;
+               data->ipv4_gateway->active = false;
 
                DBG("unset %p index %d vpn %s index %d phy %s",
                        data, data->index, data->ipv4_gateway->vpn_ip,
@@ -522,10 +522,10 @@ static void unset_default_gateway(struct gateway_data *data,
                return;
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL &&
-                                       data->ipv6_gateway->vpn == TRUE) {
+       if (do_ipv6 && data->ipv6_gateway &&
+                                       data->ipv6_gateway->vpn) {
                connman_inet_clear_ipv6_gateway_interface(data->index);
-               data->ipv6_gateway->active = FALSE;
+               data->ipv6_gateway->active = false;
 
                DBG("unset %p index %d vpn %s index %d phy %s",
                        data, data->index, data->ipv6_gateway->vpn_ip,
@@ -537,25 +537,25 @@ static void unset_default_gateway(struct gateway_data *data,
 
        index = __connman_service_get_index(data->service);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL &&
+       if (do_ipv4 && data->ipv4_gateway &&
                        g_strcmp0(data->ipv4_gateway->gateway,
                                                        "0.0.0.0") == 0) {
                connman_inet_clear_gateway_interface(index);
                return;
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL &&
+       if (do_ipv6 && data->ipv6_gateway &&
                        g_strcmp0(data->ipv6_gateway->gateway,
                                                        "::") == 0) {
                connman_inet_clear_ipv6_gateway_interface(index);
                return;
        }
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL)
+       if (do_ipv6 && data->ipv6_gateway)
                connman_inet_clear_ipv6_gateway_address(index,
                                                data->ipv6_gateway->gateway);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL)
+       if (do_ipv4 && data->ipv4_gateway)
                connman_inet_clear_gateway_address(index,
                                                data->ipv4_gateway->gateway);
 }
@@ -569,10 +569,10 @@ static struct gateway_data *find_default_gateway(void)
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
-               if (found == NULL || data->order > order) {
+               if (!found || data->order > order) {
                        found = data;
                        order = data->order;
 
@@ -583,48 +583,48 @@ static struct gateway_data *find_default_gateway(void)
        return found;
 }
 
-static gboolean choose_default_gateway(struct gateway_data *data,
+static bool choose_default_gateway(struct gateway_data *data,
                                        struct gateway_data *candidate)
 {
-       gboolean downgraded = FALSE;
+       bool downgraded = false;
 
        /*
         * If the current default is not active, then we mark
         * this one as default. If the other one is already active
         * we mark this one as non default.
         */
-       if (data->ipv4_gateway != NULL) {
-               if (candidate->ipv4_gateway != NULL &&
-                               candidate->ipv4_gateway->active == FALSE) {
+       if (data->ipv4_gateway) {
+               if (candidate->ipv4_gateway &&
+                               !candidate->ipv4_gateway->active) {
                        DBG("ipv4 downgrading %p", candidate);
                        unset_default_gateway(candidate,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
                }
-               if (candidate->ipv4_gateway != NULL &&
-                               candidate->ipv4_gateway->active == TRUE &&
+               if (candidate->ipv4_gateway &&
+                               candidate->ipv4_gateway->active &&
                                candidate->order > data->order) {
                        DBG("ipv4 downgrading this %p", data);
                        unset_default_gateway(data,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
-                       downgraded = TRUE;
+                       downgraded = true;
                }
        }
 
-       if (data->ipv6_gateway != NULL) {
-               if (candidate->ipv6_gateway != NULL &&
-                               candidate->ipv6_gateway->active == FALSE) {
+       if (data->ipv6_gateway) {
+               if (candidate->ipv6_gateway &&
+                               !candidate->ipv6_gateway->active) {
                        DBG("ipv6 downgrading %p", candidate);
                        unset_default_gateway(candidate,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
                }
 
-               if (candidate->ipv6_gateway != NULL &&
-                               candidate->ipv6_gateway->active == TRUE &&
+               if (candidate->ipv6_gateway &&
+                               candidate->ipv6_gateway->active &&
                                candidate->order > data->order) {
                        DBG("ipv6 downgrading this %p", data);
                        unset_default_gateway(data,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
-                       downgraded = TRUE;
+                       downgraded = true;
                }
        }
 
@@ -637,15 +637,15 @@ static void connection_newgateway(int index, const char *gateway)
        struct gateway_data *data;
        GHashTableIter iter;
        gpointer value, key;
-       gboolean found = FALSE;
+       bool found = false;
 
        DBG("index %d gateway %s", index, gateway);
 
        config = find_gateway(index, gateway);
-       if (config == NULL)
+       if (!config)
                return;
 
-       config->active = TRUE;
+       config->active = true;
 
        /*
         * It is possible that we have two default routes atm
@@ -653,10 +653,10 @@ static void connection_newgateway(int index, const char *gateway)
         * same time.
         */
        data = lookup_gateway_data(config);
-       if (data == NULL)
+       if (!data)
                return;
 
-       if (data->default_checked == TRUE)
+       if (data->default_checked)
                return;
 
        /*
@@ -666,26 +666,26 @@ static void connection_newgateway(int index, const char *gateway)
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *candidate = value;
 
                if (candidate == data)
                        continue;
 
                found = choose_default_gateway(data, candidate);
-               if (found == TRUE)
+               if (found)
                        break;
        }
 
-       if (found == FALSE) {
-               if (data->ipv4_gateway != NULL)
+       if (!found) {
+               if (data->ipv4_gateway)
                        set_default_gateway(data, CONNMAN_IPCONFIG_TYPE_IPV4);
 
-               if (data->ipv6_gateway != NULL)
+               if (data->ipv6_gateway)
                        set_default_gateway(data, CONNMAN_IPCONFIG_TYPE_IPV6);
        }
 
-       data->default_checked = TRUE;
+       data->default_checked = true;
 }
 
 static void remove_gateway(gpointer user_data)
@@ -694,14 +694,14 @@ static void remove_gateway(gpointer user_data)
 
        DBG("gateway ipv4 %p ipv6 %p", data->ipv4_gateway, data->ipv6_gateway);
 
-       if (data->ipv4_gateway != NULL) {
+       if (data->ipv4_gateway) {
                g_free(data->ipv4_gateway->gateway);
                g_free(data->ipv4_gateway->vpn_ip);
                g_free(data->ipv4_gateway->vpn_phy_ip);
                g_free(data->ipv4_gateway);
        }
 
-       if (data->ipv6_gateway != NULL) {
+       if (data->ipv6_gateway) {
                g_free(data->ipv6_gateway->gateway);
                g_free(data->ipv6_gateway->vpn_ip);
                g_free(data->ipv6_gateway->vpn_phy_ip);
@@ -719,11 +719,11 @@ static void connection_delgateway(int index, const char *gateway)
        DBG("index %d gateway %s", index, gateway);
 
        config = find_gateway(index, gateway);
-       if (config != NULL)
-               config->active = FALSE;
+       if (config)
+               config->active = false;
 
        data = find_default_gateway();
-       if (data != NULL)
+       if (data)
                set_default_gateway(data, CONNMAN_IPCONFIG_TYPE_ALL);
 }
 
@@ -742,15 +742,15 @@ static struct gateway_data *find_active_gateway(void)
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
-               if (data->ipv4_gateway != NULL &&
-                               data->ipv4_gateway->active == TRUE)
+               if (data->ipv4_gateway &&
+                               data->ipv4_gateway->active)
                        return data;
 
-               if (data->ipv6_gateway != NULL &&
-                               data->ipv6_gateway->active == TRUE)
+               if (data->ipv6_gateway &&
+                               data->ipv6_gateway->active)
                        return data;
        }
 
@@ -766,7 +766,7 @@ static void update_order(void)
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
                data->order = __connman_service_get_order(data->service);
@@ -779,16 +779,16 @@ void __connman_connection_gateway_activate(struct connman_service *service,
        struct gateway_data *data = NULL;
 
        data = g_hash_table_lookup(gateway_hash, service);
-       if (data == NULL)
+       if (!data)
                return;
 
        DBG("gateway %p/%p type %d", data->ipv4_gateway,
                                        data->ipv6_gateway, type);
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-               data->ipv4_gateway->active = TRUE;
+               data->ipv4_gateway->active = true;
        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-               data->ipv6_gateway->active = TRUE;
+               data->ipv6_gateway->active = true;
 }
 
 static void add_host_route(int family, int index, const char *gateway,
@@ -859,17 +859,17 @@ int __connman_connection_gateway_add(struct connman_service *service,
         * gateway for ipv4 is 0.0.0.0 and for ipv6 is ::, meaning the
         * interface
         */
-       if (gateway == NULL && type == CONNMAN_IPCONFIG_TYPE_IPV4)
+       if (!gateway && type == CONNMAN_IPCONFIG_TYPE_IPV4)
                gateway = "0.0.0.0";
 
-       if (gateway == NULL && type == CONNMAN_IPCONFIG_TYPE_IPV6)
+       if (!gateway && type == CONNMAN_IPCONFIG_TYPE_IPV6)
                gateway = "::";
 
        DBG("service %p index %d gateway %s vpn ip %s type %d",
                service, index, gateway, peer, type);
 
        new_gateway = add_gateway(service, index, gateway, type);
-       if (new_gateway == NULL)
+       if (!new_gateway)
                return -EINVAL;
 
        active_gateway = find_active_gateway();
@@ -878,7 +878,7 @@ int __connman_connection_gateway_add(struct connman_service *service,
                active_gateway ? active_gateway->index : -1, new_gateway);
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
-                               new_gateway->ipv4_gateway != NULL) {
+                               new_gateway->ipv4_gateway) {
                add_host_route(AF_INET, index, gateway, service_type);
                __connman_service_nameserver_add_routes(service,
                                        new_gateway->ipv4_gateway->gateway);
@@ -886,7 +886,7 @@ int __connman_connection_gateway_add(struct connman_service *service,
        }
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
-                               new_gateway->ipv6_gateway != NULL) {
+                               new_gateway->ipv6_gateway) {
                add_host_route(AF_INET6, index, gateway, service_type);
                __connman_service_nameserver_add_routes(service,
                                        new_gateway->ipv6_gateway->gateway);
@@ -900,34 +900,32 @@ int __connman_connection_gateway_add(struct connman_service *service,
 
        } else {
                if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
-                                       new_gateway->ipv4_gateway != NULL)
-                       new_gateway->ipv4_gateway->vpn = FALSE;
+                                       new_gateway->ipv4_gateway)
+                       new_gateway->ipv4_gateway->vpn = false;
 
                if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
-                                       new_gateway->ipv6_gateway != NULL)
-                       new_gateway->ipv6_gateway->vpn = FALSE;
+                                       new_gateway->ipv6_gateway)
+                       new_gateway->ipv6_gateway->vpn = false;
        }
 
-       if (active_gateway == NULL) {
+       if (!active_gateway) {
                set_default_gateway(new_gateway, type);
                goto done;
        }
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
-                               new_gateway->ipv4_gateway != NULL &&
-                               new_gateway->ipv4_gateway->vpn == TRUE) {
-               if (__connman_service_is_split_routing(new_gateway->service) ==
-                                                                       FALSE)
+                               new_gateway->ipv4_gateway &&
+                               new_gateway->ipv4_gateway->vpn) {
+               if (!__connman_service_is_split_routing(new_gateway->service))
                        connman_inet_clear_gateway_address(
                                        active_gateway->index,
                                        active_gateway->ipv4_gateway->gateway);
        }
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
-                               new_gateway->ipv6_gateway != NULL &&
-                               new_gateway->ipv6_gateway->vpn == TRUE) {
-               if (__connman_service_is_split_routing(new_gateway->service) ==
-                                                                       FALSE)
+                               new_gateway->ipv6_gateway &&
+                               new_gateway->ipv6_gateway->vpn) {
+               if (!__connman_service_is_split_routing(new_gateway->service))
                        connman_inet_clear_ipv6_gateway_address(
                                        active_gateway->index,
                                        active_gateway->ipv6_gateway->gateway);
@@ -950,29 +948,29 @@ void __connman_connection_gateway_remove(struct connman_service *service,
                                        enum connman_ipconfig_type type)
 {
        struct gateway_data *data = NULL;
-       gboolean set_default4 = FALSE, set_default6 = FALSE;
-       int do_ipv4 = FALSE, do_ipv6 = FALSE;
+       bool set_default4 = false, set_default6 = false;
+        bool do_ipv4 = false, do_ipv6 = false;
        int err;
 
        DBG("service %p type %d", service, type);
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-               do_ipv4 = TRUE;
+               do_ipv4 = true;
        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-               do_ipv6 = TRUE;
+               do_ipv6 = true;
        else
-               do_ipv4 = do_ipv6 = TRUE;
+               do_ipv4 = do_ipv6 = true;
 
        __connman_service_nameserver_del_routes(service, type);
 
        data = g_hash_table_lookup(gateway_hash, service);
-       if (data == NULL)
+       if (!data)
                return;
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL)
+       if (do_ipv4 && data->ipv4_gateway)
                set_default4 = data->ipv4_gateway->vpn;
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL)
+       if (do_ipv6 && data->ipv6_gateway)
                set_default6 = data->ipv6_gateway->vpn;
 
        DBG("ipv4 gateway %s ipv6 gateway %s vpn %d/%d",
@@ -980,14 +978,15 @@ void __connman_connection_gateway_remove(struct connman_service *service,
                data->ipv6_gateway ? data->ipv6_gateway->gateway : "<null>",
                set_default4, set_default6);
 
-       if (do_ipv4 == TRUE && data->ipv4_gateway != NULL &&
-                       data->ipv4_gateway->vpn == TRUE && data->index >= 0)
-               connman_inet_del_host_route(data->index,
+       if (do_ipv4 && data->ipv4_gateway &&
+                       data->ipv4_gateway->vpn && data->index >= 0)
+               connman_inet_del_host_route(data->ipv4_gateway->vpn_phy_index,
                                                data->ipv4_gateway->gateway);
 
-       if (do_ipv6 == TRUE && data->ipv6_gateway != NULL &&
-                       data->ipv6_gateway->vpn == TRUE && data->index >= 0)
-               connman_inet_del_ipv6_host_route(data->index,
+       if (do_ipv6 && data->ipv6_gateway &&
+                       data->ipv6_gateway->vpn && data->index >= 0)
+               connman_inet_del_ipv6_host_route(
+                                       data->ipv6_gateway->vpn_phy_index,
                                                data->ipv6_gateway->gateway);
 
        err = disable_gateway(data, type);
@@ -997,10 +996,10 @@ void __connman_connection_gateway_remove(struct connman_service *service,
         * settings are to be removed.
         */
        if (do_ipv4 == do_ipv6 ||
-               (data->ipv4_gateway != NULL && data->ipv6_gateway == NULL
-                       && do_ipv4 == TRUE) ||
-               (data->ipv6_gateway != NULL && data->ipv4_gateway == NULL
-                       && do_ipv6 == TRUE)
+               (data->ipv4_gateway && !data->ipv6_gateway
+                       && do_ipv4) ||
+               (data->ipv6_gateway && !data->ipv4_gateway
+                       && do_ipv6)
                ) {
                connman_service_unref(service);
                g_hash_table_remove(gateway_hash, service);
@@ -1016,19 +1015,19 @@ void __connman_connection_gateway_remove(struct connman_service *service,
         */
        if (set_default4 || set_default6 || err < 0) {
                data = find_default_gateway();
-               if (data != NULL)
+               if (data)
                        set_default_gateway(data, type);
        }
 }
 
-gboolean __connman_connection_update_gateway(void)
+bool __connman_connection_update_gateway(void)
 {
        struct gateway_data *default_gateway;
-       gboolean updated = FALSE;
+       bool updated = false;
        GHashTableIter iter;
        gpointer value, key;
 
-       if (gateway_hash == NULL)
+       if (!gateway_hash)
                return updated;
 
        update_order();
@@ -1045,30 +1044,30 @@ gboolean __connman_connection_update_gateway(void)
         */
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *active_gateway = value;
 
                if (active_gateway == default_gateway)
                        continue;
 
-               if (active_gateway->ipv4_gateway != NULL &&
-                               active_gateway->ipv4_gateway->active == TRUE) {
+               if (active_gateway->ipv4_gateway &&
+                               active_gateway->ipv4_gateway->active) {
 
                        unset_default_gateway(active_gateway,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
-                       updated = TRUE;
+                       updated = true;
                }
 
-               if (active_gateway->ipv6_gateway != NULL &&
-                               active_gateway->ipv6_gateway->active == TRUE) {
+               if (active_gateway->ipv6_gateway &&
+                               active_gateway->ipv6_gateway->active) {
 
                        unset_default_gateway(active_gateway,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
-                       updated = TRUE;
+                       updated = true;
                }
        }
 
-       if (updated && default_gateway != NULL) {
+       if (updated && default_gateway) {
                if (default_gateway->ipv4_gateway)
                        set_default_gateway(default_gateway,
                                        CONNMAN_IPCONFIG_TYPE_IPV4);
@@ -1088,14 +1087,14 @@ int __connman_connection_get_vpn_index(int phy_index)
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
-               if (data->ipv4_gateway != NULL &&
+               if (data->ipv4_gateway &&
                                data->ipv4_gateway->vpn_phy_index == phy_index)
                        return data->index;
 
-               if (data->ipv6_gateway != NULL &&
+               if (data->ipv6_gateway &&
                                data->ipv6_gateway->vpn_phy_index == phy_index)
                        return data->index;
        }
@@ -1130,7 +1129,7 @@ void __connman_connection_cleanup(void)
 
        g_hash_table_iter_init(&iter, gateway_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct gateway_data *data = value;
 
                disable_gateway(data, CONNMAN_IPCONFIG_TYPE_ALL);
index 75f136f..24db5f8 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -19,6 +19,8 @@
  *
  */
 
+#include <stdbool.h>
+
 #include <glib.h>
 
 #define CONNMAN_API_SUBJECT_TO_CHANGE
@@ -26,7 +28,9 @@
 #include <connman/dbus.h>
 
 dbus_bool_t __connman_dbus_append_objpath_dict_array(DBusMessage *msg,
-               connman_dbus_append_cb_t function, void *user_data);
+                       connman_dbus_append_cb_t function, void *user_data);
+dbus_bool_t __connman_dbus_append_objpath_array(DBusMessage *msg,
+                       connman_dbus_append_cb_t function, void *user_data);
 int __connman_dbus_init(DBusConnection *conn);
 void __connman_dbus_cleanup(void);
 
@@ -51,8 +55,6 @@ DBusMessage *__connman_error_operation_timeout(DBusMessage *msg);
 DBusMessage *__connman_error_invalid_service(DBusMessage *msg);
 DBusMessage *__connman_error_invalid_property(DBusMessage *msg);
 
-#include <connman/types.h>
-
 int __connman_manager_init(void);
 void __connman_manager_cleanup(void);
 
@@ -93,16 +95,17 @@ void __connman_agent_cancel(struct connman_service *service);
 int __connman_service_add_passphrase(struct connman_service *service,
                                        const gchar *passphrase);
 typedef void (* authentication_cb_t) (struct connman_service *service,
-                               connman_bool_t values_received,
+                               bool values_received,
                                const char *name, int name_len,
                                const char *identifier, const char *secret,
-                               gboolean wps, const char *wpspin,
+                               bool wps, const char *wpspin,
                                const char *error, void *user_data);
 typedef void (* browser_authentication_cb_t) (struct connman_service *service,
-                               connman_bool_t authentication_done,
+                               bool authentication_done,
                                const char *error, void *user_data);
 int __connman_agent_request_passphrase_input(struct connman_service *service,
-                               authentication_cb_t callback, void *user_data);
+                               authentication_cb_t callback,
+                               const char *dbus_sender, void *user_data);
 int __connman_agent_request_login_input(struct connman_service *service,
                                authentication_cb_t callback, void *user_data);
 int __connman_agent_request_browser(struct connman_service *service,
@@ -112,9 +115,9 @@ int __connman_agent_request_browser(struct connman_service *service,
 #include <connman/log.h>
 
 int __connman_log_init(const char *program, const char *debug,
-               connman_bool_t detach, connman_bool_t backtrace,
+               gboolean detach, gboolean backtrace,
                const char *program_name, const char *program_version);
-void __connman_log_cleanup(connman_bool_t backtrace);
+void __connman_log_cleanup(gboolean backtrace);
 void __connman_log_enable(struct connman_debug_desc *start,
                                        struct connman_debug_desc *stop);
 
@@ -141,6 +144,7 @@ int __connman_inet_modify_address(int cmd, int flags, int index, int family,
                                unsigned char prefixlen,
                                const char *broadcast);
 int __connman_inet_get_interface_address(int index, int family, void *address);
+int __connman_inet_get_interface_ll_address(int index, int family, void *address);
 
 #include <netinet/ip6.h>
 #include <netinet/icmp6.h>
@@ -150,8 +154,25 @@ typedef void (*__connman_inet_rs_cb_t) (struct nd_router_advert *reply,
 
 int __connman_inet_ipv6_send_rs(int index, int timeout,
                        __connman_inet_rs_cb_t callback, void *user_data);
+int __connman_inet_ipv6_send_ra(int index, struct in6_addr *src_addr,
+                               GSList *prefixes, int router_lifetime);
 
-int __connman_refresh_rs_ipv6(struct connman_network *network, int index);
+typedef void (*__connman_inet_ns_cb_t) (struct nd_neighbor_advert *reply,
+                                       unsigned int length,
+                                       struct in6_addr *addr,
+                                       void *user_data);
+int __connman_inet_ipv6_do_dad(int index, int timeout_ms,
+                       struct in6_addr *addr,
+                       __connman_inet_ns_cb_t callback, void *user_data);
+
+typedef void (*__connman_inet_recv_rs_cb_t) (struct nd_router_solicit *reply,
+                                       unsigned int length, void *user_data);
+int __connman_inet_ipv6_start_recv_rs(int index,
+                               __connman_inet_recv_rs_cb_t callback,
+                               void *user_data, void **context);
+void __connman_inet_ipv6_stop_recv_rs(void *context);
+
+int __connman_network_refresh_rs_ipv6(struct connman_network *network, int index);
 
 GSList *__connman_inet_ipv6_get_prefixes(struct nd_router_advert *hdr,
                                        unsigned int length);
@@ -200,9 +221,16 @@ int __connman_inet_rtnl_addattr_l(struct nlmsghdr *n, size_t max_length,
 int __connman_inet_rtnl_addattr32(struct nlmsghdr *n, size_t maxlen,
                        int type, __u32 data);
 
+int __connman_inet_add_fwmark_rule(uint32_t table_id, int family, uint32_t fwmark);
+int __connman_inet_del_fwmark_rule(uint32_t table_id, int family, uint32_t fwmark);
+int __connman_inet_add_default_to_table(uint32_t table_id, int ifindex, const char *gateway);
+int __connman_inet_del_default_from_table(uint32_t table_id, int ifindex, const char *gateway);
+int __connman_inet_get_address_netmask(int ifindex,
+               struct sockaddr_in *address, struct sockaddr_in *netmask);
+
 #include <connman/resolver.h>
 
-int __connman_resolver_init(connman_bool_t dnsproxy);
+int __connman_resolver_init(gboolean dnsproxy);
 void __connman_resolver_cleanup(void);
 int __connman_resolvfile_append(int index, const char *domain, const char *server);
 int __connman_resolvfile_remove(int index, const char *domain, const char *server);
@@ -220,9 +248,9 @@ GKeyFile *__connman_storage_open_service(const char *ident);
 int __connman_storage_save_service(GKeyFile *keyfile, const char *ident);
 GKeyFile *__connman_storage_load_provider(const char *identifier);
 void __connman_storage_save_provider(GKeyFile *keyfile, const char *identifier);
-gboolean __connman_storage_remove_provider(const char *identifier);
+bool __connman_storage_remove_provider(const char *identifier);
 char **__connman_storage_get_providers(void);
-gboolean __connman_storage_remove_service(const char *service_id);
+bool __connman_storage_remove_service(const char *service_id);
 
 int __connman_detect_init(void);
 void __connman_detect_cleanup(void);
@@ -249,14 +277,14 @@ struct connman_ipaddress {
 };
 
 struct connman_ipconfig_ops {
-       void (*up) (struct connman_ipconfig *ipconfig);
-       void (*down) (struct connman_ipconfig *ipconfig);
-       void (*lower_up) (struct connman_ipconfig *ipconfig);
-       void (*lower_down) (struct connman_ipconfig *ipconfig);
-       void (*ip_bound) (struct connman_ipconfig *ipconfig);
-       void (*ip_release) (struct connman_ipconfig *ipconfig);
-       void (*route_set) (struct connman_ipconfig *ipconfig);
-       void (*route_unset) (struct connman_ipconfig *ipconfig);
+       void (*up) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*down) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*lower_up) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*lower_down) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*ip_bound) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*ip_release) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*route_set) (struct connman_ipconfig *ipconfig, const char *ifname);
+       void (*route_unset) (struct connman_ipconfig *ipconfig, const char *ifname);
 };
 
 struct connman_ipconfig *__connman_ipconfig_create(int index,
@@ -278,7 +306,6 @@ void *__connman_ipconfig_get_data(struct connman_ipconfig *ipconfig);
 void __connman_ipconfig_set_data(struct connman_ipconfig *ipconfig, void *data);
 
 int __connman_ipconfig_get_index(struct connman_ipconfig *ipconfig);
-const char *__connman_ipconfig_get_ifname(struct connman_ipconfig *ipconfig);
 
 void __connman_ipconfig_set_ops(struct connman_ipconfig *ipconfig,
                                const struct connman_ipconfig_ops *ops);
@@ -329,7 +356,7 @@ void __connman_ipconfig_set_prefixlen(struct connman_ipconfig *ipconfig, unsigne
 
 int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig);
 int __connman_ipconfig_disable(struct connman_ipconfig *ipconfig);
-connman_bool_t __connman_ipconfig_is_usable(struct connman_ipconfig *ipconfig);
+bool __connman_ipconfig_is_usable(struct connman_ipconfig *ipconfig);
 
 const char *__connman_ipconfig_method2string(enum connman_ipconfig_method method);
 const char *__connman_ipconfig_type2string(enum connman_ipconfig_type type);
@@ -364,14 +391,18 @@ const char *__connman_ipconfig_get_proxy_autoconfig(struct connman_ipconfig *ipc
 void __connman_ipconfig_set_dhcp_address(struct connman_ipconfig *ipconfig,
                                        const char *address);
 char *__connman_ipconfig_get_dhcp_address(struct connman_ipconfig *ipconfig);
+void __connman_ipconfig_set_dhcpv6_prefixes(struct connman_ipconfig *ipconfig,
+                                       char **prefixes);
+char **__connman_ipconfig_get_dhcpv6_prefixes(struct connman_ipconfig *ipconfig);
 
 int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
                GKeyFile *keyfile, const char *identifier, const char *prefix);
 int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
                GKeyFile *keyfile, const char *identifier, const char *prefix);
-gboolean __connman_ipconfig_ipv6_privacy_enabled(struct connman_ipconfig *ipconfig);
+bool __connman_ipconfig_ipv6_privacy_enabled(struct connman_ipconfig *ipconfig);
 int __connman_ipconfig_ipv6_set_privacy(struct connman_ipconfig *ipconfig,
                                        const char *value);
+bool __connman_ipconfig_ipv6_is_enabled(struct connman_ipconfig *ipconfig);
 
 int __connman_ipconfig_set_rp_filter();
 void __connman_ipconfig_unset_rp_filter(int old_value);
@@ -394,8 +425,17 @@ GSList *__connman_timeserver_get_all(struct connman_service *service);
 int __connman_timeserver_sync(struct connman_service *service);
 void __connman_timeserver_sync_next();
 
+enum __connman_dhcpv6_status {
+       CONNMAN_DHCPV6_STATUS_FAIL     = 0,
+       CONNMAN_DHCPV6_STATUS_SUCCEED  = 1,
+       CONNMAN_DHCPV6_STATUS_RESTART  = 2,
+};
+
+typedef void (* dhcpv6_cb) (struct connman_network *network,
+                       enum __connman_dhcpv6_status status, gpointer data);
+
 typedef void (* dhcp_cb) (struct connman_network *network,
-                               connman_bool_t success);
+                       bool success, gpointer data);
 int __connman_dhcp_start(struct connman_network *network, dhcp_cb callback);
 void __connman_dhcp_stop(struct connman_network *network);
 int __connman_dhcp_init(void);
@@ -403,14 +443,20 @@ void __connman_dhcp_cleanup(void);
 int __connman_dhcpv6_init(void);
 void __connman_dhcpv6_cleanup(void);
 int __connman_dhcpv6_start_info(struct connman_network *network,
-                               dhcp_cb callback);
+                               dhcpv6_cb callback);
 void __connman_dhcpv6_stop(struct connman_network *network);
 int __connman_dhcpv6_start(struct connman_network *network,
-                               GSList *prefixes, dhcp_cb callback);
+                               GSList *prefixes, dhcpv6_cb callback);
 int __connman_dhcpv6_start_renew(struct connman_network *network,
-                               dhcp_cb callback);
+                               dhcpv6_cb callback);
 int __connman_dhcpv6_start_release(struct connman_network *network,
-                               dhcp_cb callback);
+                               dhcpv6_cb callback);
+int __connman_dhcpv6_start_pd(int index, GSList *prefixes, dhcpv6_cb callback);
+void __connman_dhcpv6_stop_pd(int index);
+int __connman_dhcpv6_start_pd_renew(struct connman_network *network,
+                                                       dhcpv6_cb callback);
+int __connman_dhcpv6_start_pd_release(struct connman_network *network,
+                               dhcpv6_cb callback);
 
 int __connman_ipv4_init(void);
 void __connman_ipv4_cleanup(void);
@@ -426,7 +472,7 @@ void __connman_connection_gateway_remove(struct connman_service *service,
                                        enum connman_ipconfig_type type);
 int __connman_connection_get_vpn_index(int phy_index);
 
-gboolean __connman_connection_update_gateway(void);
+bool __connman_connection_update_gateway(void);
 void __connman_connection_gateway_activate(struct connman_service *service,
                                        enum connman_ipconfig_type type);
 
@@ -452,28 +498,29 @@ int __connman_technology_add_device(struct connman_device *device);
 int __connman_technology_remove_device(struct connman_device *device);
 int __connman_technology_enabled(enum connman_service_type type);
 int __connman_technology_disabled(enum connman_service_type type);
-int __connman_technology_set_offlinemode(connman_bool_t offlinemode);
-connman_bool_t __connman_technology_get_offlinemode(void);
+int __connman_technology_set_offlinemode(bool offlinemode);
+bool __connman_technology_get_offlinemode(void);
 void __connman_technology_set_connected(enum connman_service_type type,
-                                       connman_bool_t connected);
+                                       bool connected);
 
 int __connman_technology_add_rfkill(unsigned int index,
                                        enum connman_service_type type,
-                                               connman_bool_t softblock,
-                                               connman_bool_t hardblock);
+                                               bool softblock,
+                                               bool hardblock);
 int __connman_technology_update_rfkill(unsigned int index,
                                        enum connman_service_type type,
-                                               connman_bool_t softblock,
-                                               connman_bool_t hardblock);
+                                               bool softblock,
+                                               bool hardblock);
 int __connman_technology_remove_rfkill(unsigned int index,
                                        enum connman_service_type type);
 
 void __connman_technology_scan_started(struct connman_device *device);
-void __connman_technology_scan_stopped(struct connman_device *device);
+void __connman_technology_scan_stopped(struct connman_device *device,
+                                       enum connman_service_type type);
 void __connman_technology_add_interface(enum connman_service_type type,
-                               int index, const char *name, const char *ident);
+                               int index, const char *ident);
 void __connman_technology_remove_interface(enum connman_service_type type,
-                               int index, const char *name, const char *ident);
+                               int index, const char *ident);
 void __connman_technology_notify_regdom_by_device(struct connman_device *device,
                                                int result, const char *alpha2);
 
@@ -490,9 +537,9 @@ int __connman_device_request_scan(enum connman_service_type type);
 int __connman_device_request_hidden_scan(struct connman_device *device,
                                const char *ssid, unsigned int ssid_len,
                                const char *identity, const char *passphrase,
-                               gpointer user_data);
+                               const char *security, void *user_data);
 
-connman_bool_t __connman_device_isfiltered(const char *devname);
+bool __connman_device_isfiltered(const char *devname);
 
 void __connman_device_set_network(struct connman_device *device,
                                        struct connman_network *network);
@@ -502,17 +549,13 @@ int __connman_device_enable(struct connman_device *device);
 int __connman_device_disable(struct connman_device *device);
 int __connman_device_disconnect(struct connman_device *device);
 
-connman_bool_t __connman_device_has_driver(struct connman_device *device);
-
-void __connman_device_set_reconnect(struct connman_device *device,
-                                               connman_bool_t reconnect);
-connman_bool_t __connman_device_get_reconnect(struct connman_device *device);
+bool __connman_device_has_driver(struct connman_device *device);
 
 const char *__connman_device_get_type(struct connman_device *device);
 
 int __connman_rfkill_init(void);
 void __connman_rfkill_cleanup(void);
-int __connman_rfkill_block(enum connman_service_type type, connman_bool_t block);
+int __connman_rfkill_block(enum connman_service_type type, bool block);
 
 #include <connman/network.h>
 
@@ -533,16 +576,28 @@ int __connman_network_set_ipconfig(struct connman_network *network,
 const char *__connman_network_get_type(struct connman_network *network);
 const char *__connman_network_get_group(struct connman_network *network);
 const char *__connman_network_get_ident(struct connman_network *network);
-connman_bool_t __connman_network_get_weakness(struct connman_network *network);
+bool __connman_network_get_weakness(struct connman_network *network);
 
 int __connman_config_init();
 void __connman_config_cleanup(void);
 
-int __connman_config_load_service(GKeyFile *keyfile, const char *group, connman_bool_t persistent);
+int __connman_config_load_service(GKeyFile *keyfile, const char *group,
+                                 bool persistent);
 int __connman_config_provision_service(struct connman_service *service);
 int __connman_config_provision_service_ident(struct connman_service *service,
                const char *ident, const char *file, const char *entry);
 
+char *__connman_config_get_string(GKeyFile *key_file,
+       const char *group_name, const char *key, GError **error);
+
+char **__connman_config_get_string_list(GKeyFile *key_file,
+       const char *group_name, const char *key, gsize *length, GError **error);
+
+bool __connman_config_get_bool(GKeyFile *key_file,
+       const char *group_name, const char *key, GError **error);
+bool __connman_config_address_provisioned(const char *address,
+                                       const char *netmask);
+
 int __connman_tethering_init(void);
 void __connman_tethering_cleanup(void);
 
@@ -553,13 +608,17 @@ void __connman_tethering_set_disabled(void);
 int __connman_private_network_request(DBusMessage *msg, const char *owner);
 int __connman_private_network_release(const char *path);
 
+int __connman_ipv6pd_setup(const char *bridge);
+void __connman_ipv6pd_cleanup(void);
+
 #include <connman/provider.h>
 
-connman_bool_t __connman_provider_check_routes(struct connman_provider *provider);
+bool __connman_provider_check_routes(struct connman_provider *provider);
 int __connman_provider_append_user_route(struct connman_provider *provider,
                        int family, const char *network, const char *netmask);
 void __connman_provider_append_properties(struct connman_provider *provider, DBusMessageIter *iter);
 void __connman_provider_list(DBusMessageIter *iter, void *user_data);
+bool __connman_provider_is_immutable(struct connman_provider *provider);
 int __connman_provider_create_and_connect(DBusMessage *msg);
 const char * __connman_provider_get_ident(struct connman_provider *provider);
 int __connman_provider_indicate_state(struct connman_provider *provider,
@@ -575,6 +634,7 @@ int __connman_provider_init(void);
 
 int __connman_service_init(void);
 void __connman_service_cleanup(void);
+int __connman_service_load_modifiable(struct connman_service *service);
 
 void __connman_service_list_struct(DBusMessageIter *iter);
 
@@ -582,6 +642,7 @@ struct connman_service *__connman_service_lookup_from_index(int index);
 struct connman_service *__connman_service_lookup_from_ident(const char *identifier);
 struct connman_service *__connman_service_create_from_network(struct connman_network *network);
 struct connman_service *__connman_service_create_from_provider(struct connman_provider *provider);
+bool __connman_service_index_is_default(int index);
 struct connman_service *__connman_service_get_default(void);
 void __connman_service_update_from_network(struct connman_network *network);
 void __connman_service_remove_from_network(struct connman_network *network);
@@ -594,29 +655,31 @@ struct connman_ipconfig *__connman_service_get_ip6config(
                                struct connman_service *service);
 struct connman_ipconfig *__connman_service_get_ipconfig(
                                struct connman_service *service, int family);
-connman_bool_t __connman_service_is_connected_state(struct connman_service *service,
+bool __connman_service_is_connected_state(struct connman_service *service,
                                        enum connman_ipconfig_type type);
 const char *__connman_service_get_ident(struct connman_service *service);
 const char *__connman_service_get_path(struct connman_service *service);
+const char *__connman_service_get_name(struct connman_service *service);
 unsigned int __connman_service_get_order(struct connman_service *service);
+enum connman_service_state __connman_service_get_state(struct connman_service *service);
 void __connman_service_update_ordering(void);
 struct connman_network *__connman_service_get_network(struct connman_service *service);
 enum connman_service_security __connman_service_get_security(struct connman_service *service);
 const char *__connman_service_get_phase2(struct connman_service *service);
-connman_bool_t __connman_service_wps_enabled(struct connman_service *service);
+bool __connman_service_wps_enabled(struct connman_service *service);
 int __connman_service_set_favorite(struct connman_service *service,
-                                               connman_bool_t favorite);
+                                               bool favorite);
 int __connman_service_set_favorite_delayed(struct connman_service *service,
-                                       connman_bool_t favorite,
-                                       gboolean delay_ordering);
+                                       bool favorite,
+                                       bool delay_ordering);
 int __connman_service_set_immutable(struct connman_service *service,
-                                               connman_bool_t immutable);
+                                               bool immutable);
 int __connman_service_set_ignore(struct connman_service *service,
-                                               connman_bool_t ignore);
-void __connman_service_set_userconnect(struct connman_service *service,
-                                               connman_bool_t userconnect);
+                                               bool ignore);
 void __connman_service_set_search_domains(struct connman_service *service,
                                        char **domains);
+void __connman_service_update_search_domains(struct connman_service *service,
+                                       char **domains);
 
 void __connman_service_set_string(struct connman_service *service,
                                        const char *key, const char *value);
@@ -634,12 +697,14 @@ int __connman_service_indicate_error(struct connman_service *service,
 int __connman_service_clear_error(struct connman_service *service);
 int __connman_service_indicate_default(struct connman_service *service);
 
-int __connman_service_connect(struct connman_service *service);
+int __connman_service_connect(struct connman_service *service,
+                       enum connman_service_connect_reason reason);
 int __connman_service_disconnect(struct connman_service *service);
 int __connman_service_disconnect_all(void);
-void __connman_service_auto_connect(void);
-gboolean __connman_service_remove(struct connman_service *service);
-connman_bool_t __connman_service_is_provider_pending(struct connman_service *service);
+void __connman_service_set_active_session(bool enable, GSList *list);
+void __connman_service_auto_connect(enum connman_service_connect_reason reason);
+bool __connman_service_remove(struct connman_service *service);
+bool __connman_service_is_provider_pending(struct connman_service *service);
 void __connman_service_set_provider_pending(struct connman_service *service,
                                                        DBusMessage *msg);
 void __connman_service_set_hidden_data(struct connman_service *service,
@@ -657,9 +722,9 @@ const char *__connman_service_type2string(enum connman_service_type type);
 enum connman_service_type __connman_service_string2type(const char *str);
 
 int __connman_service_nameserver_append(struct connman_service *service,
-                               const char *nameserver, gboolean is_auto);
+                               const char *nameserver, bool is_auto);
 int __connman_service_nameserver_remove(struct connman_service *service,
-                               const char *nameserver, gboolean is_auto);
+                               const char *nameserver, bool is_auto);
 void __connman_service_nameserver_clear(struct connman_service *service);
 void __connman_service_nameserver_add_routes(struct connman_service *service,
                                                const char *gw);
@@ -675,13 +740,16 @@ void __connman_service_timeserver_changed(struct connman_service *service,
                GSList *ts_list);
 void __connman_service_set_pac(struct connman_service *service,
                                        const char *pac);
-connman_bool_t __connman_service_is_hidden(struct connman_service *service);
-connman_bool_t __connman_service_is_split_routing(struct connman_service *service);
+bool __connman_service_is_hidden(struct connman_service *service);
+bool __connman_service_is_split_routing(struct connman_service *service);
+bool __connman_service_index_is_split_routing(int index);
 int __connman_service_get_index(struct connman_service *service);
 void __connman_service_set_hidden(struct connman_service *service);
+void __connman_service_set_hostname(struct connman_service *service,
+                                               const char *hostname);
+const char *__connman_service_get_hostname(struct connman_service *service);
 void __connman_service_set_domainname(struct connman_service *service,
                                                const char *domainname);
-const char *__connman_service_get_domainname(struct connman_service *service);
 const char *__connman_service_get_nameserver(struct connman_service *service);
 void __connman_service_set_proxy_autoconfig(struct connman_service *service,
                                                        const char *url);
@@ -693,8 +761,6 @@ void __connman_service_set_agent_identity(struct connman_service *service,
 int __connman_service_set_passphrase(struct connman_service *service,
                                        const char *passphrase);
 const char *__connman_service_get_passphrase(struct connman_service *service);
-void __connman_service_set_agent_passphrase(struct connman_service *service,
-                                               const char *agent_passphrase);
 int __connman_service_reset_ipconfig(struct connman_service *service,
                enum connman_ipconfig_type type, DBusMessageIter *array,
                enum connman_service_state *new_state);
@@ -708,17 +774,20 @@ void __connman_service_notify(struct connman_service *service,
 int __connman_service_counter_register(const char *counter);
 void __connman_service_counter_unregister(const char *counter);
 
+#include <connman/peer.h>
+
+int __connman_peer_init(void);
+void __connman_peer_cleanup(void);
+
+void __connman_peer_list_struct(DBusMessageIter *array);
+
 #include <connman/session.h>
 
 typedef void (* service_iterate_cb) (struct connman_service *service,
-                                       const char *name,
-                                       enum connman_service_state state,
                                        void *user_data);
 
 int __connman_service_iterate_services(service_iterate_cb cb, void *user_data);
 
-void __connman_service_session_inc(struct connman_service *service);
-connman_bool_t __connman_service_session_dec(struct connman_service *service);
 void __connman_service_mark_dirty();
 void __connman_service_save(struct connman_service *service);
 
@@ -737,7 +806,7 @@ void __connman_notifier_enter_online(enum connman_service_type type);
 void __connman_notifier_leave_online(enum connman_service_type type);
 void __connman_notifier_connect(enum connman_service_type type);
 void __connman_notifier_disconnect(enum connman_service_type type);
-void __connman_notifier_offlinemode(connman_bool_t enabled);
+void __connman_notifier_offlinemode(bool enabled);
 void __connman_notifier_default_changed(struct connman_service *service);
 void __connman_notifier_proxy_changed(struct connman_service *service);
 void __connman_notifier_service_state_changed(struct connman_service *service,
@@ -745,7 +814,7 @@ void __connman_notifier_service_state_changed(struct connman_service *service,
 void __connman_notifier_ipconfig_changed(struct connman_service *service,
                                        struct connman_ipconfig *ipconfig);
 
-connman_bool_t __connman_notifier_is_connected(void);
+bool __connman_notifier_is_connected(void);
 const char *__connman_notifier_get_state(void);
 
 #include <connman/rtnl.h>
@@ -760,8 +829,7 @@ unsigned int __connman_rtnl_update_interval_remove(unsigned int interval);
 int __connman_rtnl_request_update(void);
 int __connman_rtnl_send(const void *buf, size_t len);
 
-connman_bool_t __connman_session_mode();
-void __connman_session_set_mode(connman_bool_t enable);
+bool __connman_session_policy_autoconnect(enum connman_service_connect_reason reason);
 
 int __connman_session_create(DBusMessage *msg);
 int __connman_session_destroy(DBusMessage *msg);
@@ -786,10 +854,10 @@ void __connman_stats_cleanup(void);
 int __connman_stats_service_register(struct connman_service *service);
 void __connman_stats_service_unregister(struct connman_service *service);
 int  __connman_stats_update(struct connman_service *service,
-                               connman_bool_t roaming,
+                               bool roaming,
                                struct connman_stats_data *data);
 int __connman_stats_get(struct connman_service *service,
-                               connman_bool_t roaming,
+                               bool roaming,
                                struct connman_stats_data *data);
 
 int __connman_iptables_dump(const char *table_name);
@@ -871,8 +939,8 @@ void __connman_ippool_deladdr(int index, const char *address,
 
 int __connman_bridge_create(const char *name);
 int __connman_bridge_remove(const char *name);
-int __connman_bridge_enable(const char *name, const char *gateway,
-                               const char *broadcast);
+int __connman_bridge_enable(const char *name, const char *ip_address,
+                       int prefix_len, const char *broadcast);
 int __connman_bridge_disable(const char *name);
 
 int __connman_nat_init(void);
@@ -892,6 +960,39 @@ int __connman_firewall_add_rule(struct firewall_context *ctx,
                                const char *rule_fmt, ...);
 int __connman_firewall_enable(struct firewall_context *ctx);
 int __connman_firewall_disable(struct firewall_context *ctx);
+bool __connman_firewall_is_up(void);
 
 int __connman_firewall_init(void);
 void __connman_firewall_cleanup(void);
+
+typedef int (* connman_nfacct_flush_cb_t) (unsigned int error, void *user_data);
+
+int __connman_nfacct_flush(connman_nfacct_flush_cb_t cb, void *user_data);
+
+struct nfacct_context;
+
+typedef void (* connman_nfacct_enable_cb_t) (unsigned int error,
+                                               struct nfacct_context *ctx,
+                                               void *user_data);
+typedef void (* connman_nfacct_disable_cb_t) (unsigned int error,
+                                               struct nfacct_context *ctx,
+                                               void *user_data);
+typedef void (* connman_nfacct_stats_cb_t) (struct nfacct_context *ctx,
+                                               uint64_t packets,
+                                               uint64_t bytes,
+                                               void *user_data);
+
+struct nfacct_context *__connman_nfacct_create_context(void);
+void __connman_nfacct_destroy_context(struct nfacct_context *ctx);
+
+int __connman_nfacct_add(struct nfacct_context *ctx, const char *name,
+                               connman_nfacct_stats_cb_t cb,
+                               void *user_data);
+int __connman_nfacct_enable(struct nfacct_context *ctx,
+                               connman_nfacct_enable_cb_t cb,
+                               void *user_data);
+int __connman_nfacct_disable(struct nfacct_context *ctx,
+                               connman_nfacct_disable_cb_t cb,
+                               void *user_data);
+
+void __connman_nfacct_cleanup(void);
index 2e9e4d5..7b6195e 100644 (file)
@@ -1,6 +1,8 @@
 [Unit]
 Description=Connection service
-After=syslog.target
+Requires=dbus.socket
+After=dbus.socket
+Before=remote-fs.target
 
 [Service]
 Type=dbus
index 76d91d4..06e5daf 100644 (file)
@@ -75,11 +75,11 @@ int __connman_counter_register(const char *owner, const char *path,
        DBG("owner %s path %s interval %u", owner, path, interval);
 
        counter = g_hash_table_lookup(counter_table, path);
-       if (counter != NULL)
+       if (counter)
                return -EEXIST;
 
        counter = g_try_new0(struct connman_counter, 1);
-       if (counter == NULL)
+       if (!counter)
                return -ENOMEM;
 
        counter->owner = g_strdup(owner);
@@ -112,7 +112,7 @@ int __connman_counter_unregister(const char *owner, const char *path)
        DBG("owner %s path %s", owner, path);
 
        counter = g_hash_table_lookup(counter_table, path);
-       if (counter == NULL)
+       if (!counter)
                return -ESRCH;
 
        if (g_strcmp0(owner, counter->owner) != 0)
@@ -133,7 +133,7 @@ void __connman_counter_send_usage(const char *path,
        struct connman_counter *counter;
 
        counter = g_hash_table_lookup(counter_table, path);
-       if (counter == NULL)
+       if (!counter)
                return;
 
        dbus_message_set_destination(message, counter->owner);
@@ -157,7 +157,7 @@ static void release_counter(gpointer key, gpointer value, gpointer user_data)
 
        message = dbus_message_new_method_call(counter->owner, counter->path,
                                        CONNMAN_COUNTER_INTERFACE, "Release");
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_no_reply(message, TRUE);
@@ -170,7 +170,7 @@ int __connman_counter_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        counter_table = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -185,7 +185,7 @@ void __connman_counter_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        g_hash_table_foreach(counter_table, release_counter, NULL);
index 5cc6106..4fa0b36 100644 (file)
@@ -33,7 +33,7 @@ dbus_bool_t connman_dbus_validate_ident(const char *ident)
 {
        unsigned int i;
 
-       if (ident == NULL)
+       if (!ident)
                return FALSE;
 
        for (i = 0; i < strlen(ident); i++) {
@@ -54,13 +54,13 @@ char *connman_dbus_encode_string(const char *value)
        GString *str;
        unsigned int i, size;
 
-       if (value == NULL)
+       if (!value)
                return NULL;
 
        size = strlen(value);
 
        str = g_string_new(NULL);
-       if (str == NULL)
+       if (!str)
                return NULL;
 
        for (i = 0; i < size; i++) {
@@ -183,11 +183,13 @@ void connman_dbus_property_append_array(DBusMessageIter *iter,
 
        switch (type) {
        case DBUS_TYPE_STRING:
-               variant_sig = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING;
+               variant_sig = DBUS_TYPE_ARRAY_AS_STRING
+                               DBUS_TYPE_STRING_AS_STRING;
                array_sig = DBUS_TYPE_STRING_AS_STRING;
                break;
        case DBUS_TYPE_OBJECT_PATH:
-               variant_sig = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING;
+               variant_sig = DBUS_TYPE_ARRAY_AS_STRING
+                               DBUS_TYPE_OBJECT_PATH_AS_STRING;
                array_sig = DBUS_TYPE_OBJECT_PATH_AS_STRING;
                break;
        case DBUS_TYPE_DICT_ENTRY:
@@ -234,11 +236,11 @@ dbus_bool_t connman_dbus_property_changed_basic(const char *path,
        DBusMessage *signal;
        DBusMessageIter iter;
 
-       if (path == NULL)
+       if (!path)
                return FALSE;
 
        signal = dbus_message_new_signal(path, interface, "PropertyChanged");
-       if (signal == NULL)
+       if (!signal)
                return FALSE;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -256,11 +258,11 @@ dbus_bool_t connman_dbus_property_changed_dict(const char *path,
        DBusMessage *signal;
        DBusMessageIter iter;
 
-       if (path == NULL)
+       if (!path)
                return FALSE;
 
        signal = dbus_message_new_signal(path, interface, "PropertyChanged");
-       if (signal == NULL)
+       if (!signal)
                return FALSE;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -278,11 +280,11 @@ dbus_bool_t connman_dbus_property_changed_array(const char *path,
        DBusMessage *signal;
        DBusMessageIter iter;
 
-       if (path == NULL)
+       if (!path)
                return FALSE;
 
        signal = dbus_message_new_signal(path, interface, "PropertyChanged");
-       if (signal == NULL)
+       if (!signal)
                return FALSE;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -301,13 +303,13 @@ dbus_bool_t connman_dbus_setting_changed_basic(const char *owner,
        DBusMessage *msg;
        DBusMessageIter array, dict;
 
-       if (owner == NULL || path == NULL)
+       if (!owner || !path)
                return FALSE;
 
        msg = dbus_message_new_method_call(owner, path,
                                                CONNMAN_NOTIFICATION_INTERFACE,
                                                "Update");
-       if (msg == NULL)
+       if (!msg)
                return FALSE;
 
        dbus_message_iter_init_append(msg, &array);
@@ -330,13 +332,13 @@ dbus_bool_t connman_dbus_setting_changed_dict(const char *owner,
        DBusMessage *msg;
        DBusMessageIter array, dict;
 
-       if (owner == NULL || path == NULL)
+       if (!owner || !path)
                return FALSE;
 
        msg = dbus_message_new_method_call(owner, path,
                                                CONNMAN_NOTIFICATION_INTERFACE,
                                                "Update");
-       if (msg == NULL)
+       if (!msg)
                return FALSE;
 
        dbus_message_iter_init_append(msg, &array);
@@ -359,13 +361,13 @@ dbus_bool_t connman_dbus_setting_changed_array(const char *owner,
        DBusMessage *msg;
        DBusMessageIter array, dict;
 
-       if (owner == NULL || path == NULL)
+       if (!owner || !path)
                return FALSE;
 
        msg = dbus_message_new_method_call(owner, path,
                                                CONNMAN_NOTIFICATION_INTERFACE,
                                                "Update");
-       if (msg == NULL)
+       if (!msg)
                return FALSE;
 
        dbus_message_iter_init_append(msg, &array);
@@ -385,7 +387,7 @@ dbus_bool_t __connman_dbus_append_objpath_dict_array(DBusMessage *msg,
 {
        DBusMessageIter iter, array;
 
-       if (msg == NULL || function == NULL)
+       if (!msg || !function)
                return FALSE;
 
        dbus_message_iter_init_append(msg, &iter);
@@ -406,6 +408,25 @@ dbus_bool_t __connman_dbus_append_objpath_dict_array(DBusMessage *msg,
        return TRUE;
 }
 
+dbus_bool_t __connman_dbus_append_objpath_array(DBusMessage *msg,
+                       connman_dbus_append_cb_t function, void *user_data)
+{
+       DBusMessageIter iter, array;
+
+       if (!msg || !function)
+               return FALSE;
+
+       dbus_message_iter_init_append(msg, &iter);
+       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+                               DBUS_TYPE_OBJECT_PATH_AS_STRING, &array);
+
+       function(&array, user_data);
+
+       dbus_message_iter_close_container(&iter, &array);
+
+       return TRUE;
+}
+
 struct callback_data {
        void *cb;
        void *user_data;
@@ -419,7 +440,7 @@ static void get_connection_unix_user_reply(DBusPendingCall *call,
        DBusMessageIter iter;
        DBusMessage *reply;
        int err = 0;
-       unsigned int uid;
+       unsigned int uid = 0;
 
        reply = dbus_pending_call_steal_reply(call);
 
@@ -429,7 +450,7 @@ static void get_connection_unix_user_reply(DBusPendingCall *call,
                goto done;
        }
 
-       if (dbus_message_has_signature(reply, "u") == FALSE) {
+       if (!dbus_message_has_signature(reply, "u")) {
                DBG("Message signature is wrong");
                err = -EINVAL;
                goto done;
@@ -457,7 +478,7 @@ int connman_dbus_get_connection_unix_user(DBusConnection *connection,
        int err;
 
        data = g_try_new0(struct callback_data, 1);
-       if (data == NULL) {
+       if (!data) {
                DBG("Can't allocate data structure");
                return -ENOMEM;
        }
@@ -465,7 +486,7 @@ int connman_dbus_get_connection_unix_user(DBusConnection *connection,
        msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
                                        DBUS_INTERFACE_DBUS,
                                        "GetConnectionUnixUser");
-       if (msg == NULL) {
+       if (!msg) {
                DBG("Can't allocate new message");
                err = -ENOMEM;
                goto err;
@@ -474,14 +495,13 @@ int connman_dbus_get_connection_unix_user(DBusConnection *connection,
        dbus_message_append_args(msg, DBUS_TYPE_STRING, &bus_name,
                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(connection, msg,
-                                               &call, -1) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, msg, &call, -1)) {
                DBG("Failed to execute method call");
                err = -EINVAL;
                goto err;
        }
 
-       if (call == NULL) {
+       if (!call) {
                DBG("D-Bus connection not available");
                err = -EINVAL;
                goto err;
@@ -522,7 +542,7 @@ static unsigned char *parse_context(DBusMessage *msg)
                return NULL;
 
        ctx = g_try_malloc0(size + 1);
-       if (ctx == NULL)
+       if (!ctx)
                return NULL;
 
        p = ctx;
@@ -555,7 +575,7 @@ static void selinux_get_context_reply(DBusPendingCall *call, void *user_data)
                goto done;
        }
 
-       if (dbus_message_has_signature(reply, "ay") == FALSE) {
+       if (!dbus_message_has_signature(reply, "ay")) {
                DBG("Message signature is wrong");
                err = -EINVAL;
                goto done;
@@ -583,11 +603,11 @@ int connman_dbus_get_selinux_context(DBusConnection *connection,
        DBusMessage *msg = NULL;
        int err;
 
-       if (func == NULL)
+       if (!func)
                return -EINVAL;
 
        data = g_try_new0(struct callback_data, 1);
-       if (data == NULL) {
+       if (!data) {
                DBG("Can't allocate data structure");
                return -ENOMEM;
        }
@@ -595,7 +615,7 @@ int connman_dbus_get_selinux_context(DBusConnection *connection,
        msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
                                        DBUS_INTERFACE_DBUS,
                                        "GetConnectionSELinuxSecurityContext");
-       if (msg == NULL) {
+       if (!msg) {
                DBG("Can't allocate new message");
                err = -ENOMEM;
                goto err;
@@ -604,14 +624,13 @@ int connman_dbus_get_selinux_context(DBusConnection *connection,
        dbus_message_append_args(msg, DBUS_TYPE_STRING, &service,
                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(connection, msg,
-                                               &call, -1) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, msg, &call, -1)) {
                DBG("Failed to execute method call");
                err = -EINVAL;
                goto err;
        }
 
-       if (call == NULL) {
+       if (!call) {
                DBG("D-Bus connection not available");
                err = -EINVAL;
                goto err;
@@ -636,7 +655,7 @@ err:
 
 DBusConnection *connman_dbus_get_connection(void)
 {
-       if (connection == NULL)
+       if (!connection)
                return NULL;
 
        return dbus_connection_ref(connection);
index 5bf44af..6c03920 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -67,11 +67,11 @@ static void detect_newlink(unsigned short type, int index,
        }
 
        device = find_device(index);
-       if (device != NULL)
+       if (device)
                return;
 
        device = connman_device_create_from_index(index);
-       if (device == NULL)
+       if (!device)
                return;
 
        if (connman_device_register(device) < 0) {
@@ -90,7 +90,7 @@ static void detect_dellink(unsigned short type, int index,
        DBG("type %d index %d", type, index);
 
        device = find_device(index);
-       if (device == NULL)
+       if (!device)
                return;
 
        device_list = g_slist_remove(device_list, device);
index 5feeee1..a97d790 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -48,18 +48,18 @@ struct connman_device {
        int refcount;
        enum connman_device_type type;
        enum connman_pending_type powered_pending;      /* Indicates a pending
-                                                       enable/disable request */
-       connman_bool_t powered;
-       connman_bool_t scanning;
-       connman_bool_t disconnected;
-       connman_bool_t reconnect;
+                                                        * enable/disable
+                                                        * request
+                                                        */
+       bool powered;
+       bool scanning;
+       bool disconnected;
        char *name;
        char *node;
        char *address;
        char *interface;
        char *ident;
        char *path;
-       char *devname;
        int index;
        guint pending_timeout;
 
@@ -127,7 +127,8 @@ static const char *type2string(enum connman_device_type type)
        return NULL;
 }
 
-enum connman_service_type __connman_device_get_service_type(struct connman_device *device)
+enum connman_service_type __connman_device_get_service_type(
+                               struct connman_device *device)
 {
        enum connman_device_type type = connman_device_get_type(device);
 
@@ -181,7 +182,7 @@ int __connman_device_enable(struct connman_device *device)
        if (device->powered_pending == PENDING_ENABLE)
                return -EALREADY;
 
-       if (device->powered_pending == PENDING_NONE && device->powered == TRUE)
+       if (device->powered_pending == PENDING_NONE && device->powered)
                return -EALREADY;
 
        device->powered_pending = PENDING_ENABLE;
@@ -192,13 +193,13 @@ int __connman_device_enable(struct connman_device *device)
         * Invoke the callback
         */
        if (err == 0) {
-               connman_device_set_powered(device, TRUE);
+               connman_device_set_powered(device, true);
                goto done;
        }
 
        if (err == -EALREADY) {
                /* If device is already powered, but connman is not updated */
-               connman_device_set_powered(device, TRUE);
+               connman_device_set_powered(device, true);
                goto done;
        }
        /*
@@ -219,9 +220,6 @@ int __connman_device_disable(struct connman_device *device)
 
        DBG("device %p", device);
 
-       if (!device->driver || !device->driver->disable)
-               return -EOPNOTSUPP;
-
        /* Ongoing power enable request */
        if (device->powered_pending == PENDING_ENABLE)
                return -EBUSY;
@@ -229,25 +227,27 @@ int __connman_device_disable(struct connman_device *device)
        if (device->powered_pending == PENDING_DISABLE)
                return -EALREADY;
 
-       if (device->powered_pending == PENDING_NONE && device->powered == FALSE)
+       if (device->powered_pending == PENDING_NONE && !device->powered)
                return -EALREADY;
 
        device->powered_pending = PENDING_DISABLE;
-       device->reconnect = FALSE;
 
        if (device->network) {
                struct connman_service *service =
                        connman_service_lookup_from_network(device->network);
 
-               if (service != NULL)
+               if (service)
                        __connman_service_disconnect(service);
                else
-                       connman_network_set_connected(device->network, FALSE);
+                       connman_network_set_connected(device->network, false);
        }
 
+       if (!device->driver || !device->driver->disable)
+               return -EOPNOTSUPP;
+
        err = device->driver->disable(device);
        if (err == 0 || err == -EALREADY) {
-               connman_device_set_powered(device, FALSE);
+               connman_device_set_powered(device, false);
                goto done;
        }
 
@@ -264,10 +264,10 @@ static void probe_driver(struct connman_device_driver *driver)
 
        DBG("driver %p name %s", driver, driver->name);
 
-       for (list = device_list; list != NULL; list = list->next) {
+       for (list = device_list; list; list = list->next) {
                struct connman_device *device = list->data;
 
-               if (device->driver != NULL)
+               if (device->driver)
                        continue;
 
                if (driver->type != device->type)
@@ -302,7 +302,7 @@ static void remove_driver(struct connman_device_driver *driver)
 
        DBG("driver %p name %s", driver, driver->name);
 
-       for (list = device_list; list != NULL; list = list->next) {
+       for (list = device_list; list; list = list->next) {
                struct connman_device *device = list->data;
 
                if (device->driver == driver)
@@ -310,12 +310,12 @@ static void remove_driver(struct connman_device_driver *driver)
        }
 }
 
-connman_bool_t __connman_device_has_driver(struct connman_device *device)
+bool __connman_device_has_driver(struct connman_device *device)
 {
-       if (device == NULL || device->driver == NULL)
-               return FALSE;
+       if (!device || !device->driver)
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static GSList *driver_list = NULL;
@@ -385,7 +385,6 @@ static void device_destruct(struct connman_device *device)
        g_free(device->address);
        g_free(device->interface);
        g_free(device->path);
-       g_free(device->devname);
 
        g_free(device->last_network);
 
@@ -412,7 +411,7 @@ struct connman_device *connman_device_create(const char *node,
        DBG("node %s type %d", node, type);
 
        device = g_try_new0(struct connman_device, 1);
-       if (device == NULL)
+       if (!device)
                return NULL;
 
        DBG("device %p", device);
@@ -521,15 +520,12 @@ int connman_device_get_index(struct connman_device *device)
 void connman_device_set_interface(struct connman_device *device,
                                                const char *interface)
 {
-       g_free(device->devname);
-       device->devname = g_strdup(interface);
-
        g_free(device->interface);
        device->interface = g_strdup(interface);
 
-       if (device->name == NULL) {
+       if (!device->name) {
                const char *str = type2description(device->type);
-               if (str != NULL && device->interface != NULL)
+               if (str && device->interface)
                        device->name = g_strdup_printf("%s (%s)", str,
                                                        device->interface);
        }
@@ -562,7 +558,7 @@ const char *connman_device_get_ident(struct connman_device *device)
  * Change power state of device
  */
 int connman_device_set_powered(struct connman_device *device,
-                                               connman_bool_t powered)
+                                               bool powered)
 {
        enum connman_service_type type;
 
@@ -579,36 +575,39 @@ int connman_device_set_powered(struct connman_device *device,
 
        type = __connman_device_get_service_type(device);
 
-       if (device->powered == FALSE) {
+       if (!device->powered) {
                __connman_technology_disabled(type);
                return 0;
        }
 
        __connman_technology_enabled(type);
 
-       connman_device_set_disconnected(device, FALSE);
-       device->scanning = FALSE;
+       connman_device_set_disconnected(device, false);
+       device->scanning = false;
 
        if (device->driver && device->driver->scan)
-               device->driver->scan(device, NULL, 0, NULL, NULL, NULL);
+               device->driver->scan(CONNMAN_SERVICE_TYPE_UNKNOWN, device,
+                                       NULL, 0, NULL, NULL, NULL, NULL);
 
        return 0;
 }
 
-connman_bool_t connman_device_get_powered(struct connman_device *device)
+bool connman_device_get_powered(struct connman_device *device)
 {
        return device->powered;
 }
 
-static int device_scan(struct connman_device *device)
+static int device_scan(enum connman_service_type type,
+                               struct connman_device *device)
 {
        if (!device->driver || !device->driver->scan)
                return -EOPNOTSUPP;
 
-       if (device->powered == FALSE)
+       if (!device->powered)
                return -ENOLINK;
 
-       return device->driver->scan(device, NULL, 0, NULL, NULL, NULL);
+       return device->driver->scan(type, device, NULL, 0,
+                                       NULL, NULL, NULL, NULL);
 }
 
 int __connman_device_disconnect(struct connman_device *device)
@@ -618,14 +617,14 @@ int __connman_device_disconnect(struct connman_device *device)
 
        DBG("device %p", device);
 
-       connman_device_set_disconnected(device, TRUE);
+       connman_device_set_disconnected(device, true);
 
        g_hash_table_iter_init(&iter, device->networks);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct connman_network *network = value;
 
-               if (connman_network_get_connecting(network) == TRUE) {
+               if (connman_network_get_connecting(network)) {
                        /*
                         * Skip network in the process of connecting.
                         * This is a workaround for WiFi networks serviced
@@ -647,32 +646,11 @@ int __connman_device_disconnect(struct connman_device *device)
        return 0;
 }
 
-int connman_device_disconnect_service(struct connman_device *device)
-{
-       DBG("device %p", device);
-
-       device->reconnect = FALSE;
-
-       if (device->network) {
-               struct connman_service *service =
-                       connman_service_lookup_from_network(device->network);
-
-               if (service != NULL)
-                       __connman_service_disconnect(service);
-               else
-                       connman_network_set_connected(device->network, FALSE);
-       }
-
-       return 0;
-}
-
 int connman_device_reconnect_service(struct connman_device *device)
 {
        DBG("device %p", device);
 
-       device->reconnect = TRUE;
-
-       __connman_service_auto_connect();
+       __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
        return 0;
 }
@@ -682,7 +660,7 @@ static void mark_network_available(gpointer key, gpointer value,
 {
        struct connman_network *network = value;
 
-       connman_network_set_available(network, TRUE);
+       connman_network_set_available(network, true);
 }
 
 static void mark_network_unavailable(gpointer key, gpointer value,
@@ -690,11 +668,11 @@ static void mark_network_unavailable(gpointer key, gpointer value,
 {
        struct connman_network *network = value;
 
-       if (connman_network_get_connected(network) == TRUE ||
-                       connman_network_get_connecting(network) == TRUE)
+       if (connman_network_get_connected(network) ||
+                       connman_network_get_connecting(network))
                return;
 
-       connman_network_set_available(network, FALSE);
+       connman_network_set_available(network, false);
 }
 
 static gboolean remove_unavailable_network(gpointer key, gpointer value,
@@ -702,10 +680,10 @@ static gboolean remove_unavailable_network(gpointer key, gpointer value,
 {
        struct connman_network *network = value;
 
-       if (connman_network_get_connected(network) == TRUE)
+       if (connman_network_get_connected(network))
                return FALSE;
 
-       if (connman_network_get_available(network) == TRUE)
+       if (connman_network_get_available(network))
                return FALSE;
 
        return TRUE;
@@ -717,7 +695,7 @@ void __connman_device_cleanup_networks(struct connman_device *device)
                                        remove_unavailable_network, NULL);
 }
 
-connman_bool_t connman_device_get_scanning(struct connman_device *device)
+bool connman_device_get_scanning(struct connman_device *device)
 {
        return device->scanning;
 }
@@ -736,7 +714,7 @@ void connman_device_reset_scanning(struct connman_device *device)
  * Change scanning state of device
  */
 int connman_device_set_scanning(struct connman_device *device,
-                                               connman_bool_t scanning)
+                               enum connman_service_type type, bool scanning)
 {
        DBG("device %p scanning %d", device, scanning);
 
@@ -748,7 +726,7 @@ int connman_device_set_scanning(struct connman_device *device,
 
        device->scanning = scanning;
 
-       if (scanning == TRUE) {
+       if (scanning) {
                __connman_technology_scan_started(device);
 
                g_hash_table_foreach(device->networks,
@@ -759,9 +737,9 @@ int connman_device_set_scanning(struct connman_device *device,
 
        __connman_device_cleanup_networks(device);
 
-       __connman_technology_scan_stopped(device);
+       __connman_technology_scan_stopped(device, type);
 
-       __connman_service_auto_connect();
+       __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
        return 0;
 }
@@ -774,7 +752,7 @@ int connman_device_set_scanning(struct connman_device *device,
  * Change disconnected state of device (only for device with networks)
  */
 int connman_device_set_disconnected(struct connman_device *device,
-                                               connman_bool_t disconnected)
+                                               bool disconnected)
 {
        DBG("device %p disconnected %d", device, disconnected);
 
@@ -792,7 +770,7 @@ int connman_device_set_disconnected(struct connman_device *device,
  *
  * Get device disconnected state
  */
-connman_bool_t connman_device_get_disconnected(struct connman_device *device)
+bool connman_device_get_disconnected(struct connman_device *device)
 {
        return device->disconnected;
 }
@@ -810,16 +788,16 @@ int connman_device_set_string(struct connman_device *device,
 {
        DBG("device %p key %s value %s", device, key, value);
 
-       if (g_str_equal(key, "Address") == TRUE) {
+       if (g_str_equal(key, "Address")) {
                g_free(device->address);
                device->address = g_strdup(value);
-       } else if (g_str_equal(key, "Name") == TRUE) {
+       } else if (g_str_equal(key, "Name")) {
                g_free(device->name);
                device->name = g_strdup(value);
-       } else if (g_str_equal(key, "Node") == TRUE) {
+       } else if (g_str_equal(key, "Node")) {
                g_free(device->node);
                device->node = g_strdup(value);
-       } else if (g_str_equal(key, "Path") == TRUE) {
+       } else if (g_str_equal(key, "Path")) {
                g_free(device->path);
                device->path = g_strdup(value);
        } else {
@@ -841,15 +819,15 @@ const char *connman_device_get_string(struct connman_device *device,
 {
        DBG("device %p key %s", device, key);
 
-       if (g_str_equal(key, "Address") == TRUE)
+       if (g_str_equal(key, "Address"))
                return device->address;
-       else if (g_str_equal(key, "Name") == TRUE)
+       else if (g_str_equal(key, "Name"))
                return device->name;
-       else if (g_str_equal(key, "Node") == TRUE)
+       else if (g_str_equal(key, "Node"))
                return device->node;
-       else if (g_str_equal(key, "Interface") == TRUE)
+       else if (g_str_equal(key, "Interface"))
                return device->interface;
-       else if (g_str_equal(key, "Path") == TRUE)
+       else if (g_str_equal(key, "Path"))
                return device->path;
 
        return NULL;
@@ -869,7 +847,7 @@ int connman_device_add_network(struct connman_device *device,
 
        DBG("device %p network %p", device, network);
 
-       if (identifier == NULL)
+       if (!identifier)
                return -EINVAL;
 
        connman_network_ref(network);
@@ -911,7 +889,7 @@ int connman_device_remove_network(struct connman_device *device,
 
        DBG("device %p network %p", device, network);
 
-       if (network == NULL)
+       if (!network)
                return 0;
 
        identifier = connman_network_get_identifier(network);
@@ -920,23 +898,18 @@ int connman_device_remove_network(struct connman_device *device,
        return 0;
 }
 
-void connman_device_remove_all_networks(struct connman_device *device)
-{
-       g_hash_table_remove_all(device->networks);
-}
-
 void __connman_device_set_network(struct connman_device *device,
                                        struct connman_network *network)
 {
        const char *name;
 
-       if (device == NULL)
+       if (!device)
                return;
 
        if (device->network == network)
                return;
 
-       if (network != NULL) {
+       if (network) {
                name = connman_network_get_string(network, "Name");
                g_free(device->last_network);
                device->last_network = g_strdup(name);
@@ -950,26 +923,14 @@ void __connman_device_set_network(struct connman_device *device,
        }
 }
 
-void __connman_device_set_reconnect(struct connman_device *device,
-                                               connman_bool_t reconnect)
-{
-       device->reconnect = reconnect;
-}
-
-connman_bool_t  __connman_device_get_reconnect(
-                               struct connman_device *device)
-{
-       return device->reconnect;
-}
-
-static gboolean match_driver(struct connman_device *device,
+static bool match_driver(struct connman_device *device,
                                        struct connman_device_driver *driver)
 {
        if (device->type == driver->type ||
                        driver->type == CONNMAN_DEVICE_TYPE_UNKNOWN)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 /**
@@ -984,13 +945,13 @@ int connman_device_register(struct connman_device *device)
 
        DBG("device %p name %s", device, device->name);
 
-       if (device->driver != NULL)
+       if (device->driver)
                return -EALREADY;
 
        for (list = driver_list; list; list = list->next) {
                struct connman_device_driver *driver = list->data;
 
-               if (match_driver(device, driver) == FALSE)
+               if (!match_driver(device, driver))
                        continue;
 
                DBG("driver %p name %s", driver, driver->name);
@@ -1001,7 +962,7 @@ int connman_device_register(struct connman_device *device)
                }
        }
 
-       if (device->driver == NULL)
+       if (!device->driver)
                return 0;
 
        return __connman_technology_add_device(device);
@@ -1017,7 +978,7 @@ void connman_device_unregister(struct connman_device *device)
 {
        DBG("device %p name %s", device, device->name);
 
-       if (device->driver == NULL)
+       if (!device->driver)
                return;
 
        remove_device(device);
@@ -1051,7 +1012,7 @@ struct connman_device *__connman_device_find_device(
 {
        GSList *list;
 
-       for (list = device_list; list != NULL; list = list->next) {
+       for (list = device_list; list; list = list->next) {
                struct connman_device *device = list->data;
                enum connman_service_type service_type =
                        __connman_device_get_service_type(device);
@@ -1069,7 +1030,7 @@ struct connman_device *connman_device_find_by_index(int index)
 {
        GSList *list;
 
-       for (list = device_list; list != NULL; list = list->next) {
+       for (list = device_list; list; list = list->next) {
                struct connman_device *device = list->data;
                if (device->index == index)
                        return device;
@@ -1088,10 +1049,10 @@ struct connman_device *connman_device_find_by_index(int index)
 int connman_device_set_regdom(struct connman_device *device,
                                                const char *alpha2)
 {
-       if (device->driver == NULL || device->driver->set_regdom == NULL)
+       if (!device->driver || !device->driver->set_regdom)
                return -ENOTSUP;
 
-       if (device->powered == FALSE)
+       if (!device->powered)
                return -EINVAL;
 
        return device->driver->set_regdom(device, alpha2);
@@ -1112,7 +1073,7 @@ void connman_device_regdom_notify(struct connman_device *device,
 
 int __connman_device_request_scan(enum connman_service_type type)
 {
-       connman_bool_t success = FALSE;
+       bool success = false;
        int last_err = -ENOSYS;
        GSList *list;
        int err;
@@ -1128,29 +1089,33 @@ int __connman_device_request_scan(enum connman_service_type type)
        case CONNMAN_SERVICE_TYPE_GADGET:
                return -EOPNOTSUPP;
        case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        }
 
-       for (list = device_list; list != NULL; list = list->next) {
+       for (list = device_list; list; list = list->next) {
                struct connman_device *device = list->data;
                enum connman_service_type service_type =
                        __connman_device_get_service_type(device);
 
-               if (service_type != CONNMAN_SERVICE_TYPE_UNKNOWN &&
-                               service_type != type) {
-                       continue;
+               if (service_type != CONNMAN_SERVICE_TYPE_UNKNOWN) {
+                       if (type == CONNMAN_SERVICE_TYPE_P2P) {
+                               if (service_type != CONNMAN_SERVICE_TYPE_WIFI)
+                                       continue;
+                       } else if (service_type != type)
+                               continue;
                }
 
-               err = device_scan(device);
+               err = device_scan(type, device);
                if (err == 0 || err == -EALREADY || err == -EINPROGRESS) {
-                       success = TRUE;
+                       success = true;
                } else {
                        last_err = err;
                        DBG("device %p err %d", device, err);
                }
        }
 
-       if (success == TRUE)
+       if (success)
                return 0;
 
        return last_err;
@@ -1159,19 +1124,17 @@ int __connman_device_request_scan(enum connman_service_type type)
 int __connman_device_request_hidden_scan(struct connman_device *device,
                                const char *ssid, unsigned int ssid_len,
                                const char *identity, const char *passphrase,
-                               void *user_data)
+                               const char *security, void *user_data)
 {
        DBG("device %p", device);
 
-       if (device == NULL || device->driver == NULL ||
-                       device->driver->scan == NULL)
+       if (!device || !device->driver ||
+                       !device->driver->scan)
                return -EINVAL;
 
-       if (device->scanning == TRUE)
-               return -EALREADY;
-
-       return device->driver->scan(device, ssid, ssid_len,
-                                       identity, passphrase, user_data);
+       return device->driver->scan(CONNMAN_SERVICE_TYPE_UNKNOWN,
+                                       device, ssid, ssid_len, identity,
+                                       passphrase, security, user_data);
 }
 
 static char *index2ident(int index, const char *prefix)
@@ -1274,10 +1237,10 @@ struct connman_device *connman_device_create_from_index(int index)
                return NULL;
 
        devname = connman_inet_ifname(index);
-       if (devname == NULL)
+       if (!devname)
                return NULL;
 
-       if (__connman_device_isfiltered(devname) == TRUE) {
+       if (__connman_device_isfiltered(devname)) {
                connman_info("Ignoring interface %s (filtered)", devname);
                g_free(devname);
                return NULL;
@@ -1305,7 +1268,7 @@ struct connman_device *connman_device_create_from_index(int index)
        }
 
        device = connman_device_create(name, type);
-       if (device == NULL)
+       if (!device)
                goto done;
 
        switch (type) {
@@ -1330,7 +1293,7 @@ struct connman_device *connman_device_create_from_index(int index)
        connman_device_set_index(device, index);
        connman_device_set_interface(device, devname);
 
-       if (ident != NULL) {
+       if (ident) {
                connman_device_set_ident(device, ident);
                g_free(ident);
        }
@@ -1345,57 +1308,57 @@ done:
        return device;
 }
 
-connman_bool_t __connman_device_isfiltered(const char *devname)
+bool __connman_device_isfiltered(const char *devname)
 {
        char **pattern;
        char **blacklisted_interfaces;
-       gboolean match;
+       bool match;
 
-       if (device_filter == NULL)
+       if (!device_filter)
                goto nodevice;
 
-       for (pattern = device_filter, match = FALSE; *pattern; pattern++) {
-               if (g_pattern_match_simple(*pattern, devname) == TRUE) {
-                       match = TRUE;
+       for (pattern = device_filter, match = false; *pattern; pattern++) {
+               if (g_pattern_match_simple(*pattern, devname)) {
+                       match = true;
                        break;
                }
        }
 
-       if (match == FALSE) {
+       if (!match) {
                DBG("ignoring device %s (match)", devname);
-               return TRUE;
+               return true;
        }
 
 nodevice:
-       if (g_pattern_match_simple("dummy*", devname) == TRUE) {
+       if (g_pattern_match_simple("dummy*", devname)) {
                DBG("ignoring dummy networking devices");
-               return TRUE;
+               return true;
        }
 
-       if (nodevice_filter == NULL)
+       if (!nodevice_filter)
                goto list;
 
        for (pattern = nodevice_filter; *pattern; pattern++) {
-               if (g_pattern_match_simple(*pattern, devname) == TRUE) {
+               if (g_pattern_match_simple(*pattern, devname)) {
                        DBG("ignoring device %s (no match)", devname);
-                       return TRUE;
+                       return true;
                }
        }
 
 list:
        blacklisted_interfaces =
                connman_setting_get_string_list("NetworkInterfaceBlacklist");
-       if (blacklisted_interfaces == NULL)
-               return FALSE;
+       if (!blacklisted_interfaces)
+               return false;
 
        for (pattern = blacklisted_interfaces; *pattern; pattern++) {
-               if (g_str_has_prefix(devname, *pattern) == TRUE) {
+               if (g_str_has_prefix(devname, *pattern)) {
                        DBG("ignoring device %s (blacklist)", devname);
-                       return TRUE;
+                       return true;
                }
        }
 
-       return FALSE;
+       return false;
 }
 
 static void cleanup_devices(void)
@@ -1418,21 +1381,41 @@ static void cleanup_devices(void)
 
        interfaces = __connman_inet_get_running_interfaces();
 
-       if (interfaces == NULL)
+       if (!interfaces)
                return;
 
-       for (i = 0; interfaces[i] != NULL; i++) {
-               connman_bool_t filtered;
+       for (i = 0; interfaces[i]; i++) {
+               bool filtered;
                int index;
+               struct sockaddr_in sin_addr, sin_mask;
 
                filtered = __connman_device_isfiltered(interfaces[i]);
-               if (filtered == TRUE)
+               if (filtered)
                        continue;
 
                index = connman_inet_ifindex(interfaces[i]);
                if (index < 0)
                        continue;
 
+               if (!__connman_inet_get_address_netmask(index, &sin_addr,
+                                                       &sin_mask)) {
+                       char *address = g_strdup(inet_ntoa(sin_addr.sin_addr));
+                       char *netmask = g_strdup(inet_ntoa(sin_mask.sin_addr));
+
+                       if (__connman_config_address_provisioned(address,
+                                                               netmask)) {
+                               DBG("Skip %s which is already provisioned "
+                                       "with %s/%s", interfaces[i], address,
+                                       netmask);
+                               g_free(address);
+                               g_free(netmask);
+                               continue;
+                       }
+
+                       g_free(address);
+                       g_free(netmask);
+               }
+
                DBG("cleaning up %s index %d", interfaces[i], index);
 
                connman_inet_ifdown(index);
@@ -1450,10 +1433,10 @@ int __connman_device_init(const char *device, const char *nodevice)
 {
        DBG("");
 
-       if (device != NULL)
+       if (device)
                device_filter = g_strsplit(device, ",", -1);
 
-       if (nodevice != NULL)
+       if (nodevice)
                nodevice_filter = g_strsplit(nodevice, ",", -1);
 
        cleanup_devices();
index f32bfae..83d7dfb 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -36,6 +36,8 @@
 
 #include "connman.h"
 
+#define RATE_LIMIT_INTERVAL    60      /* delay between successive attempts */
+
 struct connman_dhcp {
        struct connman_network *network;
        dhcp_cb callback;
@@ -44,10 +46,16 @@ struct connman_dhcp {
        char **timeservers;
        char *pac;
 
+       unsigned int timeout;
+
+       GDHCPClient *ipv4ll_client;
        GDHCPClient *dhcp_client;
+       char *ipv4ll_debug_prefix;
+       char *dhcp_debug_prefix;
 };
 
 static GHashTable *network_table;
+static bool ipv4ll_running;
 
 static void dhcp_free(struct connman_dhcp *dhcp)
 {
@@ -58,6 +66,8 @@ static void dhcp_free(struct connman_dhcp *dhcp)
        dhcp->nameservers = NULL;
        dhcp->timeservers = NULL;
        dhcp->pac = NULL;
+
+       g_free(dhcp);
 }
 
 /**
@@ -72,7 +82,7 @@ static void dhcp_free(struct connman_dhcp *dhcp)
  * service state due to the IP configuration change implied by this
  * invalidation.
  */
-static void dhcp_invalidate(struct connman_dhcp *dhcp, connman_bool_t callback)
+static void dhcp_invalidate(struct connman_dhcp *dhcp, bool callback)
 {
        struct connman_service *service;
        struct connman_ipconfig *ipconfig;
@@ -80,33 +90,33 @@ static void dhcp_invalidate(struct connman_dhcp *dhcp, connman_bool_t callback)
 
        DBG("dhcp %p callback %u", dhcp, callback);
 
-       if (dhcp == NULL)
+       if (!dhcp)
                return;
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL)
-               goto out;
+       if (!service)
+               return;
 
        ipconfig = __connman_service_get_ip4config(service);
-       if (ipconfig == NULL)
-               goto out;
+       if (!ipconfig)
+               return;
 
        __connman_6to4_remove(ipconfig);
 
        __connman_service_set_domainname(service, NULL);
        __connman_service_set_pac(service, NULL);
 
-       if (dhcp->timeservers != NULL) {
-               for (i = 0; dhcp->timeservers[i] != NULL; i++) {
+       if (dhcp->timeservers) {
+               for (i = 0; dhcp->timeservers[i]; i++) {
                        __connman_service_timeserver_remove(service,
                                                        dhcp->timeservers[i]);
                }
        }
 
-       if (dhcp->nameservers != NULL) {
-               for (i = 0; dhcp->nameservers[i] != NULL; i++) {
+       if (dhcp->nameservers) {
+               for (i = 0; dhcp->nameservers[i]; i++) {
                        __connman_service_nameserver_remove(service,
-                                               dhcp->nameservers[i], FALSE);
+                                               dhcp->nameservers[i], false);
                }
        }
 
@@ -121,26 +131,125 @@ static void dhcp_invalidate(struct connman_dhcp *dhcp, connman_bool_t callback)
        __connman_ipconfig_set_gateway(ipconfig, NULL);
        __connman_ipconfig_set_prefixlen(ipconfig, 0);
 
-       if (dhcp->callback != NULL && callback)
-               dhcp->callback(dhcp->network, FALSE);
-
-out:
-       dhcp_free(dhcp);
+       if (dhcp->callback && callback)
+               dhcp->callback(dhcp->network, false, NULL);
 }
 
 static void dhcp_valid(struct connman_dhcp *dhcp)
 {
-       if (dhcp->callback != NULL)
-               dhcp->callback(dhcp->network, TRUE);
+       if (dhcp->callback)
+               dhcp->callback(dhcp->network, true, NULL);
+}
+
+static void dhcp_debug(const char *str, void *data)
+{
+       connman_info("%s: %s", (const char *) data, str);
+}
+
+static void ipv4ll_stop_client(struct connman_dhcp *dhcp)
+{
+       if (!dhcp->ipv4ll_client)
+               return;
+
+       g_dhcp_client_stop(dhcp->ipv4ll_client);
+       g_dhcp_client_unref(dhcp->ipv4ll_client);
+       dhcp->ipv4ll_client = NULL;
+       ipv4ll_running = false;
+
+       g_free(dhcp->ipv4ll_debug_prefix);
+       dhcp->ipv4ll_debug_prefix = NULL;
+}
+
+static void ipv4ll_lost_cb(GDHCPClient *dhcp_client, gpointer user_data);
+static void ipv4ll_available_cb(GDHCPClient *ipv4ll_client, gpointer user_data);
+
+static int ipv4ll_start_client(struct connman_dhcp *dhcp)
+{
+       GDHCPClient *ipv4ll_client;
+       GDHCPClientError error;
+       const char *hostname;
+       int index;
+       int err;
+
+       if (dhcp->ipv4ll_client)
+               return -EALREADY;
+
+       index = connman_network_get_index(dhcp->network);
+
+       ipv4ll_client = g_dhcp_client_new(G_DHCP_IPV4LL, index, &error);
+       if (error != G_DHCP_CLIENT_ERROR_NONE)
+               return -EINVAL;
+
+       if (getenv("CONNMAN_DHCP_DEBUG")) {
+               dhcp->ipv4ll_debug_prefix = g_strdup_printf("IPv4LL index %d",
+                                                       index);
+               g_dhcp_client_set_debug(ipv4ll_client, dhcp_debug,
+                                       dhcp->ipv4ll_debug_prefix);
+       }
+
+       g_dhcp_client_set_id(ipv4ll_client);
+
+       hostname = connman_utsname_get_hostname();
+       if (hostname)
+               g_dhcp_client_set_send(ipv4ll_client, G_DHCP_HOST_NAME,
+                                       hostname);
+
+       g_dhcp_client_register_event(ipv4ll_client,
+                       G_DHCP_CLIENT_EVENT_IPV4LL_LOST, ipv4ll_lost_cb, dhcp);
+
+       g_dhcp_client_register_event(ipv4ll_client,
+                       G_DHCP_CLIENT_EVENT_IPV4LL_AVAILABLE,
+                                               ipv4ll_available_cb, dhcp);
+
+       dhcp->ipv4ll_client = ipv4ll_client;
+
+       err = g_dhcp_client_start(dhcp->ipv4ll_client, NULL);
+       if (err < 0) {
+               ipv4ll_stop_client(dhcp);
+               return err;
+       }
+
+       ipv4ll_running = true;
+       return 0;
+}
+
+static gboolean dhcp_retry_cb(gpointer user_data)
+{
+       struct connman_dhcp *dhcp = user_data;
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig;
+
+       dhcp->timeout = 0;
+
+       service = connman_service_lookup_from_network(dhcp->network);
+       ipconfig = __connman_service_get_ip4config(service);
+
+       g_dhcp_client_start(dhcp->dhcp_client,
+                               __connman_ipconfig_get_dhcp_address(ipconfig));
+
+       return FALSE;
 }
 
 static void no_lease_cb(GDHCPClient *dhcp_client, gpointer user_data)
 {
        struct connman_dhcp *dhcp = user_data;
+       int err;
 
-       DBG("No lease available");
+       DBG("No lease available ipv4ll %d client %p", ipv4ll_running,
+               dhcp->ipv4ll_client);
 
-       dhcp_invalidate(dhcp, TRUE);
+       dhcp->timeout = g_timeout_add_seconds(RATE_LIMIT_INTERVAL,
+                                               dhcp_retry_cb,
+                                               dhcp);
+       if (ipv4ll_running)
+               return;
+
+       err = ipv4ll_start_client(dhcp);
+       if (err < 0)
+               DBG("Cannot start ipv4ll client (%d/%s)", err, strerror(-err));
+
+       /* Only notify upper layer if we have a problem */
+       dhcp_invalidate(dhcp, !ipv4ll_running);
 }
 
 static void lease_lost_cb(GDHCPClient *dhcp_client, gpointer user_data)
@@ -149,7 +258,8 @@ static void lease_lost_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        DBG("Lease lost");
 
-       dhcp_invalidate(dhcp, TRUE);
+       /* Upper layer will decide what to do, e.g. nothing or retry. */
+       dhcp_invalidate(dhcp, true);
 }
 
 static void ipv4ll_lost_cb(GDHCPClient *dhcp_client, gpointer user_data)
@@ -158,27 +268,32 @@ static void ipv4ll_lost_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        DBG("Lease lost");
 
-       dhcp_invalidate(dhcp, TRUE);
-}
+       ipv4ll_stop_client(dhcp);
 
+       /*
+        * Since we lost our IPv4LL configuration we might as notify
+        * the upper layers.
+        */
+       dhcp_invalidate(dhcp, true);
+}
 
-static gboolean compare_string_arrays(char **array_a, char **array_b)
+static bool compare_string_arrays(char **array_a, char **array_b)
 {
        int i;
 
-       if (array_a == NULL || array_b == NULL)
-               return FALSE;
+       if (!array_a || !array_b)
+               return false;
 
        if (g_strv_length(array_a) != g_strv_length(array_b))
-               return FALSE;
+               return false;
 
-       for (i = 0; array_a[i] != NULL &&
-                            array_b[i] != NULL; i++) {
+       for (i = 0; array_a[i] &&
+                            array_b[i]; i++) {
                if (g_strcmp0(array_a[i], array_b[i]) != 0)
-                       return FALSE;
+                       return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
@@ -187,25 +302,29 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
        GList *list, *option = NULL;
        char *address, *netmask = NULL, *gateway = NULL;
        const char *c_address, *c_gateway;
-       char *domainname = NULL, *hostname = NULL;
        char **nameservers, **timeservers, *pac = NULL;
        int ns_entries;
        struct connman_ipconfig *ipconfig;
        struct connman_service *service;
        unsigned char prefixlen, c_prefixlen;
-       gboolean ip_change;
+       bool ip_change;
        int i;
 
        DBG("Lease available");
 
+       if (dhcp->ipv4ll_client) {
+               ipv4ll_stop_client(dhcp);
+               dhcp_invalidate(dhcp, false);
+       }
+
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL) {
+       if (!service) {
                connman_error("Can not lookup service");
                return;
        }
 
        ipconfig = __connman_service_get_ip4config(service);
-       if (ipconfig == NULL) {
+       if (!ipconfig) {
                connman_error("Could not lookup ipconfig");
                return;
        }
@@ -220,11 +339,11 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
        DBG("last address %s", address);
 
        option = g_dhcp_client_get_option(dhcp_client, G_DHCP_SUBNET);
-       if (option != NULL)
+       if (option)
                netmask = g_strdup(option->data);
 
        option = g_dhcp_client_get_option(dhcp_client, G_DHCP_ROUTER);
-       if (option != NULL)
+       if (option)
                gateway = g_strdup(option->data);
 
        prefixlen = __connman_ipaddress_netmask_prefix_len(netmask);
@@ -233,83 +352,78 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        DBG("c_address %s", c_address);
 
-       if (address != NULL && c_address != NULL &&
-                                       g_strcmp0(address, c_address) != 0)
-               ip_change = TRUE;
-       else if (gateway != NULL && c_gateway != NULL &&
-                                       g_strcmp0(gateway, c_gateway) != 0)
-               ip_change = TRUE;
+       if (address && c_address && g_strcmp0(address, c_address) != 0)
+               ip_change = true;
+       else if (gateway && c_gateway && g_strcmp0(gateway, c_gateway) != 0)
+               ip_change = true;
        else if (prefixlen != c_prefixlen)
-               ip_change = TRUE;
-       else if (c_address == NULL || c_gateway == NULL)
-               ip_change = TRUE;
+               ip_change = true;
+       else if (!c_address || !c_gateway)
+               ip_change = true;
        else
-               ip_change = FALSE;
+               ip_change = false;
 
        option = g_dhcp_client_get_option(dhcp_client, G_DHCP_DNS_SERVER);
        ns_entries = g_list_length(option);
        nameservers = g_try_new0(char *, ns_entries + 1);
-       if (nameservers != NULL) {
+       if (nameservers) {
                for (i = 0, list = option; list; list = list->next, i++)
                        nameservers[i] = g_strdup(list->data);
                nameservers[ns_entries] = NULL;
        }
 
        option = g_dhcp_client_get_option(dhcp_client, G_DHCP_DOMAIN_NAME);
-       if (option != NULL)
-               domainname = g_strdup(option->data);
-
-       if (connman_setting_get_bool("AllowHostnameUpdates") == TRUE) {
-               option = g_dhcp_client_get_option(dhcp_client,
-                                               G_DHCP_HOST_NAME);
-               if (option != NULL)
-                       hostname = g_strdup(option->data);
-       }
+       if (option)
+               __connman_service_set_domainname(service, option->data);
+
+       option = g_dhcp_client_get_option(dhcp_client, G_DHCP_HOST_NAME);
+       if (option)
+               __connman_service_set_hostname(service, option->data);
 
        option = g_dhcp_client_get_option(dhcp_client, G_DHCP_NTP_SERVER);
        ns_entries = g_list_length(option);
        timeservers = g_try_new0(char *, ns_entries + 1);
-       if (timeservers != NULL) {
+       if (timeservers) {
                for (i = 0, list = option; list; list = list->next, i++)
                        timeservers[i] = g_strdup(list->data);
                timeservers[ns_entries] = NULL;
        }
 
        option = g_dhcp_client_get_option(dhcp_client, 252);
-       if (option != NULL)
+       if (option)
                pac = g_strdup(option->data);
 
        __connman_ipconfig_set_method(ipconfig, CONNMAN_IPCONFIG_METHOD_DHCP);
 
-       if (ip_change == TRUE) {
+       if (ip_change) {
                __connman_ipconfig_set_local(ipconfig, address);
                __connman_ipconfig_set_prefixlen(ipconfig, prefixlen);
                __connman_ipconfig_set_gateway(ipconfig, gateway);
        }
 
-       if (compare_string_arrays(nameservers, dhcp->nameservers) == FALSE) {
-               if (dhcp->nameservers != NULL) {
-                       for (i = 0; dhcp->nameservers[i] != NULL; i++) {
+       if (!compare_string_arrays(nameservers, dhcp->nameservers)) {
+               if (dhcp->nameservers) {
+                       for (i = 0; dhcp->nameservers[i]; i++) {
                                __connman_service_nameserver_remove(service,
-                                               dhcp->nameservers[i], FALSE);
+                                               dhcp->nameservers[i], false);
                        }
                        g_strfreev(dhcp->nameservers);
                }
 
                dhcp->nameservers = nameservers;
 
-               for (i = 0; dhcp->nameservers != NULL &&
-                                       dhcp->nameservers[i] != NULL; i++) {
+               for (i = 0; dhcp->nameservers &&
+                                       dhcp->nameservers[i]; i++) {
                        __connman_service_nameserver_append(service,
-                                               dhcp->nameservers[i], FALSE);
+                                               dhcp->nameservers[i], false);
                }
        } else {
                g_strfreev(nameservers);
        }
 
-       if (compare_string_arrays(timeservers, dhcp->timeservers) == FALSE) {
-               if (dhcp->timeservers != NULL) {
-                       for (i = 0; dhcp->timeservers[i] != NULL; i++) {
+       if (!compare_string_arrays(timeservers, dhcp->timeservers)) {
+               if (dhcp->timeservers) {
+                       for (i = 0; dhcp->timeservers[i]; i++) {
                                __connman_service_timeserver_remove(service,
                                                        dhcp->timeservers[i]);
                        }
@@ -318,8 +432,8 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
                dhcp->timeservers = timeservers;
 
-               for (i = 0; dhcp->timeservers != NULL &&
-                                        dhcp->timeservers[i] != NULL; i++) {
+               for (i = 0; dhcp->timeservers &&
+                                        dhcp->timeservers[i]; i++) {
                        __connman_service_timeserver_append(service,
                                                        dhcp->timeservers[i]);
                }
@@ -334,15 +448,7 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
                __connman_service_set_pac(service, dhcp->pac);
        }
 
-       __connman_service_set_domainname(service, domainname);
-
-       if (domainname != NULL)
-               __connman_utsname_set_domainname(domainname);
-
-       if (hostname != NULL)
-               __connman_utsname_set_hostname(hostname);
-
-       if (ip_change == TRUE)
+       if (ip_change)
                dhcp_valid(dhcp);
 
        __connman_6to4_probe(service);
@@ -350,11 +456,9 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
        g_free(address);
        g_free(netmask);
        g_free(gateway);
-       g_free(domainname);
-       g_free(hostname);
 }
 
-static void ipv4ll_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
+static void ipv4ll_available_cb(GDHCPClient *ipv4ll_client, gpointer user_data)
 {
        struct connman_dhcp *dhcp = user_data;
        char *address, *netmask;
@@ -365,15 +469,15 @@ static void ipv4ll_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
        DBG("IPV4LL available");
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL)
+       if (!service)
                return;
 
        ipconfig = __connman_service_get_ip4config(service);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
-       address = g_dhcp_client_get_address(dhcp_client);
-       netmask = g_dhcp_client_get_netmask(dhcp_client);
+       address = g_dhcp_client_get_address(ipv4ll_client);
+       netmask = g_dhcp_client_get_netmask(ipv4ll_client);
 
        prefixlen = __connman_ipaddress_netmask_prefix_len(netmask);
 
@@ -388,15 +492,9 @@ static void ipv4ll_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
        g_free(netmask);
 }
 
-static void dhcp_debug(const char *str, void *data)
-{
-       connman_info("%s: %s\n", (const char *) data, str);
-}
-
-static int dhcp_request(struct connman_dhcp *dhcp)
+static int dhcp_initialize(struct connman_dhcp *dhcp)
 {
        struct connman_service *service;
-       struct connman_ipconfig *ipconfig;
        GDHCPClient *dhcp_client;
        GDHCPClientError error;
        const char *hostname;
@@ -410,13 +508,22 @@ static int dhcp_request(struct connman_dhcp *dhcp)
        if (error != G_DHCP_CLIENT_ERROR_NONE)
                return -EINVAL;
 
-       if (getenv("CONNMAN_DHCP_DEBUG"))
-               g_dhcp_client_set_debug(dhcp_client, dhcp_debug, "DHCP");
+       if (getenv("CONNMAN_DHCP_DEBUG")) {
+               dhcp->dhcp_debug_prefix = g_strdup_printf("DHCP index %d",
+                                                       index);
+               g_dhcp_client_set_debug(dhcp_client, dhcp_debug,
+                                       dhcp->dhcp_debug_prefix);
+       }
 
        g_dhcp_client_set_id(dhcp_client);
 
-       hostname = connman_utsname_get_hostname();
-       if (hostname != NULL)
+       service = connman_service_lookup_from_network(dhcp->network);
+
+       hostname = __connman_service_get_hostname(service);
+       if (!hostname)
+               hostname = connman_utsname_get_hostname();
+
+       if (hostname)
                g_dhcp_client_set_send(dhcp_client, G_DHCP_HOST_NAME, hostname);
 
        g_dhcp_client_set_request(dhcp_client, G_DHCP_HOST_NAME);
@@ -432,89 +539,92 @@ static int dhcp_request(struct connman_dhcp *dhcp)
                                                lease_available_cb, dhcp);
 
        g_dhcp_client_register_event(dhcp_client,
-                       G_DHCP_CLIENT_EVENT_IPV4LL_AVAILABLE,
-                                               ipv4ll_available_cb, dhcp);
-
-       g_dhcp_client_register_event(dhcp_client,
                        G_DHCP_CLIENT_EVENT_LEASE_LOST, lease_lost_cb, dhcp);
 
        g_dhcp_client_register_event(dhcp_client,
-                       G_DHCP_CLIENT_EVENT_IPV4LL_LOST, ipv4ll_lost_cb, dhcp);
-
-       g_dhcp_client_register_event(dhcp_client,
                        G_DHCP_CLIENT_EVENT_NO_LEASE, no_lease_cb, dhcp);
 
        dhcp->dhcp_client = dhcp_client;
 
-       service = connman_service_lookup_from_network(dhcp->network);
-       ipconfig = __connman_service_get_ip4config(service);
-
-       /*
-        * Clear the addresses at startup so that lease callback will
-        * take the lease and set ip address properly.
-        */
-       __connman_ipconfig_clear_address(ipconfig);
-
-       return g_dhcp_client_start(dhcp_client,
-                               __connman_ipconfig_get_dhcp_address(ipconfig));
+       return 0;
 }
 
 static int dhcp_release(struct connman_dhcp *dhcp)
 {
        DBG("dhcp %p", dhcp);
 
-       if (dhcp->dhcp_client == NULL)
-               return 0;
+       if (dhcp->timeout > 0)
+               g_source_remove(dhcp->timeout);
 
-       g_dhcp_client_stop(dhcp->dhcp_client);
-       g_dhcp_client_unref(dhcp->dhcp_client);
+       if (dhcp->dhcp_client) {
+               g_dhcp_client_stop(dhcp->dhcp_client);
+               g_dhcp_client_unref(dhcp->dhcp_client);
+       }
 
        dhcp->dhcp_client = NULL;
 
-       return 0;
-}
+       g_free(dhcp->dhcp_debug_prefix);
+       dhcp->dhcp_debug_prefix = NULL;
 
-static void remove_network(gpointer user_data)
-{
-       struct connman_dhcp *dhcp = user_data;
-
-       DBG("dhcp %p", dhcp);
+       ipv4ll_stop_client(dhcp);
 
-       dhcp_invalidate(dhcp, FALSE);
-       dhcp_release(dhcp);
-
-       g_free(dhcp);
+       return 0;
 }
 
 int __connman_dhcp_start(struct connman_network *network, dhcp_cb callback)
 {
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig;
+       const char *last_addr = NULL;
        struct connman_dhcp *dhcp;
 
        DBG("");
 
-       dhcp = g_try_new0(struct connman_dhcp, 1);
-       if (dhcp == NULL)
-               return -ENOMEM;
+       service = connman_service_lookup_from_network(network);
+       if (!service)
+               return -EINVAL;
 
-       dhcp->network = network;
-       dhcp->callback = callback;
+       ipconfig = __connman_service_get_ip4config(service);
+       if (ipconfig)
+               last_addr = __connman_ipconfig_get_dhcp_address(ipconfig);
+
+       dhcp = g_hash_table_lookup(network_table, network);
+       if (!dhcp) {
 
-       connman_network_ref(network);
+               dhcp = g_try_new0(struct connman_dhcp, 1);
+               if (!dhcp)
+                       return -ENOMEM;
 
-       g_hash_table_replace(network_table, network, dhcp);
+               dhcp->network = network;
+               connman_network_ref(network);
 
-       return dhcp_request(dhcp);
+               g_hash_table_insert(network_table, network, dhcp);
+
+               dhcp_initialize(dhcp);
+       }
+
+       dhcp->callback = callback;
+
+       return g_dhcp_client_start(dhcp->dhcp_client, last_addr);
 }
 
 void __connman_dhcp_stop(struct connman_network *network)
 {
-       DBG("");
+       struct connman_dhcp *dhcp;
+
+       DBG("network_table %p network %p", network_table, network);
 
-       if (network_table == NULL)
+       if (!network_table)
                return;
 
-       if (g_hash_table_remove(network_table, network) == TRUE)
+       dhcp = g_hash_table_lookup(network_table, network);
+       if (dhcp) {
+               g_hash_table_remove(network_table, network);
                connman_network_unref(network);
+               dhcp_release(dhcp);
+               dhcp_invalidate(dhcp, false);
+               dhcp_free(dhcp);
+       }
 }
 
 int __connman_dhcp_init(void)
@@ -522,7 +632,7 @@ int __connman_dhcp_init(void)
        DBG("");
 
        network_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
-                                                       NULL, remove_network);
+                                                       NULL, NULL);
 
        return 0;
 }
index bff57d4..2ede854 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <string.h>
 #include <stdlib.h>
+#include <net/if.h>
 
 #include <connman/ipconfig.h>
 #include <connman/storage.h>
 #define CNF_TIMEOUT    (1 * 1000)
 #define CNF_MAX_RT     (4 * 1000)
 #define CNF_MAX_RD     (10 * 1000)
+#define DEC_TIMEOUT     (1 * 1000)
+#define DEC_MAX_RC      5
 
+enum request_type {
+       REQ_REQUEST = 1,
+       REQ_REBIND = 2,
+       REQ_RENEW = 3,
+};
 
 struct connman_dhcpv6 {
        struct connman_network *network;
-       dhcp_cb callback;
+       dhcpv6_cb callback;
 
        char **nameservers;
        char **timeservers;
@@ -68,16 +76,21 @@ struct connman_dhcpv6 {
        guint timeout;          /* operation timeout in msec */
        guint MRD;              /* max operation timeout in msec */
        guint RT;               /* in msec */
-       gboolean use_ta;        /* set to TRUE if IPv6 privacy is enabled */
-       GSList *prefixes;       /* network prefixes from radvd */
+       bool use_ta;            /* set to TRUE if IPv6 privacy is enabled */
+       GSList *prefixes;       /* network prefixes from radvd or dhcpv6 pd */
        int request_count;      /* how many times REQUEST have been sent */
-       gboolean stateless;     /* TRUE if stateless DHCPv6 is used */
-       gboolean started;       /* TRUE if we have DHCPv6 started */
+       bool stateless;         /* TRUE if stateless DHCPv6 is used */
+       bool started;           /* TRUE if we have DHCPv6 started */
 };
 
 static GHashTable *network_table;
+static GHashTable *network_pd_table;
 
-static int dhcpv6_request(struct connman_dhcpv6 *dhcp, gboolean add_addresses);
+static int dhcpv6_request(struct connman_dhcpv6 *dhcp, bool add_addresses);
+static int dhcpv6_pd_request(struct connman_dhcpv6 *dhcp);
+static gboolean start_solicitation(gpointer user_data);
+static int dhcpv6_renew(struct connman_dhcpv6 *dhcp);
+static int dhcpv6_rebind(struct connman_dhcpv6 *dhcp);
 
 static void clear_timer(struct connman_dhcpv6 *dhcp)
 {
@@ -92,7 +105,7 @@ static void clear_timer(struct connman_dhcpv6 *dhcp)
        }
 }
 
-static inline float get_random()
+static inline float get_random(void)
 {
        return (rand() % 200 - 100) / 1000.0;
 }
@@ -113,7 +126,7 @@ static guint calc_delay(guint RT, guint MRT)
        return (guint)rt;
 }
 
-static void free_prefix(gpointer data, gpointer user_data)
+static void free_prefix(gpointer data)
 {
        g_free(data);
 }
@@ -125,27 +138,26 @@ static void dhcpv6_free(struct connman_dhcpv6 *dhcp)
 
        dhcp->nameservers = NULL;
        dhcp->timeservers = NULL;
-       dhcp->started = FALSE;
+       dhcp->started = false;
 
-       g_slist_foreach(dhcp->prefixes, free_prefix, NULL);
-       g_slist_free(dhcp->prefixes);
+       g_slist_free_full(dhcp->prefixes, free_prefix);
 }
 
-static gboolean compare_string_arrays(char **array_a, char **array_b)
+static bool compare_string_arrays(char **array_a, char **array_b)
 {
        int i;
 
-       if (array_a == NULL || array_b == NULL)
-               return FALSE;
+       if (!array_a || !array_b)
+               return false;
 
        if (g_strv_length(array_a) != g_strv_length(array_b))
-               return FALSE;
+               return false;
 
-       for (i = 0; array_a[i] != NULL && array_b[i] != NULL; i++)
+       for (i = 0; array_a[i] && array_b[i]; i++)
                if (g_strcmp0(array_a[i], array_b[i]) != 0)
-                       return FALSE;
+                       return false;
 
-       return TRUE;
+       return true;
 }
 
 static void dhcpv6_debug(const char *str, void *data)
@@ -158,7 +170,7 @@ static gchar *convert_to_hex(unsigned char *buf, int len)
        gchar *ret = g_try_malloc(len * 2 + 1);
        int i;
 
-       for (i = 0; ret != NULL && i < len; i++)
+       for (i = 0; ret && i < len; i++)
                g_snprintf(ret + i * 2, 3, "%02x", buf[i]);
 
        return ret;
@@ -181,17 +193,17 @@ static int set_duid(struct connman_service *service,
        ident = __connman_service_get_ident(service);
 
        keyfile = connman_storage_load_service(ident);
-       if (keyfile == NULL)
+       if (!keyfile)
                return -EINVAL;
 
        hex_duid = g_key_file_get_string(keyfile, ident, "IPv6.DHCP.DUID",
                                        NULL);
-       if (hex_duid != NULL) {
+       if (hex_duid) {
                unsigned int i, j = 0, hex;
                size_t hex_duid_len = strlen(hex_duid);
 
                duid = g_try_malloc0(hex_duid_len / 2);
-               if (duid == NULL) {
+               if (!duid) {
                        g_key_file_free(keyfile);
                        g_free(hex_duid);
                        return -ENOMEM;
@@ -215,7 +227,7 @@ static int set_duid(struct connman_service *service,
                }
 
                hex_duid = convert_to_hex(duid, duid_len);
-               if (hex_duid == NULL) {
+               if (!hex_duid) {
                        g_key_file_free(keyfile);
                        return -ENOMEM;
                }
@@ -265,6 +277,10 @@ static void clear_callbacks(GDHCPClient *dhcp_client)
                                NULL, NULL);
 
        g_dhcp_client_register_event(dhcp_client,
+                               G_DHCP_CLIENT_EVENT_DECLINE,
+                               NULL, NULL);
+
+       g_dhcp_client_register_event(dhcp_client,
                                G_DHCP_CLIENT_EVENT_INFORMATION_REQ,
                                NULL, NULL);
 }
@@ -280,7 +296,7 @@ static void info_req_cb(GDHCPClient *dhcp_client, gpointer user_data)
        DBG("dhcpv6 information-request %p", dhcp);
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL) {
+       if (!service) {
                connman_error("Can not lookup service");
                return;
        }
@@ -291,27 +307,27 @@ static void info_req_cb(GDHCPClient *dhcp_client, gpointer user_data)
        entries = g_list_length(option);
 
        nameservers = g_try_new0(char *, entries + 1);
-       if (nameservers != NULL) {
+       if (nameservers) {
                for (i = 0, list = option; list; list = list->next, i++)
                        nameservers[i] = g_strdup(list->data);
        }
 
-       if (compare_string_arrays(nameservers, dhcp->nameservers) == FALSE) {
-               if (dhcp->nameservers != NULL) {
-                       for (i = 0; dhcp->nameservers[i] != NULL; i++)
+       if (!compare_string_arrays(nameservers, dhcp->nameservers)) {
+               if (dhcp->nameservers) {
+                       for (i = 0; dhcp->nameservers[i]; i++)
                                __connman_service_nameserver_remove(service,
                                                        dhcp->nameservers[i],
-                                                       FALSE);
+                                                       false);
                        g_strfreev(dhcp->nameservers);
                }
 
                dhcp->nameservers = nameservers;
 
-               for (i = 0; dhcp->nameservers != NULL &&
-                                       dhcp->nameservers[i] != NULL; i++)
+               for (i = 0; dhcp->nameservers &&
+                                       dhcp->nameservers[i]; i++)
                        __connman_service_nameserver_append(service,
                                                dhcp->nameservers[i],
-                                               FALSE);
+                                               false);
        } else
                g_strfreev(nameservers);
 
@@ -320,14 +336,14 @@ static void info_req_cb(GDHCPClient *dhcp_client, gpointer user_data)
        entries = g_list_length(option);
 
        timeservers = g_try_new0(char *, entries + 1);
-       if (timeservers != NULL) {
+       if (timeservers) {
                for (i = 0, list = option; list; list = list->next, i++)
                        timeservers[i] = g_strdup(list->data);
        }
 
-       if (compare_string_arrays(timeservers, dhcp->timeservers) == FALSE) {
-               if (dhcp->timeservers != NULL) {
-                       for (i = 0; dhcp->timeservers[i] != NULL; i++)
+       if (!compare_string_arrays(timeservers, dhcp->timeservers)) {
+               if (dhcp->timeservers) {
+                       for (i = 0; dhcp->timeservers[i]; i++)
                                __connman_service_timeserver_remove(service,
                                                        dhcp->timeservers[i]);
                        g_strfreev(dhcp->timeservers);
@@ -335,17 +351,20 @@ static void info_req_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
                dhcp->timeservers = timeservers;
 
-               for (i = 0; dhcp->timeservers != NULL &&
-                                       dhcp->timeservers[i] != NULL; i++)
+               for (i = 0; dhcp->timeservers &&
+                                       dhcp->timeservers[i]; i++)
                        __connman_service_timeserver_append(service,
                                                        dhcp->timeservers[i]);
        } else
                g_strfreev(timeservers);
 
 
-       if (dhcp->callback != NULL) {
+       if (dhcp->callback) {
                uint16_t status = g_dhcpv6_client_get_status(dhcp_client);
-               dhcp->callback(dhcp->network, status == 0 ? TRUE : FALSE);
+               dhcp->callback(dhcp->network, status == 0 ?
+                                               CONNMAN_DHCPV6_STATUS_SUCCEED :
+                                               CONNMAN_DHCPV6_STATUS_FAIL,
+                               NULL);
        }
 }
 
@@ -370,7 +389,7 @@ static int dhcpv6_info_request(struct connman_dhcpv6 *dhcp)
                g_dhcp_client_set_debug(dhcp_client, dhcpv6_debug, "DHCPv6");
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL) {
+       if (!service) {
                clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return -EINVAL;
@@ -412,11 +431,14 @@ static int check_ipv6_addr_prefix(GSList *prefixes, char *address)
                                                0xF0, 0xE0, 0xC0, 0x80 };
                int left, count, i, plen;
 
-               if (slash == NULL)
+               if (!slash)
                        continue;
 
                prefix = g_strndup(prefix, slash - prefix);
                len = strtol(slash + 1, NULL, 10);
+               if (len < 3 || len > 128)
+                       break;
+
                plen = 128 - len;
 
                count = plen / 8;
@@ -445,54 +467,62 @@ static int check_ipv6_addr_prefix(GSList *prefixes, char *address)
        return ret;
 }
 
-static int set_addresses(GDHCPClient *dhcp_client,
+static int set_other_addresses(GDHCPClient *dhcp_client,
                                                struct connman_dhcpv6 *dhcp)
 {
        struct connman_service *service;
-       struct connman_ipconfig *ipconfig;
        int entries, i;
        GList *option, *list;
        char **nameservers, **timeservers;
-       const char *c_address;
-       char *address = NULL;
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL) {
+       if (!service) {
                connman_error("Can not lookup service");
                return -EINVAL;
        }
 
-       ipconfig = __connman_service_get_ip6config(service);
-       if (ipconfig == NULL) {
-               connman_error("Could not lookup ip6config");
-               return -EINVAL;
+       /*
+        * Check domains before nameservers so that the nameserver append
+        * function will update domain list in service.c
+        */
+       option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_DOMAIN_LIST);
+       entries = g_list_length(option);
+       if (entries > 0) {
+               char **domains = g_try_new0(char *, entries + 1);
+               if (domains) {
+                       for (i = 0, list = option; list;
+                                               list = list->next, i++)
+                               domains[i] = g_strdup(list->data);
+                       __connman_service_update_search_domains(service, domains);
+                       g_strfreev(domains);
+               }
        }
 
        option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_DNS_SERVERS);
        entries = g_list_length(option);
 
        nameservers = g_try_new0(char *, entries + 1);
-       if (nameservers != NULL) {
+       if (nameservers) {
                for (i = 0, list = option; list; list = list->next, i++)
                        nameservers[i] = g_strdup(list->data);
        }
 
-       if (compare_string_arrays(nameservers, dhcp->nameservers) == FALSE) {
-               if (dhcp->nameservers != NULL) {
-                       for (i = 0; dhcp->nameservers[i] != NULL; i++)
+       if (!compare_string_arrays(nameservers, dhcp->nameservers)) {
+               if (dhcp->nameservers) {
+                       for (i = 0; dhcp->nameservers[i]; i++)
                                __connman_service_nameserver_remove(service,
                                                        dhcp->nameservers[i],
-                                                       FALSE);
+                                                       false);
                        g_strfreev(dhcp->nameservers);
                }
 
                dhcp->nameservers = nameservers;
 
-               for (i = 0; dhcp->nameservers != NULL &&
-                                       dhcp->nameservers[i] != NULL; i++)
+               for (i = 0; dhcp->nameservers &&
+                                       dhcp->nameservers[i]; i++)
                        __connman_service_nameserver_append(service,
                                                        dhcp->nameservers[i],
-                                                       FALSE);
+                                                       false);
        } else
                g_strfreev(nameservers);
 
@@ -501,14 +531,14 @@ static int set_addresses(GDHCPClient *dhcp_client,
        entries = g_list_length(option);
 
        timeservers = g_try_new0(char *, entries + 1);
-       if (timeservers != NULL) {
+       if (timeservers) {
                for (i = 0, list = option; list; list = list->next, i++)
                        timeservers[i] = g_strdup(list->data);
        }
 
-       if (compare_string_arrays(timeservers, dhcp->timeservers) == FALSE) {
-               if (dhcp->timeservers != NULL) {
-                       for (i = 0; dhcp->timeservers[i] != NULL; i++)
+       if (!compare_string_arrays(timeservers, dhcp->timeservers)) {
+               if (dhcp->timeservers) {
+                       for (i = 0; dhcp->timeservers[i]; i++)
                                __connman_service_timeserver_remove(service,
                                                        dhcp->timeservers[i]);
                        g_strfreev(dhcp->timeservers);
@@ -516,33 +546,90 @@ static int set_addresses(GDHCPClient *dhcp_client,
 
                dhcp->timeservers = timeservers;
 
-               for (i = 0; dhcp->timeservers != NULL &&
-                                       dhcp->timeservers[i] != NULL; i++)
+               for (i = 0; dhcp->timeservers &&
+                                       dhcp->timeservers[i]; i++)
                        __connman_service_timeserver_append(service,
                                                        dhcp->timeservers[i]);
        } else
                g_strfreev(timeservers);
 
+       return 0;
+}
 
-       option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_IA_NA);
-       if (option != NULL)
-               address = g_strdup(option->data);
-       else {
-               option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_IA_TA);
-               if (option != NULL)
-                       address = g_strdup(option->data);
-       }
+static GSList *copy_prefixes(GSList *prefixes)
+{
+       GSList *list, *copy = NULL;
+
+       for (list = prefixes; list; list = list->next)
+               copy = g_slist_prepend(copy, g_strdup(list->data));
+
+       return copy;
+}
+
+/*
+ * Helper struct for doing DAD (duplicate address detection).
+ * It is refcounted and freed after all reply's to neighbor
+ * discovery request are received.
+ */
+struct own_address {
+       int refcount;
+
+       int ifindex;
+       GDHCPClient *dhcp_client;
+       struct connman_ipconfig *ipconfig;
+       GSList *prefixes;
+       dhcpv6_cb callback;
+
+       GSList *dad_failed;
+       GSList *dad_succeed;
+};
+
+static void free_own_address(struct own_address *data)
+{
+       g_dhcp_client_unref(data->dhcp_client);
+       __connman_ipconfig_unref(data->ipconfig);
+       g_slist_free_full(data->prefixes, free_prefix);
+       g_slist_free_full(data->dad_failed, g_free);
+       g_slist_free_full(data->dad_succeed, g_free);
+
+       g_free(data);
+}
+
+static struct own_address *ref_own_address(struct own_address *address)
+{
+       DBG("%p ref %d", address, address->refcount + 1);
+
+       __sync_fetch_and_add(&address->refcount, 1);
+
+       return address;
+}
+
+static void unref_own_address(struct own_address *address)
+{
+       if (!address)
+               return;
+
+       DBG("%p ref %d", address, address->refcount - 1);
+
+       if (__sync_fetch_and_sub(&address->refcount, 1) != 1)
+               return;
+
+       free_own_address(address);
+}
+
+static void set_address(int ifindex, struct connman_ipconfig *ipconfig,
+                       GSList *prefixes, char *address)
+{
+       const char *c_address;
 
        c_address = __connman_ipconfig_get_local(ipconfig);
 
-       if (address != NULL &&
-                       ((c_address != NULL &&
-                               g_strcmp0(address, c_address) != 0) ||
-                       (c_address == NULL))) {
+       if (address && ((c_address && g_strcmp0(address, c_address) != 0) ||
+                                                               !c_address)) {
                int prefix_len;
 
                /* Is this prefix part of the subnet we are suppose to use? */
-               prefix_len = check_ipv6_addr_prefix(dhcp->prefixes, address);
+               prefix_len = check_ipv6_addr_prefix(prefixes, address);
 
                __connman_ipconfig_set_local(ipconfig, address);
                __connman_ipconfig_set_prefixlen(ipconfig, prefix_len);
@@ -550,217 +637,358 @@ static int set_addresses(GDHCPClient *dhcp_client,
                DBG("new address %s/%d", address, prefix_len);
 
                __connman_ipconfig_set_dhcp_address(ipconfig, address);
-               __connman_service_save(service);
+               __connman_service_save(
+                       __connman_service_lookup_from_index(ifindex));
        }
+}
 
-       g_free(address);
 
-       return 0;
+/*
+ * Helper struct that is used when waiting a reply to DECLINE message.
+ */
+struct decline_cb_data {
+       GDHCPClient *dhcp_client;
+       dhcpv6_cb callback;
+       int ifindex;
+       guint timeout;
+};
+
+static void decline_reply_callback(struct decline_cb_data *data)
+{
+       struct connman_network *network;
+       struct connman_service *service;
+
+       service = __connman_service_lookup_from_index(data->ifindex);
+       network = __connman_service_get_network(service);
+
+       if (data->callback)
+               data->callback(network, CONNMAN_DHCPV6_STATUS_RESTART, NULL);
+
+       g_dhcp_client_unref(data->dhcp_client);
 }
 
-static void re_cb(GDHCPClient *dhcp_client, gpointer user_data)
+static gboolean decline_timeout(gpointer user_data)
 {
-       struct connman_dhcpv6 *dhcp = user_data;
-       uint16_t status;
-       int ret;
+       struct decline_cb_data *data = user_data;
 
-       ret = set_addresses(dhcp_client, dhcp);
+       DBG("ifindex %d", data->ifindex);
 
-       status = g_dhcpv6_client_get_status(dhcp_client);
+       /*
+        * We ignore all DECLINE replies that are received after the timeout
+        */
+       g_dhcp_client_register_event(data->dhcp_client,
+                                       G_DHCP_CLIENT_EVENT_DECLINE,
+                                       NULL, NULL);
 
-       DBG("dhcpv6 cb msg %p ret %d status %d", dhcp, ret, status);
+       decline_reply_callback(data);
 
-       if (ret < 0) {
-               if (dhcp->callback != NULL)
-                       dhcp->callback(dhcp->network, FALSE);
-               return;
-       }
+       g_free(data);
 
-       if (status  == G_DHCPV6_ERROR_BINDING) {
-               /* RFC 3315, 18.1.8 */
-               dhcpv6_request(dhcp, FALSE);
-       } else {
-               if (dhcp->callback != NULL)
-                       dhcp->callback(dhcp->network,
-                                               status == 0 ? TRUE : FALSE);
-       }
+       return FALSE;
 }
 
-static void rebind_cb(GDHCPClient *dhcp_client, gpointer user_data)
+static void decline_cb(GDHCPClient *dhcp_client, gpointer user_data)
 {
-       DBG("");
+       struct decline_cb_data *data = user_data;
+
+       DBG("ifindex %d", data->ifindex);
 
-       g_dhcpv6_client_reset_rebind(dhcp_client);
-       g_dhcpv6_client_reset_renew(dhcp_client);
        g_dhcpv6_client_clear_retransmit(dhcp_client);
 
-       re_cb(dhcp_client, user_data);
+       if (data->timeout)
+               g_source_remove(data->timeout);
+
+       decline_reply_callback(data);
+
+       g_free(data);
 }
 
-static int dhcpv6_rebind(struct connman_dhcpv6 *dhcp)
+static int dhcpv6_decline(GDHCPClient *dhcp_client, int ifindex,
+                       dhcpv6_cb callback, GSList *failed)
 {
-       GDHCPClient *dhcp_client;
-
-       DBG("dhcp %p", dhcp);
+       struct decline_cb_data *data;
+       GList *option;
+       int code;
 
-       dhcp_client = dhcp->dhcp_client;
+       DBG("dhcp_client %p", dhcp_client);
 
        g_dhcp_client_clear_requests(dhcp_client);
 
+       g_dhcpv6_client_clear_send(dhcp_client, G_DHCPV6_ORO);
+
        g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DOMAIN_LIST);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
 
-       g_dhcpv6_client_set_oro(dhcp_client, 3, G_DHCPV6_DNS_SERVERS,
-                               G_DHCPV6_DOMAIN_LIST, G_DHCPV6_SNTP_SERVERS);
+       option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_IA_NA);
+       if (!option) {
+               option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_IA_TA);
+               if (option)
+                       code = G_DHCPV6_IA_TA;
+               else
+                       return -EINVAL;
+       } else
+               code = G_DHCPV6_IA_NA;
 
-       g_dhcpv6_client_set_ia(dhcp_client,
-                       connman_network_get_index(dhcp->network),
-                       dhcp->use_ta == TRUE ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
-                       NULL, NULL, FALSE, NULL);
+       g_dhcpv6_client_clear_send(dhcp_client, code);
+
+       g_dhcpv6_client_set_ias(dhcp_client, ifindex, code, NULL, NULL,
+                               failed);
 
        clear_callbacks(dhcp_client);
 
-       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_REBIND,
-                                       rebind_cb, dhcp);
+       data = g_try_new(struct decline_cb_data, 1);
+       if (!data)
+               return -ENOMEM;
 
-       dhcp->dhcp_client = dhcp_client;
+       data->ifindex = ifindex;
+       data->callback = callback;
+       data->dhcp_client = g_dhcp_client_ref(dhcp_client);
+       data->timeout = g_timeout_add(DEC_TIMEOUT, decline_timeout, data);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_DECLINE,
+                               decline_cb, data);
 
        return g_dhcp_client_start(dhcp_client, NULL);
 }
 
-static gboolean dhcpv6_restart(gpointer user_data)
+static void dad_reply(struct nd_neighbor_advert *reply,
+               unsigned int length, struct in6_addr *addr, void *user_data)
 {
-       struct connman_dhcpv6 *dhcp = user_data;
+       struct own_address *data = user_data;
+       GSList *list;
+       char address[INET6_ADDRSTRLEN];
+       enum __connman_dhcpv6_status status = CONNMAN_DHCPV6_STATUS_FAIL;
 
-       if (dhcp->callback != NULL)
-               dhcp->callback(dhcp->network, FALSE);
+       inet_ntop(AF_INET6, addr, address, INET6_ADDRSTRLEN);
 
-       return FALSE;
-}
+       DBG("user %p reply %p len %d address %s index %d data %p", user_data,
+               reply, length, address, data->ifindex, data);
 
-/*
- * Check if we need to restart the solicitation procedure. This
- * is done if all the addresses have expired. RFC 3315, 18.1.4
- */
-static int check_restart(struct connman_dhcpv6 *dhcp)
-{
-       time_t current, expired;
+       if (!reply) {
+               if (length == 0)
+                       DBG("DAD succeed for %s", address);
+               else
+                       DBG("DAD cannot be done for %s", address);
 
-       g_dhcpv6_client_get_timeouts(dhcp->dhcp_client, NULL, NULL,
-                               NULL, NULL, &expired);
-       current = time(NULL);
+               data->dad_succeed = g_slist_prepend(data->dad_succeed,
+                                               g_strdup(address));
 
-       if (current > expired) {
-               DBG("expired by %d secs", (int)(current - expired));
+       } else {
+               DBG("DAD failed for %s", address);
 
-               g_timeout_add(0, dhcpv6_restart, dhcp);
+               data->dad_failed = g_slist_prepend(data->dad_failed,
+                                               g_strdup(address));
+       }
 
-               return -ETIMEDOUT;
+       /*
+        * If refcount == 1 then we got the final reply and can continue.
+        */
+       if (data->refcount > 1)
+               return;
+
+       for (list = data->dad_succeed; list; list = list->next)
+               set_address(data->ifindex, data->ipconfig, data->prefixes,
+                                                               list->data);
+
+       if (data->dad_failed) {
+               dhcpv6_decline(data->dhcp_client, data->ifindex,
+                       data->callback, data->dad_failed);
+       } else {
+               if (data->dad_succeed)
+                       status = CONNMAN_DHCPV6_STATUS_SUCCEED;
+
+               if (data->callback) {
+                       struct connman_network *network;
+                       struct connman_service *service;
+
+                       service = __connman_service_lookup_from_index(
+                                                               data->ifindex);
+                       network = __connman_service_get_network(service);
+                       data->callback(network, status, NULL);
+               }
        }
 
-       return 0;
+       unref_own_address(data);
 }
 
-static gboolean timeout_rebind(gpointer user_data)
+/*
+ * Is the kernel configured to do DAD? If 0, then do not do DAD.
+ * See also RFC 4862 chapter 5.4 about DupAddrDetectTransmits
+ */
+static int dad_transmits(int ifindex)
 {
-       struct connman_dhcpv6 *dhcp = user_data;
+       char name[IF_NAMESIZE];
+       gchar *path;
+       int value = 1;
+       FILE *f;
 
-       if (check_restart(dhcp) < 0)
-               return FALSE;
+       if (!if_indextoname(ifindex, name))
+               return value;
 
-       dhcp->RT = calc_delay(dhcp->RT, REB_MAX_RT);
+       path = g_strdup_printf("/proc/sys/net/ipv6/conf/%s/dad_transmits",
+                                                               name);
 
-       DBG("rebind RT timeout %d msec", dhcp->RT);
+       if (!path)
+               return value;
 
-       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_rebind, dhcp);
+       f = fopen(path, "r");
 
-       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+       g_free(path);
 
-       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+       if (f) {
+               if (fscanf(f, "%d", &value) < 0)
+                       value = 1;
 
-       return FALSE;
+               fclose(f);
+       }
+
+       return value;
 }
 
-static gboolean start_rebind(gpointer user_data)
+static void do_dad(GDHCPClient *dhcp_client, struct connman_dhcpv6 *dhcp)
 {
-       struct connman_dhcpv6 *dhcp = user_data;
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig;
+       int ifindex;
+       GList *option, *list;
+       struct own_address *user_data;
 
-       dhcp->RT = REB_TIMEOUT * (1 + get_random());
+       option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_IA_NA);
+       if (!option)
+               option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_IA_TA);
 
-       DBG("rebind initial RT timeout %d msec", dhcp->RT);
+       /*
+        * Even if we didn't had any addresses, just try to set
+        * the other options.
+        */
+       set_other_addresses(dhcp_client, dhcp);
 
-       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_rebind, dhcp);
+       if (!option) {
+               DBG("Skip DAD as no addresses found in reply");
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_SUCCEED, NULL);
 
-       dhcpv6_rebind(dhcp);
+               return;
+       }
 
-       return FALSE;
-}
+       ifindex = connman_network_get_index(dhcp->network);
 
-static void request_cb(GDHCPClient *dhcp_client, gpointer user_data)
-{
-       DBG("");
+       DBG("index %d", ifindex);
 
-       g_dhcpv6_client_clear_retransmit(dhcp_client);
+       service = connman_service_lookup_from_network(dhcp->network);
+       if (!service) {
+               connman_error("Can not lookup service for index %d", ifindex);
+               goto error;
+       }
 
-       re_cb(dhcp_client, user_data);
-}
+       ipconfig = __connman_service_get_ip6config(service);
+       if (!ipconfig) {
+               connman_error("Could not lookup ip6config for index %d",
+                                                               ifindex);
+               goto error;
+       }
 
-static int dhcpv6_request(struct connman_dhcpv6 *dhcp,
-                       gboolean add_addresses)
-{
-       GDHCPClient *dhcp_client;
-       uint32_t T1, T2;
+       if (!dad_transmits(ifindex)) {
+               DBG("Skip DAD because of kernel configuration");
 
-       DBG("dhcp %p add %d", dhcp, add_addresses);
+               for (list = option; list; list = list->next)
+                       set_address(ifindex, ipconfig, dhcp->prefixes,
+                                                       option->data);
 
-       dhcp_client = dhcp->dhcp_client;
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_SUCCEED, NULL);
 
-       g_dhcp_client_clear_requests(dhcp_client);
+               return;
+       }
 
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DOMAIN_LIST);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+       if (g_list_length(option) == 0) {
+               DBG("No addresses when doing DAD");
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_SUCCEED, NULL);
 
-       g_dhcpv6_client_set_oro(dhcp_client, 3, G_DHCPV6_DNS_SERVERS,
-                               G_DHCPV6_DOMAIN_LIST, G_DHCPV6_SNTP_SERVERS);
+               return;
+       }
 
-       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL, NULL);
-       g_dhcpv6_client_set_ia(dhcp_client,
-                       connman_network_get_index(dhcp->network),
-                       dhcp->use_ta == TRUE ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
-                       &T1, &T2, add_addresses, NULL);
+       user_data = g_try_new0(struct own_address, 1);
+       if (!user_data)
+               goto error;
 
-       clear_callbacks(dhcp_client);
+       user_data->refcount = 0;
+       user_data->ifindex = ifindex;
+       user_data->dhcp_client = g_dhcp_client_ref(dhcp_client);
+       user_data->ipconfig = __connman_ipconfig_ref(ipconfig);
+       user_data->prefixes = copy_prefixes(dhcp->prefixes);
+       user_data->callback = dhcp->callback;
 
-       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_REQUEST,
-                                       request_cb, dhcp);
+       /*
+        * We send one neighbor discovery request / address
+        * and after all checks are done, then report the status
+        * via dhcp callback.
+        */
 
-       dhcp->dhcp_client = dhcp_client;
+       for (list = option; list; list = list->next) {
+               char *address = option->data;
+               struct in6_addr addr;
+               int ret;
 
-       return g_dhcp_client_start(dhcp_client, NULL);
+               ref_own_address(user_data);
+
+               if (inet_pton(AF_INET6, address, &addr) < 0) {
+                       DBG("Invalid IPv6 address %s %d/%s", address,
+                               -errno, strerror(errno));
+                       goto fail;
+               }
+
+               DBG("user %p address %s client %p ipconfig %p prefixes %p",
+                       user_data, address,
+                       user_data->dhcp_client, user_data->ipconfig,
+                       user_data->prefixes);
+
+               ret = __connman_inet_ipv6_do_dad(ifindex, 1000,
+                                               &addr,
+                                               dad_reply,
+                                               user_data);
+               if (ret < 0) {
+                       DBG("Could not send neighbor solicitation for %s",
+                                                               address);
+                       dad_reply(NULL, -1, &addr, user_data);
+               } else {
+                       DBG("Sent neighbor solicitation %d bytes", ret);
+               }
+       }
+
+       return;
+
+fail:
+       unref_own_address(user_data);
+
+error:
+       if (dhcp->callback)
+               dhcp->callback(dhcp->network, CONNMAN_DHCPV6_STATUS_FAIL,
+                                                               NULL);
 }
 
-static gboolean timeout_request(gpointer user_data)
+static gboolean timeout_request_resend(gpointer user_data)
 {
        struct connman_dhcpv6 *dhcp = user_data;
 
        if (dhcp->request_count >= REQ_MAX_RC) {
                DBG("max request retry attempts %d", dhcp->request_count);
                dhcp->request_count = 0;
-               if (dhcp->callback != NULL)
-                       dhcp->callback(dhcp->network, FALSE);
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
                return FALSE;
        }
 
        dhcp->request_count++;
 
        dhcp->RT = calc_delay(dhcp->RT, REQ_MAX_RT);
-       DBG("request RT timeout %d msec", dhcp->RT);
-       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_request, dhcp);
+       DBG("request resend RT timeout %d msec", dhcp->RT);
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_request_resend, dhcp);
 
        g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
 
@@ -769,26 +997,329 @@ static gboolean timeout_request(gpointer user_data)
        return FALSE;
 }
 
-static void renew_cb(GDHCPClient *dhcp_client, gpointer user_data)
+static gboolean request_resend(gpointer user_data)
 {
-       DBG("");
+       struct connman_dhcpv6 *dhcp = user_data;
 
-       g_dhcpv6_client_reset_renew(dhcp_client);
-       g_dhcpv6_client_clear_retransmit(dhcp_client);
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
 
-       re_cb(dhcp_client, user_data);
+       dhcp->RT = calc_delay(dhcp->RT, REQ_MAX_RT);
+       DBG("request resend RT timeout %d msec", dhcp->RT);
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_request_resend, dhcp);
+
+       dhcpv6_request(dhcp, true);
+
+       return FALSE;
 }
 
-static int dhcpv6_renew(struct connman_dhcpv6 *dhcp)
+static void do_resend_request(struct connman_dhcpv6 *dhcp)
 {
-       GDHCPClient *dhcp_client;
-       uint32_t T1, T2;
-
-       DBG("dhcp %p", dhcp);
+       if (dhcp->request_count >= REQ_MAX_RC) {
+               DBG("max request retry attempts %d", dhcp->request_count);
+               dhcp->request_count = 0;
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               return;
+       }
 
-       dhcp_client = dhcp->dhcp_client;
+       dhcp->request_count++;
 
-       g_dhcp_client_clear_requests(dhcp_client);
+       dhcp->RT = calc_delay(dhcp->RT, REQ_MAX_RT);
+       DBG("resending request after %d msec", dhcp->RT);
+       dhcp->timeout = g_timeout_add(dhcp->RT, request_resend, dhcp);
+}
+
+static void re_cb(enum request_type req_type, GDHCPClient *dhcp_client,
+               gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+       uint16_t status;
+
+       clear_timer(dhcp);
+
+       status = g_dhcpv6_client_get_status(dhcp_client);
+
+       DBG("dhcpv6 cb msg %p status %d", dhcp, status);
+
+       /*
+        * RFC 3315, 18.1.8 handle the resend if error
+        */
+       if (status  == G_DHCPV6_ERROR_BINDING) {
+               dhcpv6_request(dhcp, false);
+       } else if (status  == G_DHCPV6_ERROR_MCAST) {
+               switch (req_type) {
+               case REQ_REQUEST:
+                       dhcpv6_request(dhcp, true);
+                       break;
+               case REQ_REBIND:
+                       dhcpv6_rebind(dhcp);
+                       break;
+               case REQ_RENEW:
+                       dhcpv6_renew(dhcp);
+                       break;
+               }
+       } else if (status  == G_DHCPV6_ERROR_LINK) {
+               if (req_type == REQ_REQUEST) {
+                       g_dhcp_client_unref(dhcp->dhcp_client);
+                       start_solicitation(dhcp);
+               } else {
+                       if (dhcp->callback)
+                               dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               }
+       } else if (status  == G_DHCPV6_ERROR_FAILURE) {
+               if (req_type == REQ_REQUEST) {
+                       /* Rate limit the resend of request message */
+                       do_resend_request(dhcp);
+               } else {
+                       if (dhcp->callback)
+                               dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               }
+       } else {
+
+               /*
+                * If we did not got any addresses, then re-send
+                * a request.
+                */
+               GList *option;
+
+               option = g_dhcp_client_get_option(dhcp->dhcp_client,
+                                               G_DHCPV6_IA_NA);
+               if (!option) {
+                       option = g_dhcp_client_get_option(dhcp->dhcp_client,
+                                                       G_DHCPV6_IA_TA);
+                       if (!option) {
+                               switch (req_type) {
+                               case REQ_REQUEST:
+                                       dhcpv6_request(dhcp, true);
+                                       break;
+                               case REQ_REBIND:
+                                       dhcpv6_rebind(dhcp);
+                                       break;
+                               case REQ_RENEW:
+                                       dhcpv6_renew(dhcp);
+                                       break;
+                               }
+                               return;
+                       }
+               }
+
+               if (status == G_DHCPV6_ERROR_SUCCESS)
+                       do_dad(dhcp_client, dhcp);
+               else if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                               CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+       }
+}
+
+static void rebind_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       DBG("");
+
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       re_cb(REQ_REBIND, dhcp_client, user_data);
+}
+
+static int dhcpv6_rebind(struct connman_dhcpv6 *dhcp)
+{
+       GDHCPClient *dhcp_client;
+
+       DBG("dhcp %p", dhcp);
+
+       dhcp_client = dhcp->dhcp_client;
+
+       g_dhcp_client_clear_requests(dhcp_client);
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DOMAIN_LIST);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_set_oro(dhcp_client, 3, G_DHCPV6_DNS_SERVERS,
+                               G_DHCPV6_DOMAIN_LIST, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_set_ia(dhcp_client,
+                       connman_network_get_index(dhcp->network),
+                       dhcp->use_ta ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
+                       NULL, NULL, TRUE, NULL);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_REBIND,
+                                       rebind_cb, dhcp);
+
+       dhcp->dhcp_client = dhcp_client;
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+static gboolean dhcpv6_restart(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (dhcp->callback)
+               dhcp->callback(dhcp->network, CONNMAN_DHCPV6_STATUS_FAIL,
+                                                               NULL);
+
+       return FALSE;
+}
+
+/*
+ * Check if we need to restart the solicitation procedure. This
+ * is done if all the addresses have expired. RFC 3315, 18.1.4
+ */
+static int check_restart(struct connman_dhcpv6 *dhcp)
+{
+       time_t current, expired;
+
+       g_dhcpv6_client_get_timeouts(dhcp->dhcp_client, NULL, NULL,
+                               NULL, &expired);
+       current = time(NULL);
+
+       if (current >= expired) {
+               DBG("expired by %d secs", (int)(current - expired));
+
+               g_timeout_add(0, dhcpv6_restart, dhcp);
+
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static gboolean timeout_rebind(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (check_restart(dhcp) < 0)
+               return FALSE;
+
+       dhcp->RT = calc_delay(dhcp->RT, REB_MAX_RT);
+
+       DBG("rebind RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_rebind, dhcp);
+
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+
+       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+
+       return FALSE;
+}
+
+static gboolean start_rebind(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (check_restart(dhcp) < 0)
+               return FALSE;
+
+       dhcp->RT = REB_TIMEOUT * (1 + get_random());
+
+       DBG("rebind initial RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_rebind, dhcp);
+
+       dhcpv6_rebind(dhcp);
+
+       return FALSE;
+}
+
+static void request_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       DBG("");
+
+       g_dhcpv6_client_reset_request(dhcp_client);
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       re_cb(REQ_REQUEST, dhcp_client, user_data);
+}
+
+static int dhcpv6_request(struct connman_dhcpv6 *dhcp,
+                       bool add_addresses)
+{
+       GDHCPClient *dhcp_client;
+       uint32_t T1, T2;
+
+       DBG("dhcp %p add %d", dhcp, add_addresses);
+
+       dhcp_client = dhcp->dhcp_client;
+
+       g_dhcp_client_clear_requests(dhcp_client);
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DOMAIN_LIST);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_set_oro(dhcp_client, 3, G_DHCPV6_DNS_SERVERS,
+                               G_DHCPV6_DOMAIN_LIST, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL);
+       g_dhcpv6_client_set_ia(dhcp_client,
+                       connman_network_get_index(dhcp->network),
+                       dhcp->use_ta ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
+                       &T1, &T2, add_addresses, NULL);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_REQUEST,
+                                       request_cb, dhcp);
+
+       dhcp->dhcp_client = dhcp_client;
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+static gboolean timeout_request(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (dhcp->request_count >= REQ_MAX_RC) {
+               DBG("max request retry attempts %d", dhcp->request_count);
+               dhcp->request_count = 0;
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               return FALSE;
+       }
+
+       dhcp->request_count++;
+
+       dhcp->RT = calc_delay(dhcp->RT, REQ_MAX_RT);
+       DBG("request RT timeout %d msec", dhcp->RT);
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_request, dhcp);
+
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+
+       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+
+       return FALSE;
+}
+
+static void renew_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       DBG("");
+
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       re_cb(REQ_RENEW, dhcp_client, user_data);
+}
+
+static int dhcpv6_renew(struct connman_dhcpv6 *dhcp)
+{
+       GDHCPClient *dhcp_client;
+       uint32_t T1, T2;
+
+       DBG("dhcp %p", dhcp);
+
+       dhcp_client = dhcp->dhcp_client;
+
+       g_dhcp_client_clear_requests(dhcp_client);
 
        g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
        g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
@@ -799,10 +1330,10 @@ static int dhcpv6_renew(struct connman_dhcpv6 *dhcp)
        g_dhcpv6_client_set_oro(dhcp_client, 3, G_DHCPV6_DNS_SERVERS,
                                G_DHCPV6_DOMAIN_LIST, G_DHCPV6_SNTP_SERVERS);
 
-       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL, NULL);
+       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL);
        g_dhcpv6_client_set_ia(dhcp_client,
                        connman_network_get_index(dhcp->network),
-                       dhcp->use_ta == TRUE ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
+                       dhcp->use_ta ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
                        &T1, &T2, TRUE, NULL);
 
        clear_callbacks(dhcp_client);
@@ -818,10 +1349,23 @@ static int dhcpv6_renew(struct connman_dhcpv6 *dhcp)
 static gboolean timeout_renew(gpointer user_data)
 {
        struct connman_dhcpv6 *dhcp = user_data;
+       time_t last_rebind, current;
+       uint32_t T2;
 
        if (check_restart(dhcp) < 0)
                return FALSE;
 
+       g_dhcpv6_client_get_timeouts(dhcp->dhcp_client, NULL, &T2,
+                               &last_rebind, NULL);
+       current = time(NULL);
+       if ((unsigned)current >= (unsigned)last_rebind + T2) {
+               /*
+                * Do rebind instead if past T2
+                */
+               start_rebind(dhcp);
+               return FALSE;
+       }
+
        dhcp->RT = calc_delay(dhcp->RT, REN_MAX_RT);
 
        DBG("renew RT timeout %d msec", dhcp->RT);
@@ -851,14 +1395,14 @@ static gboolean start_renew(gpointer user_data)
 }
 
 int __connman_dhcpv6_start_renew(struct connman_network *network,
-                                                       dhcp_cb callback)
+                                                       dhcpv6_cb callback)
 {
        struct connman_dhcpv6 *dhcp;
        uint32_t T1, T2;
-       time_t last_renew, last_rebind, current, expired;
+       time_t started, current, expired;
 
        dhcp = g_hash_table_lookup(network_table, network);
-       if (dhcp == NULL)
+       if (!dhcp)
                return -ENOENT;
 
        DBG("network %p dhcp %p", network, dhcp);
@@ -866,12 +1410,12 @@ int __connman_dhcpv6_start_renew(struct connman_network *network,
        clear_timer(dhcp);
 
        g_dhcpv6_client_get_timeouts(dhcp->dhcp_client, &T1, &T2,
-                               &last_renew, &last_rebind, &expired);
+                               &started, &expired);
 
        current = time(NULL);
 
-       DBG("T1 %u T2 %u expires %lu current %lu", T1, T2,
-               (unsigned long)expired, current);
+       DBG("T1 %u T2 %u expires %lu current %lu started %lu", T1, T2,
+               (unsigned long)expired, current, started);
 
        if (T1 == 0xffffffff)
                /* RFC 3315, 22.4 */
@@ -883,35 +1427,34 @@ int __connman_dhcpv6_start_renew(struct connman_network *network,
                 */
                T1 = 1800;
 
+       dhcp->callback = callback;
+
        /* RFC 3315, 18.1.4, start solicit if expired */
-       if (current > expired) {
-               DBG("expired by %d secs", (int)(current - expired));
-               return -ETIMEDOUT;
-       }
+       if (check_restart(dhcp) < 0)
+               return 0;
 
-       dhcp->callback = callback;
+       if (T2 != 0xffffffff && T2 > 0) {
+               if ((unsigned)current >= (unsigned)started + T2) {
+                       /* RFC 3315, chapter 18.1.3, start rebind */
+                       DBG("rebind after %d secs", T2);
 
-       if (T2 != 0xffffffff && T2 > 0 &&
-                       (unsigned)current > (unsigned)last_rebind + T2) {
-               int timeout;
+                       dhcp->timeout = g_timeout_add_seconds(T2, start_rebind,
+                                                       dhcp);
 
-               /* RFC 3315, chapter 18.1.3, start rebind */
-               if ((unsigned)current > (unsigned)last_renew + T1)
-                       timeout = 0;
-               else
-                       timeout = last_renew - current + T1;
+               } else if ((unsigned)current < (unsigned)started + T1) {
+                       DBG("renew after %d secs", T1);
 
-               /*
-                * If we just did a renew, do not restart the rebind
-                * immediately.
-                */
-               dhcp->timeout = g_timeout_add_seconds(timeout, start_rebind,
-                                               dhcp);
-       } else {
-               DBG("renew after %d secs", T1);
+                       dhcp->timeout = g_timeout_add_seconds(T1, start_renew,
+                                                       dhcp);
+               } else {
+                       DBG("rebind after %d secs", T2 - T1);
 
-               dhcp->timeout = g_timeout_add_seconds(T1, start_renew, dhcp);
+                       dhcp->timeout = g_timeout_add_seconds(T2 - T1,
+                                                       start_rebind,
+                                                       dhcp);
+               }
        }
+
        return 0;
 }
 
@@ -921,28 +1464,28 @@ static void release_cb(GDHCPClient *dhcp_client, gpointer user_data)
 }
 
 int __connman_dhcpv6_start_release(struct connman_network *network,
-                               dhcp_cb callback)
+                               dhcpv6_cb callback)
 {
        struct connman_dhcpv6 *dhcp;
        GDHCPClient *dhcp_client;
 
-       if (network_table == NULL)
+       if (!network_table)
                return 0;   /* we are already released */
 
        dhcp = g_hash_table_lookup(network_table, network);
-       if (dhcp == NULL)
+       if (!dhcp)
                return -ENOENT;
 
        DBG("network %p dhcp %p client %p stateless %d", network, dhcp,
                                        dhcp->dhcp_client, dhcp->stateless);
 
-       if (dhcp->stateless == TRUE)
+       if (dhcp->stateless)
                return -EINVAL;
 
        clear_timer(dhcp);
 
        dhcp_client = dhcp->dhcp_client;
-       if (dhcp_client == NULL) {
+       if (!dhcp_client) {
                /*
                 * We had started the DHCPv6 handshaking i.e., we have called
                 * __connman_dhcpv6_start() but it has not yet sent
@@ -961,7 +1504,7 @@ int __connman_dhcpv6_start_release(struct connman_network *network,
 
        g_dhcpv6_client_set_ia(dhcp_client,
                        connman_network_get_index(dhcp->network),
-                       dhcp->use_ta == TRUE ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
+                       dhcp->use_ta ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
                        NULL, NULL, TRUE, NULL);
 
        clear_callbacks(dhcp_client);
@@ -991,7 +1534,7 @@ static int dhcpv6_release(struct connman_dhcpv6 *dhcp)
 
        dhcpv6_free(dhcp);
 
-       if (dhcp->dhcp_client == NULL)
+       if (!dhcp->dhcp_client)
                return 0;
 
        g_dhcp_client_stop(dhcp->dhcp_client);
@@ -1047,27 +1590,27 @@ static gboolean start_info_req(gpointer user_data)
 }
 
 int __connman_dhcpv6_start_info(struct connman_network *network,
-                               dhcp_cb callback)
+                               dhcpv6_cb callback)
 {
        struct connman_dhcpv6 *dhcp;
        int delay;
 
        DBG("");
 
-       if (network_table != NULL) {
+       if (network_table) {
                dhcp = g_hash_table_lookup(network_table, network);
-               if (dhcp != NULL && dhcp->started == TRUE)
+               if (dhcp && dhcp->started)
                        return -EBUSY;
        }
 
        dhcp = g_try_new0(struct connman_dhcpv6, 1);
-       if (dhcp == NULL)
+       if (!dhcp)
                return -ENOMEM;
 
        dhcp->network = network;
        dhcp->callback = callback;
-       dhcp->stateless = TRUE;
-       dhcp->started = TRUE;
+       dhcp->stateless = true;
+       dhcp->started = true;
 
        connman_network_ref(network);
 
@@ -1094,8 +1637,9 @@ static void advertise_cb(GDHCPClient *dhcp_client, gpointer user_data)
        g_dhcpv6_client_clear_retransmit(dhcp_client);
 
        if (g_dhcpv6_client_get_status(dhcp_client) != 0) {
-               if (dhcp->callback != NULL)
-                       dhcp->callback(dhcp->network, FALSE);
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
                return;
        }
 
@@ -1105,7 +1649,7 @@ static void advertise_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        dhcp->request_count = 1;
 
-       dhcpv6_request(dhcp, TRUE);
+       dhcpv6_request(dhcp, true);
 }
 
 static void solicitation_cb(GDHCPClient *dhcp_client, gpointer user_data)
@@ -1117,7 +1661,7 @@ static void solicitation_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        clear_timer(dhcp);
 
-       set_addresses(dhcp_client, dhcp);
+       do_dad(dhcp_client, dhcp);
 
        g_dhcpv6_client_clear_retransmit(dhcp_client);
 }
@@ -1161,7 +1705,7 @@ static int dhcpv6_solicitation(struct connman_dhcpv6 *dhcp)
                g_dhcp_client_set_debug(dhcp_client, dhcpv6_debug, "DHCPv6");
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL) {
+       if (!service) {
                clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return -EINVAL;
@@ -1187,7 +1731,7 @@ static int dhcpv6_solicitation(struct connman_dhcpv6 *dhcp)
        dhcp->use_ta = __connman_ipconfig_ipv6_privacy_enabled(ipconfig_ipv6);
 
        g_dhcpv6_client_set_ia(dhcp_client, index,
-                       dhcp->use_ta == TRUE ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
+                       dhcp->use_ta ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
                        NULL, NULL, FALSE, NULL);
 
        clear_callbacks(dhcp_client);
@@ -1230,8 +1774,6 @@ static void confirm_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        clear_timer(dhcp);
 
-       set_addresses(dhcp_client, dhcp);
-
        g_dhcpv6_client_clear_retransmit(dhcp_client);
 
        /*
@@ -1240,8 +1782,9 @@ static void confirm_cb(GDHCPClient *dhcp_client, gpointer user_data)
        if (status != 0) {
                g_dhcp_client_unref(dhcp->dhcp_client);
                start_solicitation(dhcp);
-       } else if (dhcp->callback != NULL)
-               dhcp->callback(dhcp->network, TRUE);
+       } else {
+               do_dad(dhcp_client, dhcp);
+       }
 }
 
 static int dhcpv6_confirm(struct connman_dhcpv6 *dhcp)
@@ -1266,7 +1809,7 @@ static int dhcpv6_confirm(struct connman_dhcpv6 *dhcp)
                g_dhcp_client_set_debug(dhcp_client, dhcpv6_debug, "DHCPv6");
 
        service = connman_service_lookup_from_network(dhcp->network);
-       if (service == NULL) {
+       if (!service) {
                clear_timer(dhcp);
                g_dhcp_client_unref(dhcp_client);
                return -EINVAL;
@@ -1281,18 +1824,12 @@ static int dhcpv6_confirm(struct connman_dhcpv6 *dhcp)
 
        g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
        g_dhcp_client_set_request(dhcp_client, G_DHCPV6_RAPID_COMMIT);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DOMAIN_LIST);
-       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
-
-       g_dhcpv6_client_set_oro(dhcp_client, 3, G_DHCPV6_DNS_SERVERS,
-                               G_DHCPV6_DOMAIN_LIST, G_DHCPV6_SNTP_SERVERS);
 
        ipconfig_ipv6 = __connman_service_get_ip6config(service);
        dhcp->use_ta = __connman_ipconfig_ipv6_privacy_enabled(ipconfig_ipv6);
 
        g_dhcpv6_client_set_ia(dhcp_client, index,
-                       dhcp->use_ta == TRUE ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
+                       dhcp->use_ta ? G_DHCPV6_IA_TA : G_DHCPV6_IA_NA,
                        NULL, NULL, TRUE,
                        __connman_ipconfig_get_dhcp_address(ipconfig_ipv6));
 
@@ -1336,8 +1873,9 @@ static gboolean timeout_max_confirm(gpointer user_data)
 
        g_dhcpv6_client_clear_retransmit(dhcp->dhcp_client);
 
-       if (dhcp->callback != NULL)
-               dhcp->callback(dhcp->network, FALSE);
+       if (dhcp->callback)
+               dhcp->callback(dhcp->network, CONNMAN_DHCPV6_STATUS_FAIL,
+                                                               NULL);
 
        return FALSE;
 }
@@ -1360,7 +1898,7 @@ static gboolean start_confirm(gpointer user_data)
 }
 
 int __connman_dhcpv6_start(struct connman_network *network,
-                               GSList *prefixes, dhcp_cb callback)
+                               GSList *prefixes, dhcpv6_cb callback)
 {
        struct connman_service *service;
        struct connman_ipconfig *ipconfig_ipv6;
@@ -1370,24 +1908,24 @@ int __connman_dhcpv6_start(struct connman_network *network,
 
        DBG("");
 
-       if (network_table != NULL) {
+       if (network_table) {
                dhcp = g_hash_table_lookup(network_table, network);
-               if (dhcp != NULL && dhcp->started == TRUE)
+               if (dhcp && dhcp->started)
                        return -EBUSY;
        }
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        dhcp = g_try_new0(struct connman_dhcpv6, 1);
-       if (dhcp == NULL)
+       if (!dhcp)
                return -ENOMEM;
 
        dhcp->network = network;
        dhcp->callback = callback;
        dhcp->prefixes = prefixes;
-       dhcp->started = TRUE;
+       dhcp->started = true;
 
        connman_network_ref(network);
 
@@ -1401,7 +1939,7 @@ int __connman_dhcpv6_start(struct connman_network *network,
        ipconfig_ipv6 = __connman_service_get_ip6config(service);
        last_address = __connman_ipconfig_get_dhcp_address(ipconfig_ipv6);
 
-       if (prefixes != NULL && last_address != NULL &&
+       if (prefixes && last_address &&
                        check_ipv6_addr_prefix(prefixes,
                                                last_address) != 128) {
                /*
@@ -1424,22 +1962,825 @@ void __connman_dhcpv6_stop(struct connman_network *network)
 {
        DBG("");
 
-       if (network_table == NULL)
+       if (!network_table)
                return;
 
-       if (g_hash_table_remove(network_table, network) == TRUE)
+       if (g_hash_table_remove(network_table, network))
                connman_network_unref(network);
 }
 
-int __connman_dhcpv6_init(void)
+static int save_prefixes(struct connman_ipconfig *ipconfig,
+                       GSList *prefixes)
 {
-       DBG("");
+       GSList *list;
+       int i = 0, count = g_slist_length(prefixes);
+       char **array;
 
-       srand(time(NULL));
+       if (count == 0)
+               return 0;
+
+       array = g_try_new0(char *, count + 1);
+       if (!array)
+               return -ENOMEM;
+
+       for (list = prefixes; list; list = list->next) {
+               char *elem, addr_str[INET6_ADDRSTRLEN];
+               GDHCPIAPrefix *prefix = list->data;
+
+               elem = g_strdup_printf("%s/%d", inet_ntop(AF_INET6,
+                               &prefix->prefix, addr_str, INET6_ADDRSTRLEN),
+                               prefix->prefixlen);
+               if (!elem) {
+                       g_strfreev(array);
+                       return -ENOMEM;
+               }
+
+               array[i++] = elem;
+       }
+
+       __connman_ipconfig_set_dhcpv6_prefixes(ipconfig, array);
+       return 0;
+}
+
+static GSList *load_prefixes(struct connman_ipconfig *ipconfig)
+{
+       int i;
+       GSList *list = NULL;
+       char **array =  __connman_ipconfig_get_dhcpv6_prefixes(ipconfig);
+
+       if (!array)
+               return NULL;
+
+       for (i = 0; array[i]; i++) {
+               GDHCPIAPrefix *prefix;
+               long int value;
+               char *ptr, **elems = g_strsplit(array[i], "/", 0);
+
+               if (!elems)
+                       return list;
+
+               value = strtol(elems[1], &ptr, 10);
+               if (ptr != elems[1] && *ptr == '\0' && value <= 128) {
+                       struct in6_addr addr;
+
+                       if (inet_pton(AF_INET6, elems[0], &addr) == 1) {
+                               prefix = g_try_new0(GDHCPIAPrefix, 1);
+                               if (!prefix) {
+                                       g_strfreev(elems);
+                                       return list;
+                               }
+                               memcpy(&prefix->prefix, &addr,
+                                       sizeof(struct in6_addr));
+                               prefix->prefixlen = value;
+
+                               list = g_slist_prepend(list, prefix);
+                       }
+               }
+
+               g_strfreev(elems);
+       }
+
+       return list;
+}
+
+static GDHCPIAPrefix *copy_prefix(gpointer data)
+{
+       GDHCPIAPrefix *copy, *prefix = data;
+
+       copy = g_try_new(GDHCPIAPrefix, 1);
+       if (!copy)
+               return NULL;
+
+       memcpy(copy, prefix, sizeof(GDHCPIAPrefix));
+
+       return copy;
+}
+
+static GSList *copy_and_convert_prefixes(GList *prefixes)
+{
+       GSList *copy = NULL;
+       GList *list;
+
+       for (list = prefixes; list; list = list->next)
+               copy = g_slist_prepend(copy, copy_prefix(list->data));
+
+       return copy;
+}
+
+static int set_prefixes(GDHCPClient *dhcp_client, struct connman_dhcpv6 *dhcp)
+{
+       if (dhcp->prefixes)
+               g_slist_free_full(dhcp->prefixes, free_prefix);
+
+       dhcp->prefixes =
+               copy_and_convert_prefixes(g_dhcp_client_get_option(dhcp_client,
+                                                       G_DHCPV6_IA_PD));
+
+       DBG("Got %d prefix", g_slist_length(dhcp->prefixes));
+
+       if (dhcp->callback) {
+               uint16_t status = g_dhcpv6_client_get_status(dhcp_client);
+               if (status == G_DHCPV6_ERROR_NO_PREFIX)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               else {
+                       struct connman_service *service;
+                       struct connman_ipconfig *ipconfig;
+                       int ifindex = connman_network_get_index(dhcp->network);
+
+                       service = __connman_service_lookup_from_index(ifindex);
+                       if (service) {
+                               ipconfig = __connman_service_get_ip6config(
+                                                               service);
+                               save_prefixes(ipconfig, dhcp->prefixes);
+                               __connman_service_save(service);
+                       }
+
+                       dhcp->callback(dhcp->network,
+                               CONNMAN_DHCPV6_STATUS_SUCCEED, dhcp->prefixes);
+               }
+       } else {
+               g_slist_free_full(dhcp->prefixes, free_prefix);
+               dhcp->prefixes = NULL;
+       }
+
+       return 0;
+}
+
+static void re_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+       uint16_t status;
+       int ret;
+
+       status = g_dhcpv6_client_get_status(dhcp_client);
+
+       DBG("dhcpv6 cb msg %p status %d", dhcp, status);
+
+       if (status  == G_DHCPV6_ERROR_BINDING) {
+               /* RFC 3315, 18.1.8 */
+               dhcpv6_pd_request(dhcp);
+       } else {
+               ret = set_prefixes(dhcp_client, dhcp);
+               if (ret < 0) {
+                       if (dhcp->callback)
+                               dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+                       return;
+               }
+       }
+}
+
+static void rebind_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       DBG("");
+
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       re_pd_cb(dhcp_client, user_data);
+}
+
+static GDHCPClient *create_pd_client(struct connman_dhcpv6 *dhcp, int *err)
+{
+       GDHCPClient *dhcp_client;
+       GDHCPClientError error;
+       struct connman_service *service;
+       int index, ret;
+       uint32_t iaid;
+
+       index = connman_network_get_index(dhcp->network);
+
+       dhcp_client = g_dhcp_client_new(G_DHCP_IPV6, index, &error);
+       if (error != G_DHCP_CLIENT_ERROR_NONE) {
+               *err = -EINVAL;
+               return NULL;
+       }
+
+       if (getenv("CONNMAN_DHCPV6_DEBUG"))
+               g_dhcp_client_set_debug(dhcp_client, dhcpv6_debug, "DHCPv6:PD");
+
+       service = connman_service_lookup_from_network(dhcp->network);
+       if (!service) {
+               g_dhcp_client_unref(dhcp_client);
+               *err = -EINVAL;
+               return NULL;
+       }
+
+       ret = set_duid(service, dhcp->network, dhcp_client, index);
+       if (ret < 0) {
+               g_dhcp_client_unref(dhcp_client);
+               *err = ret;
+               return NULL;
+       }
+
+       g_dhcpv6_client_create_iaid(dhcp_client, index, (unsigned char *)&iaid);
+       g_dhcpv6_client_set_iaid(dhcp_client, iaid);
+
+       return dhcp_client;
+}
+
+static int dhcpv6_pd_rebind(struct connman_dhcpv6 *dhcp)
+{
+       GDHCPClient *dhcp_client;
+       uint32_t T1, T2;
+
+       DBG("dhcp %p", dhcp);
+
+       if (!dhcp->dhcp_client) {
+               /*
+                * We skipped the solicitation phase
+                */
+               int err;
+
+               dhcp->dhcp_client = create_pd_client(dhcp, &err);
+               if (!dhcp->dhcp_client) {
+                       clear_timer(dhcp);
+                       return err;
+               }
+       }
+
+       dhcp_client = dhcp->dhcp_client;
+
+       g_dhcp_client_clear_requests(dhcp_client);
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL);
+       g_dhcpv6_client_set_pd(dhcp_client, &T1, &T2, dhcp->prefixes);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_REBIND,
+                                       rebind_pd_cb, dhcp);
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+static void renew_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       DBG("");
+
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       re_pd_cb(dhcp_client, user_data);
+}
+
+static int dhcpv6_pd_renew(struct connman_dhcpv6 *dhcp)
+{
+       GDHCPClient *dhcp_client;
+       uint32_t T1, T2;
+
+       DBG("dhcp %p", dhcp);
+
+       dhcp_client = dhcp->dhcp_client;
+
+       g_dhcp_client_clear_requests(dhcp_client);
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL);
+       g_dhcpv6_client_set_pd(dhcp_client, &T1, &T2, dhcp->prefixes);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_RENEW,
+                                       renew_pd_cb, dhcp);
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+/*
+ * Check if we need to restart the solicitation procedure. This
+ * is done if all the prefixes have expired.
+ */
+static int check_pd_restart(struct connman_dhcpv6 *dhcp)
+{
+       time_t current, expired;
+
+       g_dhcpv6_client_get_timeouts(dhcp->dhcp_client, NULL, NULL,
+                               NULL, &expired);
+       current = time(NULL);
+
+       if (current > expired) {
+               DBG("expired by %d secs", (int)(current - expired));
+
+               g_timeout_add(0, dhcpv6_restart, dhcp);
+
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static gboolean timeout_pd_rebind(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (check_pd_restart(dhcp) < 0)
+               return FALSE;
+
+       dhcp->RT = calc_delay(dhcp->RT, REB_MAX_RT);
+
+       DBG("rebind RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_pd_rebind, dhcp);
+
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+
+       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+
+       return FALSE;
+}
+
+static gboolean start_pd_rebind(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (check_pd_restart(dhcp) < 0)
+               return FALSE;
+
+       dhcp->RT = REB_TIMEOUT * (1 + get_random());
+
+       DBG("rebind initial RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_pd_rebind, dhcp);
+
+       dhcpv6_pd_rebind(dhcp);
+
+       return FALSE;
+}
+
+static gboolean timeout_pd_rebind_confirm(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       dhcp->RT = calc_delay(dhcp->RT, CNF_MAX_RT);
+
+       DBG("rebind with confirm RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT,
+                                       timeout_pd_rebind_confirm, dhcp);
+
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+
+       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+
+       return FALSE;
+}
+
+static gboolean timeout_pd_max_confirm(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       dhcp->MRD = 0;
+
+       clear_timer(dhcp);
+
+       DBG("rebind with confirm max retransmit duration timeout");
+
+       g_dhcpv6_client_clear_retransmit(dhcp->dhcp_client);
+
+       if (dhcp->callback)
+               dhcp->callback(dhcp->network,
+                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+
+       return FALSE;
+}
+
+static gboolean start_pd_rebind_with_confirm(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       dhcp->RT = CNF_TIMEOUT * (1 + get_random());
+
+       DBG("rebind with confirm initial RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT,
+                                       timeout_pd_rebind_confirm, dhcp);
+       dhcp->MRD = g_timeout_add(CNF_MAX_RD, timeout_pd_max_confirm, dhcp);
+
+       dhcpv6_pd_rebind(dhcp);
+
+       return FALSE;
+}
+
+static gboolean timeout_pd_renew(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (check_pd_restart(dhcp) < 0)
+               return FALSE;
+
+       dhcp->RT = calc_delay(dhcp->RT, REN_MAX_RT);
+
+       DBG("renew RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_renew, dhcp);
+
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+
+       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+
+       return FALSE;
+}
+
+static gboolean start_pd_renew(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       dhcp->RT = REN_TIMEOUT * (1 + get_random());
+
+       DBG("renew initial RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_pd_renew, dhcp);
+
+       dhcpv6_pd_renew(dhcp);
+
+       return FALSE;
+}
+
+int __connman_dhcpv6_start_pd_renew(struct connman_network *network,
+                               dhcpv6_cb callback)
+{
+       struct connman_dhcpv6 *dhcp;
+       uint32_t T1, T2;
+       time_t started, current, expired;
+
+       dhcp = g_hash_table_lookup(network_pd_table, network);
+       if (!dhcp)
+               return -ENOENT;
+
+       DBG("network %p dhcp %p", network, dhcp);
+
+       clear_timer(dhcp);
+
+       g_dhcpv6_client_get_timeouts(dhcp->dhcp_client, &T1, &T2,
+                               &started, &expired);
+
+       current = time(NULL);
+
+       DBG("T1 %u T2 %u expires %lu current %lu started %lu", T1, T2,
+               expired, current, started);
+
+       if (T1 == 0xffffffff)
+               /* RFC 3633, ch 9 */
+               return 0;
+
+       if (T1 == 0)
+               /* RFC 3633, ch 9
+                * Client can choose the timeout.
+                */
+               T1 = 120;
+
+       dhcp->callback = callback;
+
+       /* RFC 3315, 18.1.4, start solicit if expired */
+       if (check_pd_restart(dhcp) < 0)
+               return 0;
+
+       if (T2 != 0xffffffff && T2 > 0) {
+               if ((unsigned)current >= (unsigned)started + T2) {
+                       /* RFC 3315, chapter 18.1.3, start rebind */
+                       DBG("rebind after %d secs", T2);
+
+                       dhcp->timeout = g_timeout_add_seconds(T2,
+                                                       start_pd_rebind,
+                                                       dhcp);
+
+               } else if ((unsigned)current < (unsigned)started + T1) {
+                       DBG("renew after %d secs", T1);
+
+                       dhcp->timeout = g_timeout_add_seconds(T1,
+                                                       start_pd_renew,
+                                                       dhcp);
+               } else {
+                       DBG("rebind after %d secs", T2 - T1);
+
+                       dhcp->timeout = g_timeout_add_seconds(T2 - T1,
+                                                       start_pd_rebind,
+                                                       dhcp);
+               }
+       }
+
+       return 0;
+}
+
+static void release_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       DBG("");
+}
+
+int __connman_dhcpv6_start_pd_release(struct connman_network *network,
+                               dhcpv6_cb callback)
+{
+       struct connman_dhcpv6 *dhcp;
+       GDHCPClient *dhcp_client;
+       uint32_t T1, T2;
+
+       if (!network_table)
+               return 0;   /* we are already released */
+
+       dhcp = g_hash_table_lookup(network_pd_table, network);
+       if (!dhcp)
+               return -ENOENT;
+
+       DBG("network %p dhcp %p client %p", network, dhcp, dhcp->dhcp_client);
+
+       clear_timer(dhcp);
+
+       dhcp_client = dhcp->dhcp_client;
+       if (!dhcp_client) {
+               DBG("DHCPv6 PD was not started");
+               return 0;
+       }
+
+       g_dhcp_client_clear_requests(dhcp_client);
+       g_dhcp_client_clear_values(dhcp_client);
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
+
+       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL);
+       g_dhcpv6_client_set_pd(dhcp_client, &T1, &T2, dhcp->prefixes);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_RELEASE,
+                                       release_pd_cb, dhcp);
+
+       dhcp->dhcp_client = dhcp_client;
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+static gboolean timeout_pd_request(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       if (dhcp->request_count >= REQ_MAX_RC) {
+               DBG("max request retry attempts %d", dhcp->request_count);
+               dhcp->request_count = 0;
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               return FALSE;
+       }
+
+       dhcp->request_count++;
+
+       dhcp->RT = calc_delay(dhcp->RT, REQ_MAX_RT);
+       DBG("request RT timeout %d msec", dhcp->RT);
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_pd_request, dhcp);
+
+       g_dhcpv6_client_set_retransmit(dhcp->dhcp_client);
+
+       g_dhcp_client_start(dhcp->dhcp_client, NULL);
+
+       return FALSE;
+}
+
+static void request_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+       uint16_t status;
+
+       DBG("");
+
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       status = g_dhcpv6_client_get_status(dhcp_client);
+
+       DBG("dhcpv6 pd cb msg %p status %d", dhcp, status);
+
+       if (status  == G_DHCPV6_ERROR_BINDING) {
+               /* RFC 3315, 18.1.8 */
+               dhcpv6_pd_request(dhcp);
+       } else {
+               set_prefixes(dhcp_client, dhcp);
+       }
+}
+
+static int dhcpv6_pd_request(struct connman_dhcpv6 *dhcp)
+{
+       GDHCPClient *dhcp_client;
+       uint32_t T1 = 0, T2 = 0;
+
+       DBG("dhcp %p", dhcp);
+
+       dhcp_client = dhcp->dhcp_client;
+
+       g_dhcp_client_clear_requests(dhcp_client);
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SERVERID);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_DNS_SERVERS);
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_SNTP_SERVERS);
+
+       g_dhcpv6_client_get_timeouts(dhcp_client, &T1, &T2, NULL, NULL);
+       g_dhcpv6_client_set_pd(dhcp_client, &T1, &T2, dhcp->prefixes);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client, G_DHCP_CLIENT_EVENT_REQUEST,
+                                       request_pd_cb, dhcp);
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+static void advertise_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       DBG("dhcpv6 advertise pd msg %p", dhcp);
+
+       clear_timer(dhcp);
+
+       g_dhcpv6_client_clear_retransmit(dhcp_client);
+
+       if (g_dhcpv6_client_get_status(dhcp_client) != 0) {
+               if (dhcp->callback)
+                       dhcp->callback(dhcp->network,
+                                       CONNMAN_DHCPV6_STATUS_FAIL, NULL);
+               return;
+       }
+
+       dhcp->RT = REQ_TIMEOUT * (1 + get_random());
+       DBG("request initial RT timeout %d msec", dhcp->RT);
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_pd_request, dhcp);
+
+       dhcp->request_count = 1;
+
+       dhcpv6_pd_request(dhcp);
+}
+
+static void solicitation_pd_cb(GDHCPClient *dhcp_client, gpointer user_data)
+{
+       /*
+        * This callback is here so that g_dhcp_client_start()
+        * will enter the proper L3 mode.
+        */
+       DBG("DHCPv6 %p solicitation msg received, ignoring it", user_data);
+}
+
+static int dhcpv6_pd_solicitation(struct connman_dhcpv6 *dhcp)
+{
+       GDHCPClient *dhcp_client;
+       int ret;
+
+       DBG("dhcp %p", dhcp);
+
+       dhcp_client = create_pd_client(dhcp, &ret);
+       if (!dhcp_client) {
+               clear_timer(dhcp);
+               return ret;
+       }
+
+       g_dhcp_client_set_request(dhcp_client, G_DHCPV6_CLIENTID);
+
+       g_dhcpv6_client_set_pd(dhcp_client, NULL, NULL, NULL);
+
+       clear_callbacks(dhcp_client);
+
+       g_dhcp_client_register_event(dhcp_client,
+                               G_DHCP_CLIENT_EVENT_ADVERTISE,
+                               advertise_pd_cb, dhcp);
+
+       g_dhcp_client_register_event(dhcp_client,
+                               G_DHCP_CLIENT_EVENT_SOLICITATION,
+                               solicitation_pd_cb, dhcp);
+
+       dhcp->dhcp_client = dhcp_client;
+
+       return g_dhcp_client_start(dhcp_client, NULL);
+}
+
+static gboolean start_pd_solicitation(gpointer user_data)
+{
+       struct connman_dhcpv6 *dhcp = user_data;
+
+       /* Set the retransmission timeout, RFC 3315 chapter 14 */
+       dhcp->RT = SOL_TIMEOUT * (1 + get_random());
+
+       DBG("solicit initial RT timeout %d msec", dhcp->RT);
+
+       dhcp->timeout = g_timeout_add(dhcp->RT, timeout_solicitation, dhcp);
+
+       dhcpv6_pd_solicitation(dhcp);
+
+       return FALSE;
+}
+
+int __connman_dhcpv6_start_pd(int index, GSList *prefixes, dhcpv6_cb callback)
+{
+       struct connman_service *service;
+       struct connman_network *network;
+       struct connman_dhcpv6 *dhcp;
+
+       if (index < 0)
+               return 0;
+
+       DBG("index %d", index);
+
+       service = __connman_service_lookup_from_index(index);
+       if (!service)
+               return -EINVAL;
+
+       network = __connman_service_get_network(service);
+       if (!network)
+               return -EINVAL;
+
+       if (network_pd_table) {
+               dhcp = g_hash_table_lookup(network_pd_table, network);
+               if (dhcp && dhcp->started)
+                       return -EBUSY;
+       }
+
+       dhcp = g_try_new0(struct connman_dhcpv6, 1);
+       if (!dhcp)
+               return -ENOMEM;
+
+       dhcp->network = network;
+       dhcp->callback = callback;
+       dhcp->started = true;
+
+       if (!prefixes) {
+               /*
+                * Try to load the earlier prefixes if caller did not supply
+                * any that we could use.
+                */
+               struct connman_ipconfig *ipconfig;
+               ipconfig = __connman_service_get_ip6config(service);
+
+               dhcp->prefixes = load_prefixes(ipconfig);
+       } else
+               dhcp->prefixes = prefixes;
+
+       connman_network_ref(network);
+
+       DBG("replace network %p dhcp %p", network, dhcp);
+
+       g_hash_table_replace(network_pd_table, network, dhcp);
+
+       if (!dhcp->prefixes) {
+               /*
+                * Refresh start, try to get prefixes.
+                */
+               start_pd_solicitation(dhcp);
+       } else {
+               /*
+                * We used to have prefixes, try to use them again.
+                * We need to use timeouts from confirm msg, RFC 3633, ch 12.1
+                */
+               start_pd_rebind_with_confirm(dhcp);
+       }
+
+       return 0;
+}
+
+void __connman_dhcpv6_stop_pd(int index)
+{
+       struct connman_service *service;
+       struct connman_network *network;
+
+       if (index < 0)
+               return;
+
+       DBG("index %d", index);
+
+       if (!network_pd_table)
+               return;
+
+       service = __connman_service_lookup_from_index(index);
+       if (!service)
+               return;
+
+       network = __connman_service_get_network(service);
+       if (!network)
+               return;
+
+       __connman_dhcpv6_start_pd_release(network, NULL);
+
+       if (g_hash_table_remove(network_pd_table, network))
+               connman_network_unref(network);
+}
+
+int __connman_dhcpv6_init(void)
+{
+       DBG("");
+
+       srand(time(NULL));
 
        network_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
                                                        NULL, remove_network);
 
+       network_pd_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+                                                       NULL, remove_network);
+
        return 0;
 }
 
@@ -1449,4 +2790,7 @@ void __connman_dhcpv6_cleanup(void)
 
        g_hash_table_destroy(network_table);
        network_table = NULL;
+
+       g_hash_table_destroy(network_pd_table);
+       network_pd_table = NULL;
 }
index 9030a35..7232b98 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -93,8 +93,8 @@ struct server_data {
        GIOChannel *channel;
        guint watch;
        guint timeout;
-       gboolean enabled;
-       gboolean connected;
+       bool enabled;
+       bool connected;
        struct partial_reply *incoming_reply;
 };
 
@@ -120,7 +120,7 @@ struct request_data {
        gpointer resp;
        gsize resplen;
        struct listener_data *ifdata;
-       gboolean append_domain;
+       bool append_domain;
 };
 
 struct listener_data {
@@ -164,7 +164,7 @@ struct cache_data {
 
 struct cache_entry {
        char *key;
-       int want_refresh;
+       bool want_refresh;
        int hits;
        struct cache_data *ipv4;
        struct cache_data *ipv6;
@@ -216,7 +216,7 @@ static GHashTable *listener_table = NULL;
 static time_t next_refresh;
 static GHashTable *partial_tcp_req_table;
 
-static guint16 get_id()
+static guint16 get_id(void)
 {
        return random();
 }
@@ -283,16 +283,16 @@ static struct server_data *find_server(int index,
                struct server_data *data = list->data;
 
                if (index < 0 && data->index < 0 &&
-                               g_str_equal(data->server, server) == TRUE &&
+                               g_str_equal(data->server, server) &&
                                data->protocol == protocol)
                        return data;
 
                if (index < 0 ||
-                               data->index < 0 || data->server == NULL)
+                               data->index < 0 || !data->server)
                        continue;
 
                if (data->index == index &&
-                               g_str_equal(data->server, server) == TRUE &&
+                               g_str_equal(data->server, server) &&
                                data->protocol == protocol)
                        return data;
        }
@@ -315,26 +315,26 @@ static void refresh_dns_entry(struct cache_entry *entry, char *name)
 {
        int age = 1;
 
-       if (ipv4_resolve == NULL) {
+       if (!ipv4_resolve) {
                ipv4_resolve = g_resolv_new(0);
                g_resolv_set_address_family(ipv4_resolve, AF_INET);
                g_resolv_add_nameserver(ipv4_resolve, "127.0.0.1", 53, 0);
        }
 
-       if (ipv6_resolve == NULL) {
+       if (!ipv6_resolve) {
                ipv6_resolve = g_resolv_new(0);
                g_resolv_set_address_family(ipv6_resolve, AF_INET6);
                g_resolv_add_nameserver(ipv6_resolve, "::1", 53, 0);
        }
 
-       if (entry->ipv4 == NULL) {
+       if (!entry->ipv4) {
                DBG("Refresing A record for %s", name);
                g_resolv_lookup_hostname(ipv4_resolve, name,
                                        dummy_resolve_func, NULL);
                age = 4;
        }
 
-       if (entry->ipv6 == NULL) {
+       if (!entry->ipv6) {
                DBG("Refresing AAAA record for %s", name);
                g_resolv_lookup_hostname(ipv6_resolve, name,
                                        dummy_resolve_func, NULL);
@@ -505,7 +505,7 @@ static int get_req_udp_socket(struct request_data *req)
        else
                channel = req->ifdata->udp6_listener_channel;
 
-       if (channel == NULL)
+       if (!channel)
                return -1;
 
        return g_io_channel_unix_get_fd(channel);
@@ -526,7 +526,7 @@ static gboolean request_timeout(gpointer user_data)
 {
        struct request_data *req = user_data;
 
-       if (req == NULL)
+       if (!req)
                return FALSE;
 
        DBG("id 0x%04x", req->srcid);
@@ -534,7 +534,7 @@ static gboolean request_timeout(gpointer user_data)
        request_list = g_slist_remove(request_list, req);
        req->numserv--;
 
-       if (req->resplen > 0 && req->resp != NULL) {
+       if (req->resplen > 0 && req->resp) {
                int sk, err;
 
                if (req->protocol == IPPROTO_UDP) {
@@ -599,11 +599,11 @@ static int append_query(unsigned char *buf, unsigned int size,
 
        DBG("query %s domain %s", query, domain);
 
-       while (query != NULL) {
+       while (query) {
                const char *tmp;
 
                tmp = strchr(query, '.');
-               if (tmp == NULL) {
+               if (!tmp) {
                        len = strlen(query);
                        if (len == 0)
                                break;
@@ -620,11 +620,11 @@ static int append_query(unsigned char *buf, unsigned int size,
                query = tmp + 1;
        }
 
-       while (domain != NULL) {
+       while (domain) {
                const char *tmp;
 
                tmp = strchr(domain, '.');
-               if (tmp == NULL) {
+               if (!tmp) {
                        len = strlen(domain);
                        if (len == 0)
                                break;
@@ -646,16 +646,16 @@ static int append_query(unsigned char *buf, unsigned int size,
        return ptr - buf;
 }
 
-static gboolean cache_check_is_valid(struct cache_data *data,
+static bool cache_check_is_valid(struct cache_data *data,
                                time_t current_time)
 {
-       if (data == NULL)
-               return FALSE;
+       if (!data)
+               return false;
 
        if (data->cache_until < current_time)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 /*
@@ -665,7 +665,7 @@ static void cache_enforce_validity(struct cache_entry *entry)
 {
        time_t current_time = time(NULL);
 
-       if (cache_check_is_valid(entry->ipv4, current_time) == FALSE
+       if (!cache_check_is_valid(entry->ipv4, current_time)
                                                        && entry->ipv4) {
                DBG("cache timeout \"%s\" type A", entry->key);
                g_free(entry->ipv4->data);
@@ -674,7 +674,7 @@ static void cache_enforce_validity(struct cache_entry *entry)
 
        }
 
-       if (cache_check_is_valid(entry->ipv6, current_time) == FALSE
+       if (!cache_check_is_valid(entry->ipv6, current_time)
                                                        && entry->ipv6) {
                DBG("cache timeout \"%s\" type AAAA", entry->key);
                g_free(entry->ipv6->data);
@@ -687,32 +687,31 @@ static uint16_t cache_check_validity(char *question, uint16_t type,
                                struct cache_entry *entry)
 {
        time_t current_time = time(NULL);
-       int want_refresh = 0;
+       bool want_refresh = false;
 
        /*
         * if we have a popular entry, we want a refresh instead of
         * total destruction of the entry.
         */
        if (entry->hits > 2)
-               want_refresh = 1;
+               want_refresh = true;
 
        cache_enforce_validity(entry);
 
        switch (type) {
        case 1:         /* IPv4 */
-               if (cache_check_is_valid(entry->ipv4, current_time) == FALSE) {
+               if (!cache_check_is_valid(entry->ipv4, current_time)) {
                        DBG("cache %s \"%s\" type A", entry->ipv4 ?
                                        "timeout" : "entry missing", question);
 
                        if (want_refresh)
-                               entry->want_refresh = 1;
+                               entry->want_refresh = true;
 
                        /*
                         * We do not remove cache entry if there is still
                         * valid IPv6 entry found in the cache.
                         */
-                       if (cache_check_is_valid(entry->ipv6, current_time)
-                                       == FALSE && want_refresh == FALSE) {
+                       if (!cache_check_is_valid(entry->ipv6, current_time) && !want_refresh) {
                                g_hash_table_remove(cache, question);
                                type = 0;
                        }
@@ -720,15 +719,14 @@ static uint16_t cache_check_validity(char *question, uint16_t type,
                break;
 
        case 28:        /* IPv6 */
-               if (cache_check_is_valid(entry->ipv6, current_time) == FALSE) {
+               if (!cache_check_is_valid(entry->ipv6, current_time)) {
                        DBG("cache %s \"%s\" type AAAA", entry->ipv6 ?
                                        "timeout" : "entry missing", question);
 
                        if (want_refresh)
-                               entry->want_refresh = 1;
+                               entry->want_refresh = true;
 
-                       if (cache_check_is_valid(entry->ipv4, current_time)
-                                       == FALSE && want_refresh == FALSE) {
+                       if (!cache_check_is_valid(entry->ipv4, current_time) && !want_refresh) {
                                g_hash_table_remove(cache, question);
                                type = 0;
                        }
@@ -743,15 +741,15 @@ static void cache_element_destroy(gpointer value)
 {
        struct cache_entry *entry = value;
 
-       if (entry == NULL)
+       if (!entry)
                return;
 
-       if (entry->ipv4 != NULL) {
+       if (entry->ipv4) {
                g_free(entry->ipv4->data);
                g_free(entry->ipv4);
        }
 
-       if (entry->ipv6 != NULL) {
+       if (entry->ipv6) {
                g_free(entry->ipv6->data);
                g_free(entry->ipv6);
        }
@@ -775,7 +773,7 @@ static gboolean try_remove_cache(gpointer user_data)
        return FALSE;
 }
 
-static void create_cache()
+static void create_cache(void)
 {
        if (__sync_fetch_and_add(&cache_refcount, 1) == 0)
                cache = g_hash_table_new_full(g_str_hash,
@@ -792,7 +790,7 @@ static struct cache_entry *cache_check(gpointer request, int *qtype, int proto)
        uint16_t type;
        int offset, proto_offset;
 
-       if (request == NULL)
+       if (!request)
                return NULL;
 
        proto_offset = protocol_offset(proto);
@@ -809,13 +807,13 @@ static struct cache_entry *cache_check(gpointer request, int *qtype, int proto)
        if (type != 1 && type != 28)
                return NULL;
 
-       if (cache == NULL) {
+       if (!cache) {
                create_cache();
                return NULL;
        }
 
        entry = g_hash_table_lookup(cache, question);
-       if (entry == NULL)
+       if (!entry)
                return NULL;
 
        type = cache_check_validity(question, type, entry);
@@ -852,7 +850,7 @@ static int get_name(int counter,
                        if (offset >= max - pkt)
                                return -ENOBUFS;
 
-                       if (*end == NULL)
+                       if (!*end)
                                *end = p + 2;
 
                        return get_name(counter + 1, pkt, pkt + offset, max,
@@ -882,7 +880,7 @@ static int get_name(int counter,
 
                        p += label_len + 1;
 
-                       if (*end == NULL)
+                       if (!*end)
                                *end = p;
 
                        if (p >= max)
@@ -916,7 +914,7 @@ static int parse_rr(unsigned char *buf, unsigned char *start,
 
        rr = (void *) (*end);
 
-       if (rr == NULL)
+       if (!rr)
                return -EINVAL;
 
        *type = ntohs(rr->type);
@@ -944,19 +942,19 @@ static int parse_rr(unsigned char *buf, unsigned char *start,
        return 0;
 }
 
-static gboolean check_alias(GSList *aliases, char *name)
+static bool check_alias(GSList *aliases, char *name)
 {
        GSList *list;
 
-       if (aliases != NULL) {
+       if (aliases) {
                for (list = aliases; list; list = list->next) {
                        int len = strlen((char *)list->data);
                        if (strncmp((char *)list->data, name, len) == 0)
-                               return TRUE;
+                               return true;
                }
        }
 
-       return FALSE;
+       return false;
 }
 
 static int parse_response(unsigned char *buf, int buflen,
@@ -1007,6 +1005,8 @@ static int parse_response(unsigned char *buf, int buflen,
        *response_len = 0;
        *answers = 0;
 
+       memset(name, 0, sizeof(name));
+
        /*
         * We have a bunch of answers (like A, AAAA, CNAME etc) to
         * A or AAAA question. We traverse the answers and parse the
@@ -1120,8 +1120,8 @@ static int parse_response(unsigned char *buf, int buflen,
                        /*
                         * We found correct type (A or AAAA)
                         */
-                       if (check_alias(aliases, name) == TRUE ||
-                               (aliases == NULL && strncmp(question, name,
+                       if (check_alias(aliases, name) ||
+                               (!aliases && strncmp(question, name,
                                                        qlen) == 0)) {
                                /*
                                 * We found an alias or the name of the rr
@@ -1176,7 +1176,7 @@ static gboolean cache_check_entry(gpointer key, gpointer value,
         * remove both from the cache.
         */
 
-       if (entry->ipv4 != NULL && entry->ipv4->timeout > 0) {
+       if (entry->ipv4 && entry->ipv4->timeout > 0) {
                max_timeout = entry->ipv4->cache_until;
                if (max_timeout > data->max_timeout)
                        data->max_timeout = max_timeout;
@@ -1185,7 +1185,7 @@ static gboolean cache_check_entry(gpointer key, gpointer value,
                        return TRUE;
        }
 
-       if (entry->ipv6 != NULL && entry->ipv6->timeout > 0) {
+       if (entry->ipv6 && entry->ipv6->timeout > 0) {
                max_timeout = entry->ipv6->cache_until;
                if (max_timeout > data->max_timeout)
                        data->max_timeout = max_timeout;
@@ -1257,7 +1257,7 @@ static gboolean cache_invalidate_entry(gpointer key, gpointer value,
 
        /* if anything is not expired, mark the entry for refresh */
        if (entry->hits > 0 && (entry->ipv4 || entry->ipv6))
-               entry->want_refresh = 1;
+               entry->want_refresh = true;
 
        /* delete the cached data */
        if (entry->ipv4) {
@@ -1289,7 +1289,7 @@ static void cache_invalidate(void)
 {
        DBG("Invalidating the DNS cache %p", cache);
 
-       if (cache == NULL)
+       if (!cache)
                return;
 
        g_hash_table_foreach_remove(cache, cache_invalidate_entry, NULL);
@@ -1300,15 +1300,15 @@ static void cache_refresh_entry(struct cache_entry *entry)
 
        cache_enforce_validity(entry);
 
-       if (entry->hits > 2 && entry->ipv4 == NULL)
-               entry->want_refresh = 1;
-       if (entry->hits > 2 && entry->ipv6 == NULL)
-               entry->want_refresh = 1;
+       if (entry->hits > 2 && !entry->ipv4)
+               entry->want_refresh = true;
+       if (entry->hits > 2 && !entry->ipv6)
+               entry->want_refresh = true;
 
        if (entry->want_refresh) {
                char *c;
                char dns_name[NS_MAXDNAME + 1];
-               entry->want_refresh = 0;
+               entry->want_refresh = false;
 
                /* turn a DNS name into a hostname with dots */
                strncpy(dns_name, entry->key, NS_MAXDNAME);
@@ -1335,7 +1335,7 @@ static void cache_refresh_iterator(gpointer key, gpointer value,
 
 static void cache_refresh(void)
 {
-       if (cache == NULL)
+       if (!cache)
                return;
 
        g_hash_table_foreach(cache, cache_refresh_iterator, NULL);
@@ -1378,7 +1378,7 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
        unsigned char response[NS_MAXDNAME + 1];
        unsigned char *ptr;
        unsigned int rsplen;
-       gboolean new_entry = TRUE;
+       bool new_entry = true;
        time_t current_time;
 
        if (cache_size >= MAX_CACHE_SIZE) {
@@ -1404,6 +1404,9 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
        if (hdr->rcode != 0)
                return 0;
 
+       if (!cache)
+               create_cache();
+
        rsplen = sizeof(response) - 1;
        question[sizeof(question) - 1] = '\0';
 
@@ -1420,16 +1423,12 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
        if ((err == -ENOMSG || err == -ENOBUFS) &&
                        reply_query_type(msg + offset,
                                        msg_len - offset) == 28) {
-               if (cache == NULL) {
-                       create_cache();
-                       entry = NULL;
-               } else
-                       entry = g_hash_table_lookup(cache, question);
-               if (entry && entry->ipv4 && entry->ipv6 == NULL) {
+               entry = g_hash_table_lookup(cache, question);
+               if (entry && entry->ipv4 && !entry->ipv6) {
                        int cache_offset = 0;
 
                        data = g_try_new(struct cache_data, 1);
-                       if (data == NULL)
+                       if (!data)
                                return -ENOMEM;
                        data->inserted = entry->ipv4->inserted;
                        data->type = type;
@@ -1471,20 +1470,20 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
         * records for the same name.
         */
        entry = g_hash_table_lookup(cache, question);
-       if (entry == NULL) {
+       if (!entry) {
                entry = g_try_new(struct cache_entry, 1);
-               if (entry == NULL)
+               if (!entry)
                        return -ENOMEM;
 
                data = g_try_new(struct cache_data, 1);
-               if (data == NULL) {
+               if (!data) {
                        g_free(entry);
                        return -ENOMEM;
                }
 
                entry->key = g_strdup(question);
                entry->ipv4 = entry->ipv6 = NULL;
-               entry->want_refresh = 0;
+               entry->want_refresh = false;
                entry->hits = 0;
 
                if (type == 1)
@@ -1492,14 +1491,14 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
                else
                        entry->ipv6 = data;
        } else {
-               if (type == 1 && entry->ipv4 != NULL)
+               if (type == 1 && entry->ipv4)
                        return 0;
 
-               if (type == 28 && entry->ipv6 != NULL)
+               if (type == 28 && entry->ipv6)
                        return 0;
 
                data = g_try_new(struct cache_data, 1);
-               if (data == NULL)
+               if (!data)
                        return -ENOMEM;
 
                if (type == 1)
@@ -1515,7 +1514,7 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
                if (entry->hits < 0)
                        entry->hits = 0;
 
-               new_entry = FALSE;
+               new_entry = false;
        }
 
        if (ttl < MIN_CACHE_TTL)
@@ -1543,7 +1542,7 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
 
        data->cache_until = round_down_ttl(current_time + ttl, ttl);
 
-       if (data->data == NULL) {
+       if (!data->data) {
                g_free(entry->key);
                g_free(data);
                g_free(entry);
@@ -1574,7 +1573,7 @@ static int cache_update(struct server_data *srv, unsigned char *msg,
        memcpy(ptr + offset + 12 + qlen + 1 + sizeof(struct domain_question),
                response, rsplen);
 
-       if (new_entry == TRUE) {
+       if (new_entry) {
                g_hash_table_replace(cache, entry->key, entry);
                cache_size++;
        }
@@ -1601,7 +1600,7 @@ static int ns_resolv(struct server_data *server, struct request_data *req,
        struct cache_entry *entry;
 
        entry = cache_check(request, &type, req->protocol);
-       if (entry != NULL) {
+       if (entry) {
                int ttl_left = 0;
                struct cache_data *data;
 
@@ -1616,16 +1615,19 @@ static int ns_resolv(struct server_data *server, struct request_data *req,
                        entry->hits++;
                }
 
-               if (data != NULL && req->protocol == IPPROTO_TCP) {
+               if (data && req->protocol == IPPROTO_TCP) {
                        send_cached_response(req->client_sk, data->data,
                                        data->data_len, NULL, 0, IPPROTO_TCP,
                                        req->srcid, data->answers, ttl_left);
                        return 1;
                }
 
-               if (data != NULL && req->protocol == IPPROTO_UDP) {
+               if (data && req->protocol == IPPROTO_UDP) {
                        int udp_sk = get_req_udp_socket(req);
 
+                       if (udp_sk < 0)
+                               return -EIO;
+
                        send_cached_response(udp_sk, data->data,
                                data->data_len, &req->sa, req->sa_len,
                                IPPROTO_UDP, req->srcid, data->answers,
@@ -1650,11 +1652,11 @@ static int ns_resolv(struct server_data *server, struct request_data *req,
 
        /* If we have more than one dot, we don't add domains */
        dot = strchr(lookup, '.');
-       if (dot != NULL && dot != lookup + strlen(lookup) - 1)
+       if (dot && dot != lookup + strlen(lookup) - 1)
                return 0;
 
-       if (server->domains != NULL && server->domains->data != NULL)
-               req->append_domain = TRUE;
+       if (server->domains && server->domains->data)
+               req->append_domain = true;
 
        for (list = server->domains; list; list = list->next) {
                char *domain;
@@ -1664,7 +1666,7 @@ static int ns_resolv(struct server_data *server, struct request_data *req,
 
                domain = list->data;
 
-               if (domain == NULL)
+               if (!domain)
                        continue;
 
                offset = protocol_offset(server->protocol);
@@ -1712,6 +1714,176 @@ static int ns_resolv(struct server_data *server, struct request_data *req,
        return 0;
 }
 
+static char *convert_label(char *start, char *end, char *ptr, char *uptr,
+                       int remaining_len, int *used_comp, int *used_uncomp)
+{
+       int pos, comp_pos;
+       char name[NS_MAXLABEL];
+
+       pos = dn_expand((u_char *)start, (u_char *)end, (u_char *)ptr,
+                       name, NS_MAXLABEL);
+       if (pos < 0) {
+               DBG("uncompress error [%d/%s]", errno, strerror(errno));
+               goto out;
+       }
+
+       /*
+        * We need to compress back the name so that we get back to internal
+        * label presentation.
+        */
+       comp_pos = dn_comp(name, (u_char *)uptr, remaining_len, NULL, NULL);
+       if (comp_pos < 0) {
+               DBG("compress error [%d/%s]", errno, strerror(errno));
+               goto out;
+       }
+
+       *used_comp = pos;
+       *used_uncomp = comp_pos;
+
+       return ptr;
+
+out:
+       return NULL;
+}
+
+static char *uncompress(int16_t field_count, char *start, char *end,
+                       char *ptr, char *uncompressed, int uncomp_len,
+                       char **uncompressed_ptr)
+{
+       char *uptr = *uncompressed_ptr; /* position in result buffer */
+
+       DBG("count %d ptr %p end %p uptr %p", field_count, ptr, end, uptr);
+
+       while (field_count-- > 0 && ptr < end) {
+               int dlen;               /* data field length */
+               int ulen;               /* uncompress length */
+               int pos;                /* position in compressed string */
+               char name[NS_MAXLABEL]; /* tmp label */
+               uint16_t dns_type, dns_class;
+
+               pos = dn_expand((const u_char *)start, (u_char *)end,
+                               (u_char *)ptr, name, NS_MAXLABEL);
+               if (pos < 0) {
+                       DBG("uncompress error [%d/%s]", errno,
+                               strerror(errno));
+                       goto out;
+               }
+
+               /*
+                * Copy the uncompressed resource record, type, class and \0 to
+                * tmp buffer.
+                */
+
+               ulen = strlen(name);
+               *uptr++ = ulen;
+               strncpy(uptr, name, uncomp_len - (uptr - uncompressed));
+
+               DBG("pos %d ulen %d left %d name %s", pos, ulen,
+                       (int)(uncomp_len - (uptr - uncompressed)), uptr);
+
+               uptr += ulen;
+               *uptr++ = '\0';
+
+               ptr += pos;
+
+               /*
+                * We copy also the fixed portion of the result (type, class,
+                * ttl, address length and the address)
+                */
+               memcpy(uptr, ptr, NS_RRFIXEDSZ);
+
+               dns_type = uptr[0] << 8 | uptr[1];
+               dns_class = uptr[2] << 8 | uptr[3];
+
+               if (dns_class != ns_c_in)
+                       goto out;
+
+               ptr += NS_RRFIXEDSZ;
+               uptr += NS_RRFIXEDSZ;
+
+               /*
+                * Then the variable portion of the result (data length).
+                * Typically this portion is also compressed
+                * so we need to uncompress it also when necessary.
+                */
+               if (dns_type == ns_t_cname) {
+                       int comp_pos;
+
+                       if (!convert_label(start, end, ptr, uptr,
+                                       uncomp_len - (uptr - uncompressed),
+                                               &pos, &comp_pos))
+                               goto out;
+
+                       uptr[-2] = comp_pos << 8;
+                       uptr[-1] = comp_pos & 0xff;
+
+                       uptr += comp_pos;
+                       ptr += pos;
+
+               } else if (dns_type == ns_t_a || dns_type == ns_t_aaaa) {
+                       dlen = uptr[-2] << 8 | uptr[-1];
+
+                       if (ptr + dlen > end) {
+                               DBG("data len %d too long", dlen);
+                               goto out;
+                       }
+
+                       memcpy(uptr, ptr, dlen);
+                       uptr += dlen;
+                       ptr += dlen;
+
+               } else if (dns_type == ns_t_soa) {
+                       int comp_pos;
+                       int total_len = 0;
+                       char *len_ptr;
+
+                       /* Primary name server expansion */
+                       if (!convert_label(start, end, ptr, uptr,
+                                       uncomp_len - (uptr - uncompressed),
+                                               &pos, &comp_pos))
+                               goto out;
+
+                       total_len += comp_pos;
+                       len_ptr = &uptr[-2];
+                       ptr += pos;
+                       uptr += comp_pos;
+
+                       /* Responsible authority's mailbox */
+                       if (!convert_label(start, end, ptr, uptr,
+                                       uncomp_len - (uptr - uncompressed),
+                                               &pos, &comp_pos))
+                               goto out;
+
+                       total_len += comp_pos;
+                       ptr += pos;
+                       uptr += comp_pos;
+
+                       /*
+                        * Copy rest of the soa fields (serial number,
+                        * refresh interval, retry interval, expiration
+                        * limit and minimum ttl). They are 20 bytes long.
+                        */
+                       memcpy(uptr, ptr, 20);
+                       uptr += 20;
+                       ptr += 20;
+                       total_len += 20;
+
+                       /*
+                        * Finally fix the length of the data part
+                        */
+                       len_ptr[0] = total_len << 8;
+                       len_ptr[1] = total_len & 0xff;
+               }
+
+               *uncompressed_ptr = uptr;
+       }
+
+       return ptr;
+
+out:
+       return NULL;
+}
+
 static int forward_dns_reply(unsigned char *reply, int reply_len, int protocol,
                                struct server_data *data)
 {
@@ -1728,7 +1900,7 @@ static int forward_dns_reply(unsigned char *reply, int reply_len, int protocol,
        DBG("Received %d bytes (id 0x%04x)", reply_len, dns_id);
 
        req = find_request(dns_id);
-       if (req == NULL)
+       if (!req)
                return -EINVAL;
 
        DBG("req %p dstid 0x%04x altid 0x%04x rcode %d",
@@ -1739,70 +1911,163 @@ static int forward_dns_reply(unsigned char *reply, int reply_len, int protocol,
 
        req->numresp++;
 
-       if (hdr->rcode == 0 || req->resp == NULL) {
+       if (hdr->rcode == 0 || !req->resp) {
+               unsigned char *new_reply = NULL;
 
                /*
                 * If the domain name was append
                 * remove it before forwarding the reply.
+                * If there were more than one question, then this
+                * domain name ripping can be hairy so avoid that
+                * and bail out in that that case.
+                *
+                * The reason we are doing this magic is that if the
+                * user's DNS client tries to resolv hostname without
+                * domain part, it also expects to get the result without
+                * a domain name part.
                 */
-               if (req->append_domain == TRUE) {
-                       unsigned int domain_len = 0;
-                       unsigned char *ptr;
-                       uint8_t host_len;
-                       unsigned int header_len;
+               if (req->append_domain && ntohs(hdr->qdcount) == 1) {
+                       uint16_t domain_len = 0;
+                       uint16_t header_len;
+                       uint16_t dns_type, dns_class;
+                       uint8_t host_len, dns_type_pos;
+                       char uncompressed[NS_MAXDNAME], *uptr;
+                       char *ptr, *eom = (char *)reply + reply_len;
 
                        /*
                         * ptr points to the first char of the hostname.
                         * ->hostname.domain.net
                         */
                        header_len = offset + sizeof(struct domain_hdr);
-                       ptr = reply + header_len;
+                       ptr = (char *)reply + header_len;
+
                        host_len = *ptr;
                        if (host_len > 0)
-                               domain_len = strnlen((const char *)ptr + 1 +
-                                               host_len,
+                               domain_len = strnlen(ptr + 1 + host_len,
                                                reply_len - header_len);
 
-
-                       DBG("host len %d domain len %d", host_len, domain_len);
+                       /*
+                        * If the query type is anything other than A or AAAA,
+                        * then bail out and pass the message as is.
+                        * We only want to deal with IPv4 or IPv6 addresses.
+                        */
+                       dns_type_pos = host_len + 1 + domain_len + 1;
+
+                       dns_type = ptr[dns_type_pos] << 8 |
+                                                       ptr[dns_type_pos + 1];
+                       dns_class = ptr[dns_type_pos + 2] << 8 |
+                                                       ptr[dns_type_pos + 3];
+                       if (dns_type != ns_t_a && dns_type != ns_t_aaaa &&
+                                       dns_class != ns_c_in) {
+                               DBG("Pass msg dns type %d class %d",
+                                       dns_type, dns_class);
+                               goto pass;
+                       }
 
                        /*
                         * Remove the domain name and replace it by the end
                         * of reply. Check if the domain is really there
-                        * before trying to copy the data. The domain_len can
-                        * be 0 because if the original query did not contain
-                        * a domain name, then we are sending two packets,
-                        * first without the domain name and the second packet
-                        * with domain name. The append_domain is set to true
-                        * even if we sent the first packet without domain
-                        * name. In this case we end up in this branch.
+                        * before trying to copy the data. We also need to
+                        * uncompress the answers if necessary.
+                        * The domain_len can be 0 because if the original
+                        * query did not contain a domain name, then we are
+                        * sending two packets, first without the domain name
+                        * and the second packet with domain name.
+                        * The append_domain is set to true even if we sent
+                        * the first packet without domain name. In this
+                        * case we end up in this branch.
                         */
                        if (domain_len > 0) {
+                               int len = host_len + 1;
+
+                               /*
+                                * First copy host (without domain name) into
+                                * tmp buffer.
+                                */
+                               uptr = &uncompressed[0];
+                               memcpy(uptr, ptr, len);
+
+                               uptr[len] = '\0'; /* host termination */
+                               uptr += len + 1;
+
+                               /*
+                                * Copy type and class fields of the question.
+                                */
+                               ptr += len + domain_len + 1;
+                               memcpy(uptr, ptr, NS_QFIXEDSZ);
+
+                               /*
+                                * ptr points to answers after this
+                                */
+                               ptr += NS_QFIXEDSZ;
+                               uptr += NS_QFIXEDSZ;
+
+                               /*
+                                * We then uncompress the result to buffer
+                                * so that we can rip off the domain name
+                                * part from the question. First answers,
+                                * then name server (authority) information,
+                                * and finally additional record info.
+                                */
+
+                               ptr = uncompress(ntohs(hdr->ancount),
+                                               (char *)reply + offset, eom,
+                                               ptr, uncompressed, NS_MAXDNAME,
+                                               &uptr);
+                               if (ptr == NULL)
+                                       goto out;
+
+                               ptr = uncompress(ntohs(hdr->nscount),
+                                               (char *)reply + offset, eom,
+                                               ptr, uncompressed, NS_MAXDNAME,
+                                               &uptr);
+                               if (ptr == NULL)
+                                       goto out;
+
+                               ptr = uncompress(ntohs(hdr->arcount),
+                                               (char *)reply + offset, eom,
+                                               ptr, uncompressed, NS_MAXDNAME,
+                                               &uptr);
+                               if (ptr == NULL)
+                                       goto out;
+
                                /*
-                                * Note that we must use memmove() here,
-                                * because the memory areas can overlap.
+                                * Because we have now uncompressed the answers
+                                * we must create a bigger buffer to hold all
+                                * that data.
                                 */
-                               memmove(ptr + host_len + 1,
-                                       ptr + host_len + domain_len + 1,
-                                       reply_len - header_len - domain_len);
 
-                               reply_len = reply_len - domain_len;
+                               new_reply = g_try_malloc(header_len +
+                                                       uptr - uncompressed);
+                               if (!new_reply)
+                                       return -ENOMEM;
+
+                               memcpy(new_reply, reply, header_len);
+                               memcpy(new_reply + header_len, uncompressed,
+                                       uptr - uncompressed);
+
+                               reply = new_reply;
+                               reply_len = header_len + uptr - uncompressed;
                        }
                }
 
+       pass:
                g_free(req->resp);
                req->resplen = 0;
 
                req->resp = g_try_malloc(reply_len);
-               if (req->resp == NULL)
+               if (!req->resp)
                        return -ENOMEM;
 
                memcpy(req->resp, reply, reply_len);
                req->resplen = reply_len;
 
                cache_update(data, reply, reply_len);
+
+               g_free(new_reply);
        }
 
+out:
        if (hdr->rcode > 0 && req->numresp < req->numserv)
                return -EINVAL;
 
@@ -1810,8 +2075,12 @@ static int forward_dns_reply(unsigned char *reply, int reply_len, int protocol,
 
        if (protocol == IPPROTO_UDP) {
                sk = get_req_udp_socket(req);
-               err = sendto(sk, req->resp, req->resplen, 0,
-                            &req->sa, req->sa_len);
+               if (sk < 0) {
+                       errno = -EIO;
+                       err = -EIO;
+               } else
+                       err = sendto(sk, req->resp, req->resplen, 0,
+                               &req->sa, req->sa_len);
        } else {
                sk = req->client_sk;
                err = send(sk, req->resp, req->resplen, MSG_NOSIGNAL);
@@ -1843,7 +2112,7 @@ static void server_destroy_socket(struct server_data *data)
                data->timeout = 0;
        }
 
-       if (data->channel != NULL) {
+       if (data->channel) {
                g_io_channel_shutdown(data->channel, TRUE, NULL);
                g_io_channel_unref(data->channel);
                data->channel = NULL;
@@ -1855,10 +2124,8 @@ static void server_destroy_socket(struct server_data *data)
 
 static void destroy_server(struct server_data *server)
 {
-       GList *list;
-
        DBG("index %d server %s sock %d", server->index, server->server,
-                       server->channel != NULL ?
+                       server->channel ?
                        g_io_channel_unix_get_fd(server->channel): -1);
 
        server_list = g_slist_remove(server_list, server);
@@ -1868,12 +2135,7 @@ static void destroy_server(struct server_data *server)
                DBG("Removing DNS server %s", server->server);
 
        g_free(server->server);
-       for (list = server->domains; list; list = list->next) {
-               char *domain = list->data;
-
-               server->domains = g_list_remove(server->domains, domain);
-               g_free(domain);
-       }
+       g_list_free_full(server->domains, g_free);
        g_free(server->server_addr);
 
        /*
@@ -1945,7 +2207,7 @@ hangup:
                        if (req->protocol == IPPROTO_UDP)
                                continue;
 
-                       if (req->request == NULL)
+                       if (!req->request)
                                continue;
 
                        /*
@@ -1972,12 +2234,12 @@ hangup:
        if ((condition & G_IO_OUT) && !server->connected) {
                GSList *list;
                GList *domains;
-               int no_request_sent = TRUE;
+               bool no_request_sent = true;
                struct server_data *udp_server;
 
                udp_server = find_server(server->index, server->server,
                                                                IPPROTO_UDP);
-               if (udp_server != NULL) {
+               if (udp_server) {
                        for (domains = udp_server->domains; domains;
                                                domains = domains->next) {
                                char *dom = domains->data;
@@ -1990,7 +2252,7 @@ hangup:
                        }
                }
 
-               server->connected = TRUE;
+               server->connected = true;
                server_list = g_slist_append(server_list, server);
 
                if (server->timeout > 0) {
@@ -2027,7 +2289,7 @@ hangup:
                                continue;
                        }
 
-                       no_request_sent = FALSE;
+                       no_request_sent = false;
 
                        if (req->timeout > 0)
                                g_source_remove(req->timeout);
@@ -2037,7 +2299,7 @@ hangup:
                        list = list->next;
                }
 
-               if (no_request_sent == TRUE) {
+               if (no_request_sent) {
                        destroy_server(server);
                        return FALSE;
                }
@@ -2115,7 +2377,7 @@ static gboolean tcp_idle_timeout(gpointer user_data)
 
        DBG("");
 
-       if (server == NULL)
+       if (!server)
                return FALSE;
 
        destroy_server(server);
@@ -2145,7 +2407,7 @@ static int server_create_socket(struct server_data *data)
        DBG("sk %d", sk);
 
        interface = connman_inet_ifname(data->index);
-       if (interface != NULL) {
+       if (interface) {
                if (setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE,
                                        interface,
                                        strlen(interface) + 1) < 0) {
@@ -2162,7 +2424,7 @@ static int server_create_socket(struct server_data *data)
        }
 
        data->channel = g_io_channel_unix_new(sk);
-       if (data->channel == NULL) {
+       if (!data->channel) {
                connman_error("Failed to create server %s channel",
                                                        data->server);
                close(sk);
@@ -2213,7 +2475,7 @@ static struct server_data *create_server(int index,
        DBG("index %d server %s", index, server);
 
        data = g_try_new0(struct server_data, 1);
-       if (data == NULL) {
+       if (!data) {
                connman_error("Failed to allocate server %s data", server);
                return NULL;
        }
@@ -2269,7 +2531,7 @@ static struct server_data *create_server(int index,
                connman_error("Wrong address family %d", rp->ai_family);
                break;
        }
-       if (data->server_addr == NULL) {
+       if (!data->server_addr) {
                freeaddrinfo(rp);
                destroy_server(data);
                return NULL;
@@ -2283,9 +2545,12 @@ static struct server_data *create_server(int index,
        }
 
        if (protocol == IPPROTO_UDP) {
-               /* Enable new servers by default */
-               data->enabled = TRUE;
-               DBG("Adding DNS server %s", data->server);
+               if (__connman_service_index_is_default(data->index) ||
+                               __connman_service_index_is_split_routing(
+                                                               data->index)) {
+                       data->enabled = true;
+                       DBG("Adding DNS server %s", data->server);
+               }
 
                server_list = g_slist_append(server_list, data);
        }
@@ -2293,7 +2558,7 @@ static struct server_data *create_server(int index,
        return data;
 }
 
-static gboolean resolv(struct request_data *req,
+static bool resolv(struct request_data *req,
                                gpointer request, gpointer name)
 {
        GSList *list;
@@ -2308,10 +2573,10 @@ static gboolean resolv(struct request_data *req,
 
                DBG("server %s enabled %d", data->server, data->enabled);
 
-               if (data->enabled == FALSE)
+               if (!data->enabled)
                        continue;
 
-               if (data->channel == NULL && data->protocol == IPPROTO_UDP) {
+               if (!data->channel && data->protocol == IPPROTO_UDP) {
                        if (server_create_socket(data) < 0) {
                                DBG("socket creation failed while resolving");
                                continue;
@@ -2319,10 +2584,10 @@ static gboolean resolv(struct request_data *req,
                }
 
                if (ns_resolv(data, req, request, name) > 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 static void append_domain(int index, const char *domain)
@@ -2331,14 +2596,14 @@ static void append_domain(int index, const char *domain)
 
        DBG("index %d domain %s", index, domain);
 
-       if (domain == NULL)
+       if (!domain)
                return;
 
        for (list = server_list; list; list = list->next) {
                struct server_data *data = list->data;
                GList *dom_list;
                char *dom;
-               gboolean dom_found = FALSE;
+               bool dom_found = false;
 
                if (data->index < 0)
                        continue;
@@ -2351,12 +2616,12 @@ static void append_domain(int index, const char *domain)
                        dom = dom_list->data;
 
                        if (g_str_equal(dom, domain)) {
-                               dom_found = TRUE;
+                               dom_found = true;
                                break;
                        }
                }
 
-               if (dom_found == FALSE) {
+               if (!dom_found) {
                        data->domains =
                                g_list_append(data->domains, g_strdup(domain));
                }
@@ -2370,29 +2635,29 @@ int __connman_dnsproxy_append(int index, const char *domain,
 
        DBG("index %d server %s", index, server);
 
-       if (server == NULL && domain == NULL)
+       if (!server && !domain)
                return -EINVAL;
 
-       if (server == NULL) {
+       if (!server) {
                append_domain(index, domain);
 
                return 0;
        }
 
-       if (g_str_equal(server, "127.0.0.1") == TRUE)
+       if (g_str_equal(server, "127.0.0.1"))
                return -ENODEV;
 
-       if (g_str_equal(server, "::1") == TRUE)
+       if (g_str_equal(server, "::1"))
                return -ENODEV;
 
        data = find_server(index, server, IPPROTO_UDP);
-       if (data != NULL) {
+       if (data) {
                append_domain(index, domain);
                return 0;
        }
 
        data = create_server(index, domain, server, IPPROTO_UDP);
-       if (data == NULL)
+       if (!data)
                return -EIO;
 
        return 0;
@@ -2404,7 +2669,7 @@ static void remove_server(int index, const char *domain,
        struct server_data *data;
 
        data = find_server(index, server, protocol);
-       if (data == NULL)
+       if (!data)
                return;
 
        destroy_server(data);
@@ -2415,13 +2680,13 @@ int __connman_dnsproxy_remove(int index, const char *domain,
 {
        DBG("index %d server %s", index, server);
 
-       if (server == NULL)
+       if (!server)
                return -EINVAL;
 
-       if (g_str_equal(server, "127.0.0.1") == TRUE)
+       if (g_str_equal(server, "127.0.0.1"))
                return -ENODEV;
 
-       if (g_str_equal(server, "::1") == TRUE)
+       if (g_str_equal(server, "::1"))
                return -ENODEV;
 
        remove_server(index, domain, server, IPPROTO_UDP);
@@ -2440,7 +2705,7 @@ void __connman_dnsproxy_flush(void)
 
                list = list->next;
 
-               if (resolv(req, req->request, req->name) == TRUE) {
+               if (resolv(req, req->request, req->name)) {
                        /*
                         * A cached result was sent,
                         * so the request can be released
@@ -2457,7 +2722,7 @@ void __connman_dnsproxy_flush(void)
        }
 }
 
-static void dnsproxy_offline_mode(connman_bool_t enabled)
+static void dnsproxy_offline_mode(bool enabled)
 {
        GSList *list;
 
@@ -2466,14 +2731,14 @@ static void dnsproxy_offline_mode(connman_bool_t enabled)
        for (list = server_list; list; list = list->next) {
                struct server_data *data = list->data;
 
-               if (enabled == FALSE) {
+               if (!enabled) {
                        DBG("Enabling DNS server %s", data->server);
-                       data->enabled = TRUE;
+                       data->enabled = true;
                        cache_invalidate();
                        cache_refresh();
                } else {
                        DBG("Disabling DNS server %s", data->server);
-                       data->enabled = FALSE;
+                       data->enabled = false;
                        cache_invalidate();
                }
        }
@@ -2489,9 +2754,9 @@ static void dnsproxy_default_changed(struct connman_service *service)
        /* DNS has changed, invalidate the cache */
        cache_invalidate();
 
-       if (service == NULL) {
+       if (!service) {
                /* When no services are active, then disable DNS proxying */
-               dnsproxy_offline_mode(TRUE);
+               dnsproxy_offline_mode(true);
                return;
        }
 
@@ -2504,10 +2769,10 @@ static void dnsproxy_default_changed(struct connman_service *service)
 
                if (data->index == index) {
                        DBG("Enabling DNS server %s", data->server);
-                       data->enabled = TRUE;
+                       data->enabled = true;
                } else {
                        DBG("Disabling DNS server %s", data->server);
-                       data->enabled = FALSE;
+                       data->enabled = false;
                }
        }
 
@@ -2596,10 +2861,10 @@ static int parse_request(unsigned char *buf, int len,
 
 static void client_reset(struct tcp_partial_client_data *client)
 {
-       if (client == NULL)
+       if (!client)
                return;
 
-       if (client->channel != NULL) {
+       if (client->channel) {
                DBG("client %d closing",
                        g_io_channel_unix_get_fd(client->channel));
 
@@ -2628,7 +2893,7 @@ static unsigned int get_msg_len(unsigned char *buf)
        return buf[0]<<8 | buf[1];
 }
 
-static gboolean read_tcp_data(struct tcp_partial_client_data *client,
+static bool read_tcp_data(struct tcp_partial_client_data *client,
                                void *client_addr, socklen_t client_addr_len,
                                int read_len)
 {
@@ -2637,7 +2902,8 @@ static gboolean read_tcp_data(struct tcp_partial_client_data *client,
        int client_sk, err;
        unsigned int msg_len;
        GSList *list;
-       int waiting_for_connect = FALSE, qtype = 0;
+       bool waiting_for_connect = false;
+       int qtype = 0;
        struct cache_entry *entry;
 
        client_sk = g_io_channel_unix_get_fd(client->channel);
@@ -2647,7 +2913,7 @@ static gboolean read_tcp_data(struct tcp_partial_client_data *client,
                        client_sk, client->buf_end);
                g_hash_table_remove(partial_tcp_req_table,
                                        GINT_TO_POINTER(client_sk));
-               return FALSE;
+               return false;
        }
 
        DBG("client %d received %d bytes", client_sk, read_len);
@@ -2655,14 +2921,14 @@ static gboolean read_tcp_data(struct tcp_partial_client_data *client,
        client->buf_end += read_len;
 
        if (client->buf_end < 2)
-               return TRUE;
+               return true;
 
        msg_len = get_msg_len(client->buf);
        if (msg_len > TCP_MAX_BUF_LEN) {
                DBG("client %d sent too much data %d", client_sk, msg_len);
                g_hash_table_remove(partial_tcp_req_table,
                                        GINT_TO_POINTER(client_sk));
-               return FALSE;
+               return false;
        }
 
 read_another:
@@ -2673,7 +2939,7 @@ read_another:
                DBG("client %d still missing %d bytes",
                        client_sk,
                        msg_len + 2 - client->buf_end);
-               return TRUE;
+               return true;
        }
 
        DBG("client %d all data %d received", client_sk, msg_len);
@@ -2683,12 +2949,12 @@ read_another:
        if (err < 0 || (g_slist_length(server_list) == 0)) {
                send_response(client_sk, client->buf, msg_len + 2,
                        NULL, 0, IPPROTO_TCP);
-               return TRUE;
+               return true;
        }
 
        req = g_try_new0(struct request_data, 1);
-       if (req == NULL)
-               return TRUE;
+       if (!req)
+               return true;
 
        memcpy(&req->sa, client_addr, client_addr_len);
        req->sa_len = client_addr_len;
@@ -2706,14 +2972,14 @@ read_another:
 
        req->numserv = 0;
        req->ifdata = client->ifdata;
-       req->append_domain = FALSE;
+       req->append_domain = false;
 
        /*
         * Check if the answer is found in the cache before
         * creating sockets to the server.
         */
        entry = cache_check(client->buf, &qtype, IPPROTO_TCP);
-       if (entry != NULL) {
+       if (entry) {
                int ttl_left = 0;
                struct cache_data *data;
 
@@ -2723,7 +2989,7 @@ read_another:
                else
                        data = entry->ipv6;
 
-               if (data != NULL) {
+               if (data) {
                        ttl_left = data->valid_until - time(NULL);
                        entry->hits++;
 
@@ -2740,22 +3006,22 @@ read_another:
        for (list = server_list; list; list = list->next) {
                struct server_data *data = list->data;
 
-               if (data->protocol != IPPROTO_UDP || data->enabled == FALSE)
+               if (data->protocol != IPPROTO_UDP || !data->enabled)
                        continue;
 
-               if(create_server(data->index, NULL,
-                                       data->server, IPPROTO_TCP) == NULL)
+               if (!create_server(data->index, NULL, data->server,
+                                       IPPROTO_TCP))
                        continue;
 
-               waiting_for_connect = TRUE;
+               waiting_for_connect = true;
        }
 
-       if (waiting_for_connect == FALSE) {
+       if (!waiting_for_connect) {
                /* No server is waiting for connect */
                send_response(client_sk, client->buf,
                        req->request_len, NULL, 0, IPPROTO_TCP);
                g_free(req);
-               return TRUE;
+               return true;
        }
 
        /*
@@ -2765,7 +3031,7 @@ read_another:
         * properly connected over TCP to the nameserver.
         */
        req->request = g_try_malloc0(req->request_len);
-       if (req->request == NULL) {
+       if (!req->request) {
                send_response(client_sk, client->buf,
                        req->request_len, NULL, 0, IPPROTO_TCP);
                g_free(req);
@@ -2774,7 +3040,7 @@ read_another:
        memcpy(req->request, client->buf, req->request_len);
 
        req->name = g_try_malloc0(sizeof(query));
-       if (req->name == NULL) {
+       if (!req->name) {
                send_response(client_sk, client->buf,
                        req->request_len, NULL, 0, IPPROTO_TCP);
                g_free(req->request);
@@ -2824,7 +3090,7 @@ out:
                client->timeout = 0;
        }
 
-       return TRUE;
+       return true;
 }
 
 static gboolean tcp_client_event(GIOChannel *channel, GIOCondition condition,
@@ -2896,7 +3162,7 @@ static gboolean client_timeout(gpointer user_data)
        return FALSE;
 }
 
-static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
+static bool tcp_listener_event(GIOChannel *channel, GIOCondition condition,
                                struct listener_data *ifdata, int family,
                                guint *listener_watch)
 {
@@ -2922,7 +3188,7 @@ static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
 
                connman_error("Error with TCP listener channel");
 
-               return FALSE;
+               return false;
        }
 
        sk = g_io_channel_unix_get_fd(channel);
@@ -2945,23 +3211,25 @@ static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
                DBG("client %d accepted", client_sk);
        } else {
                DBG("No data to read from master %d, waiting.", sk);
-               return TRUE;
+               return true;
        }
 
        if (client_sk < 0) {
                connman_error("Accept failure on TCP listener");
                *listener_watch = 0;
-               return FALSE;
+               return false;
        }
 
        fcntl(client_sk, F_SETFL, O_NONBLOCK);
 
        client = g_hash_table_lookup(partial_tcp_req_table,
                                        GINT_TO_POINTER(client_sk));
-       if (client == NULL) {
+       if (!client) {
                client = g_try_new0(struct tcp_partial_client_data, 1);
-               if (client == NULL)
-                       return FALSE;
+               if (!client) {
+                       close(client_sk);
+                       return false;
+               }
 
                g_hash_table_insert(partial_tcp_req_table,
                                        GINT_TO_POINTER(client_sk),
@@ -2981,10 +3249,10 @@ static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
                DBG("client %d already exists %p", client_sk, client);
        }
 
-       if (client->buf == NULL) {
+       if (!client->buf) {
                client->buf = g_try_malloc(TCP_MAX_BUF_LEN);
-               if (client->buf == NULL)
-                       return FALSE;
+               if (!client->buf)
+                       return false;
        }
        memset(client->buf, 0, TCP_MAX_BUF_LEN);
        client->buf_end = 0;
@@ -3003,20 +3271,20 @@ static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
        if (len < 0) {
                if (errno == EAGAIN || errno == EWOULDBLOCK) {
                        DBG("client %d no data to read, waiting", client_sk);
-                       return TRUE;
+                       return true;
                }
 
                DBG("client %d cannot read errno %d/%s", client_sk, -errno,
                        strerror(errno));
                g_hash_table_remove(partial_tcp_req_table,
                                        GINT_TO_POINTER(client_sk));
-               return TRUE;
+               return true;
        }
 
        if (len < 2) {
                DBG("client %d not enough data to read, waiting", client_sk);
                client->buf_end += len;
-               return TRUE;
+               return true;
        }
 
        msg_len = get_msg_len(client->buf);
@@ -3025,7 +3293,7 @@ static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
                        client_sk, msg_len);
                g_hash_table_remove(partial_tcp_req_table,
                                        GINT_TO_POINTER(client_sk));
-               return TRUE;
+               return true;
        }
 
        /*
@@ -3037,7 +3305,7 @@ static gboolean tcp_listener_event(GIOChannel *channel, GIOCondition condition,
                        client_sk, len, msg_len + 2, msg_len + 2 - len);
 
                client->buf_end += len;
-               return TRUE;
+               return true;
        }
 
        return read_tcp_data(client, client_addr, *client_addr_len, len);
@@ -3061,7 +3329,7 @@ static gboolean tcp6_listener_event(GIOChannel *channel, GIOCondition condition,
                                &ifdata->tcp6_listener_watch);
 }
 
-static gboolean udp_listener_event(GIOChannel *channel, GIOCondition condition,
+static bool udp_listener_event(GIOChannel *channel, GIOCondition condition,
                                struct listener_data *ifdata, int family,
                                guint *listener_watch)
 {
@@ -3079,7 +3347,7 @@ static gboolean udp_listener_event(GIOChannel *channel, GIOCondition condition,
        if (condition & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
                connman_error("Error with UDP listener channel");
                *listener_watch = 0;
-               return FALSE;
+               return false;
        }
 
        sk = g_io_channel_unix_get_fd(channel);
@@ -3095,7 +3363,7 @@ static gboolean udp_listener_event(GIOChannel *channel, GIOCondition condition,
        memset(client_addr, 0, *client_addr_len);
        len = recvfrom(sk, buf, sizeof(buf), 0, client_addr, client_addr_len);
        if (len < 2)
-               return TRUE;
+               return true;
 
        DBG("Received %d bytes (id 0x%04x)", len, buf[0] | buf[1] << 8);
 
@@ -3103,12 +3371,12 @@ static gboolean udp_listener_event(GIOChannel *channel, GIOCondition condition,
        if (err < 0 || (g_slist_length(server_list) == 0)) {
                send_response(sk, buf, len, client_addr,
                                *client_addr_len, IPPROTO_UDP);
-               return TRUE;
+               return true;
        }
 
        req = g_try_new0(struct request_data, 1);
-       if (req == NULL)
-               return TRUE;
+       if (!req)
+               return true;
 
        memcpy(&req->sa, client_addr, *client_addr_len);
        req->sa_len = *client_addr_len;
@@ -3126,18 +3394,18 @@ static gboolean udp_listener_event(GIOChannel *channel, GIOCondition condition,
 
        req->numserv = 0;
        req->ifdata = ifdata;
-       req->append_domain = FALSE;
+       req->append_domain = false;
 
-       if (resolv(req, buf, query) == TRUE) {
+       if (resolv(req, buf, query)) {
                /* a cached result was sent, so the request can be released */
                g_free(req);
-               return TRUE;
+               return true;
        }
 
        req->timeout = g_timeout_add_seconds(5, request_timeout, req);
        request_list = g_slist_append(request_list, req);
 
-       return TRUE;
+       return true;
 }
 
 static gboolean udp4_listener_event(GIOChannel *channel, GIOCondition condition,
@@ -3200,7 +3468,7 @@ static GIOChannel *get_listener(int family, int protocol, int index)
        }
 
        interface = connman_inet_ifname(index);
-       if (interface == NULL || setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE,
+       if (!interface || setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE,
                                        interface,
                                        strlen(interface) + 1) < 0) {
                connman_error("Failed to bind %s listener interface "
@@ -3266,7 +3534,7 @@ static GIOChannel *get_listener(int family, int protocol, int index)
        }
 
        channel = g_io_channel_unix_new(sk);
-       if (channel == NULL) {
+       if (!channel) {
                connman_error("Failed to create %s listener channel", proto);
                close(sk);
                return NULL;
@@ -3293,7 +3561,7 @@ static int create_dns_listener(int protocol, struct listener_data *ifdata)
        if (protocol == IPPROTO_TCP) {
                ifdata->tcp4_listener_channel = get_listener(AF_INET, protocol,
                                                        ifdata->index);
-               if (ifdata->tcp4_listener_channel != NULL)
+               if (ifdata->tcp4_listener_channel)
                        ifdata->tcp4_listener_watch =
                                g_io_add_watch(ifdata->tcp4_listener_channel,
                                        G_IO_IN, tcp4_listener_event,
@@ -3303,7 +3571,7 @@ static int create_dns_listener(int protocol, struct listener_data *ifdata)
 
                ifdata->tcp6_listener_channel = get_listener(AF_INET6, protocol,
                                                        ifdata->index);
-               if (ifdata->tcp6_listener_channel != NULL)
+               if (ifdata->tcp6_listener_channel)
                        ifdata->tcp6_listener_watch =
                                g_io_add_watch(ifdata->tcp6_listener_channel,
                                        G_IO_IN, tcp6_listener_event,
@@ -3313,7 +3581,7 @@ static int create_dns_listener(int protocol, struct listener_data *ifdata)
        } else {
                ifdata->udp4_listener_channel = get_listener(AF_INET, protocol,
                                                        ifdata->index);
-               if (ifdata->udp4_listener_channel != NULL)
+               if (ifdata->udp4_listener_channel)
                        ifdata->udp4_listener_watch =
                                g_io_add_watch(ifdata->udp4_listener_channel,
                                        G_IO_IN, udp4_listener_event,
@@ -3323,7 +3591,7 @@ static int create_dns_listener(int protocol, struct listener_data *ifdata)
 
                ifdata->udp6_listener_channel = get_listener(AF_INET6, protocol,
                                                        ifdata->index);
-               if (ifdata->udp6_listener_channel != NULL)
+               if (ifdata->udp6_listener_channel)
                        ifdata->udp6_listener_watch =
                                g_io_add_watch(ifdata->udp6_listener_channel,
                                        G_IO_IN, udp6_listener_event,
@@ -3345,9 +3613,9 @@ static void destroy_udp_listener(struct listener_data *ifdata)
        if (ifdata->udp6_listener_watch > 0)
                g_source_remove(ifdata->udp6_listener_watch);
 
-       if (ifdata->udp4_listener_channel != NULL)
+       if (ifdata->udp4_listener_channel)
                g_io_channel_unref(ifdata->udp4_listener_channel);
-       if (ifdata->udp6_listener_channel != NULL)
+       if (ifdata->udp6_listener_channel)
                g_io_channel_unref(ifdata->udp6_listener_channel);
 }
 
@@ -3360,9 +3628,9 @@ static void destroy_tcp_listener(struct listener_data *ifdata)
        if (ifdata->tcp6_listener_watch > 0)
                g_source_remove(ifdata->tcp6_listener_watch);
 
-       if (ifdata->tcp4_listener_channel != NULL)
+       if (ifdata->tcp4_listener_channel)
                g_io_channel_unref(ifdata->tcp4_listener_channel);
-       if (ifdata->tcp6_listener_channel != NULL)
+       if (ifdata->tcp6_listener_channel)
                g_io_channel_unref(ifdata->tcp6_listener_channel);
 }
 
@@ -3429,14 +3697,14 @@ int __connman_dnsproxy_add_listener(int index)
        if (index < 0)
                return -EINVAL;
 
-       if (listener_table == NULL)
+       if (!listener_table)
                return -ENOENT;
 
-       if (g_hash_table_lookup(listener_table, GINT_TO_POINTER(index)) != NULL)
+       if (g_hash_table_lookup(listener_table, GINT_TO_POINTER(index)))
                return 0;
 
        ifdata = g_try_new0(struct listener_data, 1);
-       if (ifdata == NULL)
+       if (!ifdata)
                return -ENOMEM;
 
        ifdata->index = index;
@@ -3467,11 +3735,11 @@ void __connman_dnsproxy_remove_listener(int index)
 
        DBG("index %d", index);
 
-       if (listener_table == NULL)
+       if (!listener_table)
                return;
 
        ifdata = g_hash_table_lookup(listener_table, GINT_TO_POINTER(index));
-       if (ifdata == NULL)
+       if (!ifdata)
                return;
 
        destroy_listener(ifdata);
diff --git a/src/eduroam.config b/src/eduroam.config
new file mode 100644 (file)
index 0000000..768b7b4
--- /dev/null
@@ -0,0 +1,5 @@
+[service_eduroam]
+Type = wifi
+Name = eduroam
+EAP = peap
+Phase2 = MSCHAPV2
index 955b4b8..4f24ae2 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
index c235d86..90c3d3c 100644 (file)
@@ -57,6 +57,8 @@ struct firewall_context {
 
 static GSList *managed_tables;
 
+static bool firewall_is_up;
+
 static int chain_to_index(const char *chain_name)
 {
        if (!g_strcmp0(builtin_chains[NF_IP_PRE_ROUTING], chain_name))
@@ -75,7 +77,7 @@ static int chain_to_index(const char *chain_name)
 
 static int managed_chain_to_index(const char *chain_name)
 {
-       if (g_str_has_prefix(chain_name, CHAIN_PREFIX) == FALSE)
+       if (!g_str_has_prefix(chain_name, CHAIN_PREFIX))
                return -1;
 
        return chain_to_index(chain_name + strlen(CHAIN_PREFIX));
@@ -146,7 +148,7 @@ static int insert_managed_rule(const char *table_name,
                goto out;
        }
 
-       for (list = managed_tables; list != NULL; list = list->next) {
+       for (list = managed_tables; list; list = list->next) {
                mtable = list->data;
 
                if (g_strcmp0(mtable->name, table_name) == 0)
@@ -155,7 +157,7 @@ static int insert_managed_rule(const char *table_name,
                mtable = NULL;
        }
 
-       if (mtable == NULL) {
+       if (!mtable) {
                mtable = g_new0(struct connman_managed_table, 1);
                mtable->name = g_strdup(table_name);
 
@@ -203,7 +205,7 @@ static int delete_managed_rule(const char *table_name,
        err = __connman_iptables_delete(table_name, managed_chain,
                                        rule_spec);
 
-       for (list = managed_tables; list != NULL; list = list->next) {
+       for (list = managed_tables; list; list = list->next) {
                mtable = list->data;
 
                if (g_strcmp0(mtable->name, table_name) == 0)
@@ -212,7 +214,7 @@ static int delete_managed_rule(const char *table_name,
                mtable = NULL;
        }
 
-       if (mtable == NULL) {
+       if (!mtable) {
                err = -ENOENT;
                goto out;
        }
@@ -297,7 +299,7 @@ static int firewall_disable(GList *rules)
        GList *list;
        int err;
 
-       for (list = rules; list != NULL; list = g_list_previous(list)) {
+       for (list = rules; list; list = g_list_previous(list)) {
                rule = list->data;
 
                err = delete_managed_rule(rule->table,
@@ -325,7 +327,7 @@ int __connman_firewall_enable(struct firewall_context *ctx)
        GList *list;
        int err;
 
-       for (list = g_list_first(ctx->rules); list != NULL;
+       for (list = g_list_first(ctx->rules); list;
                        list = g_list_next(list)) {
                rule = list->data;
 
@@ -341,6 +343,8 @@ int __connman_firewall_enable(struct firewall_context *ctx)
                        goto err;
        }
 
+       firewall_is_up = true;
+
        return 0;
 
 err:
@@ -356,6 +360,11 @@ int __connman_firewall_disable(struct firewall_context *ctx)
        return firewall_disable(g_list_last(ctx->rules));
 }
 
+bool __connman_firewall_is_up(void)
+{
+       return firewall_is_up;
+}
+
 static void iterate_chains_cb(const char *chain_name, void *user_data)
 {
        GSList **chains = user_data;
@@ -377,7 +386,7 @@ static void flush_table(const char *table_name)
        __connman_iptables_iterate_chains(table_name, iterate_chains_cb,
                                                &chains);
 
-       for (list = chains; list != NULL; list = list->next) {
+       for (list = chains; list; list = list->next) {
                id = GPOINTER_TO_INT(list->data);
 
                managed_chain = g_strdup_printf("%s%s", CHAIN_PREFIX,
@@ -417,7 +426,17 @@ static void flush_table(const char *table_name)
 
 static void flush_all_tables(void)
 {
-       /* Flush the tables ConnMan might have modified */
+       /* Flush the tables ConnMan might have modified
+        * But do so if only ConnMan has done something with
+        * iptables */
+
+       if (!g_file_test("/proc/net/ip_tables_names",
+                       G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
+               firewall_is_up = false;
+               return;
+       }
+
+       firewall_is_up = true;
 
        flush_table("filter");
        flush_table("mangle");
index 5196576..6111629 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *  Copyright (C) 2003-2005  Go-Core Project
  *  Copyright (C) 2003-2006  Helsinki University of Technology
  *
 #include <linux/if_tun.h>
 #include <ctype.h>
 #include <ifaddrs.h>
+#include <linux/fib_rules.h>
 
 #include "connman.h"
+#include <gdhcp/gdhcp.h>
 
 #define NLMSG_TAIL(nmsg)                               \
        ((struct rtattr *) (((uint8_t*) (nmsg)) +       \
@@ -96,7 +98,7 @@ int __connman_inet_modify_address(int cmd, int flags,
                "prefixlen %hhu broadcast %s", cmd, flags, index, family,
                address, peer, prefixlen, broadcast);
 
-       if (address == NULL)
+       if (!address)
                return -EINVAL;
 
        if (family != AF_INET && family != AF_INET6)
@@ -121,13 +123,13 @@ int __connman_inet_modify_address(int cmd, int flags,
                if (inet_pton(AF_INET, address, &ipv4_addr) < 1)
                        return -1;
 
-               if (broadcast != NULL)
+               if (broadcast)
                        inet_pton(AF_INET, broadcast, &ipv4_bcast);
                else
                        ipv4_bcast.s_addr = ipv4_addr.s_addr |
                                htonl(0xfffffffflu >> prefixlen);
 
-               if (peer != NULL) {
+               if (peer) {
                        if (inet_pton(AF_INET, peer, &ipv4_dest) < 1)
                                return -1;
 
@@ -193,7 +195,7 @@ int connman_inet_ifindex(const char *name)
        struct ifreq ifr;
        int sk, err;
 
-       if (name == NULL)
+       if (!name)
                return -1;
 
        sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
@@ -201,7 +203,7 @@ int connman_inet_ifindex(const char *name)
                return -1;
 
        memset(&ifr, 0, sizeof(ifr));
-       strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+       strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name) - 1);
 
        err = ioctl(sk, SIOCGIFINDEX, &ifr);
 
@@ -334,7 +336,7 @@ int connman_inet_ifdown(int index)
        }
 
        memset(&addr_ifr, 0, sizeof(addr_ifr));
-       memcpy(&addr_ifr.ifr_name, &ifr.ifr_name, sizeof(ifr.ifr_name));
+       memcpy(&addr_ifr.ifr_name, &ifr.ifr_name, sizeof(ifr.ifr_name) - 1);
        addr = (struct sockaddr_in *)&addr_ifr.ifr_addr;
        addr->sin_family = AF_INET;
        if (ioctl(sk, SIOCSIFADDR, &addr_ifr) < 0)
@@ -358,9 +360,9 @@ done:
        return err;
 }
 
-connman_bool_t connman_inet_is_cfg80211(int index)
+bool connman_inet_is_cfg80211(int index)
 {
-       connman_bool_t result = FALSE;
+       bool result = false;
        char phy80211_path[PATH_MAX];
        struct stat st;
        struct ifreq ifr;
@@ -368,7 +370,7 @@ connman_bool_t connman_inet_is_cfg80211(int index)
 
        sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sk < 0)
-               return FALSE;
+               return false;
 
        memset(&ifr, 0, sizeof(ifr));
        ifr.ifr_ifindex = index;
@@ -380,7 +382,7 @@ connman_bool_t connman_inet_is_cfg80211(int index)
                                "/sys/class/net/%s/phy80211", ifr.ifr_name);
 
        if (stat(phy80211_path, &st) == 0 && (st.st_mode & S_IFDIR))
-               result = TRUE;
+               result = true;
 
 done:
        close(sk);
@@ -401,7 +403,7 @@ int connman_inet_set_ipv6_address(int index,
        unsigned char prefix_len;
        const char *address;
 
-       if (ipaddress->local == NULL)
+       if (!ipaddress->local)
                return 0;
 
        prefix_len = ipaddress->prefixlen;
@@ -426,7 +428,7 @@ int connman_inet_set_address(int index, struct connman_ipaddress *ipaddress)
        unsigned char prefix_len;
        const char *address, *broadcast, *peer;
 
-       if (ipaddress->local == NULL)
+       if (!ipaddress->local)
                return -1;
 
        prefix_len = ipaddress->prefixlen;
@@ -454,6 +456,9 @@ int connman_inet_clear_ipv6_address(int index, const char *address,
 
        DBG("index %d address %s prefix_len %d", index, address, prefix_len);
 
+       if (!address)
+               return -EINVAL;
+
        err = __connman_inet_modify_address(RTM_DELADDR, 0, index, AF_INET6,
                                address, NULL, prefix_len, NULL);
        if (err < 0) {
@@ -477,6 +482,9 @@ int connman_inet_clear_address(int index, struct connman_ipaddress *ipaddress)
 
        DBG("index %d address %s prefix_len %d", index, address, prefix_len);
 
+       if (!address)
+               return -EINVAL;
+
        err = __connman_inet_modify_address(RTM_DELADDR, 0, index, AF_INET,
                                address, peer, prefix_len, broadcast);
        if (err < 0) {
@@ -529,9 +537,9 @@ int connman_inet_add_network_route(int index, const char *host,
 
        memset(&rt, 0, sizeof(rt));
        rt.rt_flags = RTF_UP;
-       if (gateway != NULL)
+       if (gateway)
                rt.rt_flags |= RTF_GATEWAY;
-       if (netmask == NULL)
+       if (!netmask)
                rt.rt_flags |= RTF_HOST;
 
        memset(&addr, 0, sizeof(addr));
@@ -541,7 +549,7 @@ int connman_inet_add_network_route(int index, const char *host,
 
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
-       if (gateway != NULL)
+       if (gateway)
                addr.sin_addr.s_addr = inet_addr(gateway);
        else
                addr.sin_addr.s_addr = INADDR_ANY;
@@ -550,7 +558,7 @@ int connman_inet_add_network_route(int index, const char *host,
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
-       if (netmask != NULL)
+       if (netmask)
                addr.sin_addr.s_addr = inet_addr(netmask);
        else
                addr.sin_addr.s_addr = INADDR_ANY;
@@ -628,7 +636,7 @@ int connman_inet_del_ipv6_network_route(int index, const char *host,
 
        DBG("index %d host %s", index, host);
 
-       if (host == NULL)
+       if (!host)
                return -EINVAL;
 
        memset(&rt, 0, sizeof(rt));
@@ -678,7 +686,7 @@ int connman_inet_add_ipv6_network_route(int index, const char *host,
 
        DBG("index %d host %s gateway %s", index, host, gateway);
 
-       if (host == NULL)
+       if (!host)
                return -EINVAL;
 
        memset(&rt, 0, sizeof(rt));
@@ -692,7 +700,7 @@ int connman_inet_add_ipv6_network_route(int index, const char *host,
 
        rt.rtmsg_flags = RTF_UP | RTF_HOST;
 
-       if (gateway != NULL) {
+       if (gateway) {
                rt.rtmsg_flags |= RTF_GATEWAY;
                inet_pton(AF_INET6, gateway, &rt.rtmsg_gateway);
        }
@@ -725,47 +733,6 @@ int connman_inet_add_ipv6_host_route(int index, const char *host,
        return connman_inet_add_ipv6_network_route(index, host, gateway, 128);
 }
 
-int connman_inet_set_ipv6_gateway_address(int index, const char *gateway)
-{
-       struct in6_rtmsg rt;
-       int sk, err = 0;
-
-       DBG("index %d gateway %s", index, gateway);
-
-       if (gateway == NULL)
-               return -EINVAL;
-
-       memset(&rt, 0, sizeof(rt));
-
-       if (inet_pton(AF_INET6, gateway, &rt.rtmsg_gateway) < 0) {
-               err = -errno;
-               goto out;
-       }
-
-       rt.rtmsg_flags = RTF_UP | RTF_GATEWAY;
-       rt.rtmsg_metric = 1;
-       rt.rtmsg_dst_len = 0;
-       rt.rtmsg_ifindex = index;
-
-       sk = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
-       if (sk < 0) {
-               err = -errno;
-               goto out;
-       }
-
-       if (ioctl(sk, SIOCADDRT, &rt) < 0 && errno != EEXIST)
-               err = -errno;
-
-       close(sk);
-
-out:
-       if (err < 0)
-               connman_error("Set default IPv6 gateway error (%s)",
-                                               strerror(-err));
-
-       return err;
-}
-
 int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway)
 {
        struct in6_rtmsg rt;
@@ -773,7 +740,7 @@ int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway)
 
        DBG("index %d gateway %s", index, gateway);
 
-       if (gateway == NULL)
+       if (!gateway)
                return -EINVAL;
 
        memset(&rt, 0, sizeof(rt));
@@ -807,63 +774,6 @@ out:
        return err;
 }
 
-int connman_inet_set_gateway_address(int index, const char *gateway)
-{
-       struct ifreq ifr;
-       struct rtentry rt;
-       struct sockaddr_in addr;
-       int sk, err = 0;
-
-       DBG("index %d gateway %s", index, gateway);
-
-       sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
-       if (sk < 0) {
-               err = -errno;
-               goto out;
-       }
-
-       memset(&ifr, 0, sizeof(ifr));
-       ifr.ifr_ifindex = index;
-
-       if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
-               err = -errno;
-               close(sk);
-               goto out;
-       }
-
-       DBG("ifname %s", ifr.ifr_name);
-
-       memset(&rt, 0, sizeof(rt));
-       rt.rt_flags = RTF_UP | RTF_GATEWAY;
-
-       memset(&addr, 0, sizeof(addr));
-       addr.sin_family = AF_INET;
-       addr.sin_addr.s_addr = INADDR_ANY;
-       memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
-
-       memset(&addr, 0, sizeof(addr));
-       addr.sin_family = AF_INET;
-       addr.sin_addr.s_addr = inet_addr(gateway);
-       memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
-
-       memset(&addr, 0, sizeof(addr));
-       addr.sin_family = AF_INET;
-       addr.sin_addr.s_addr = INADDR_ANY;
-       memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
-
-       if (ioctl(sk, SIOCADDRT, &rt) < 0 && errno != EEXIST)
-               err = -errno;
-
-       close(sk);
-
-out:
-       if (err < 0)
-               connman_error("Setting default gateway route failed (%s)",
-                                                       strerror(-err));
-
-       return err;
-}
-
 int connman_inet_set_gateway_interface(int index)
 {
        struct ifreq ifr;
@@ -1131,7 +1041,7 @@ out:
        return err;
 }
 
-connman_bool_t connman_inet_compare_subnet(int index, const char *host)
+bool connman_inet_compare_subnet(int index, const char *host)
 {
        struct ifreq ifr;
        struct in_addr _host_addr;
@@ -1141,8 +1051,8 @@ connman_bool_t connman_inet_compare_subnet(int index, const char *host)
 
        DBG("host %s", host);
 
-       if (host == NULL)
-               return FALSE;
+       if (!host)
+               return false;
 
        if (inet_aton(host, &_host_addr) == 0)
                return -1;
@@ -1150,19 +1060,19 @@ connman_bool_t connman_inet_compare_subnet(int index, const char *host)
 
        sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sk < 0)
-               return FALSE;
+               return false;
 
        memset(&ifr, 0, sizeof(ifr));
        ifr.ifr_ifindex = index;
 
        if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
                close(sk);
-               return FALSE;
+               return false;
        }
 
        if (ioctl(sk, SIOCGIFNETMASK, &ifr) < 0) {
                close(sk);
-               return FALSE;
+               return false;
        }
 
        netmask = (struct sockaddr_in *)&ifr.ifr_netmask;
@@ -1170,7 +1080,7 @@ connman_bool_t connman_inet_compare_subnet(int index, const char *host)
 
        if (ioctl(sk, SIOCGIFADDR, &ifr) < 0) {
                close(sk);
-               return FALSE;
+               return false;
        }
 
        close(sk);
@@ -1186,7 +1096,7 @@ int connman_inet_remove_from_bridge(int index, const char *bridge)
        struct ifreq ifr;
        int sk, err = 0;
 
-       if (bridge == NULL)
+       if (!bridge)
                return -EINVAL;
 
        sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
@@ -1196,7 +1106,7 @@ int connman_inet_remove_from_bridge(int index, const char *bridge)
        }
 
        memset(&ifr, 0, sizeof(ifr));
-       strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
+       strncpy(ifr.ifr_name, bridge, sizeof(ifr.ifr_name) - 1);
        ifr.ifr_ifindex = index;
 
        if (ioctl(sk, SIOCBRDELIF, &ifr) < 0)
@@ -1217,7 +1127,7 @@ int connman_inet_add_to_bridge(int index, const char *bridge)
        struct ifreq ifr;
        int sk, err = 0;
 
-       if (bridge == NULL)
+       if (!bridge)
                return -EINVAL;
 
        sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
@@ -1227,7 +1137,7 @@ int connman_inet_add_to_bridge(int index, const char *bridge)
        }
 
        memset(&ifr, 0, sizeof(ifr));
-       strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
+       strncpy(ifr.ifr_name, bridge, sizeof(ifr.ifr_name) - 1);
        ifr.ifr_ifindex = index;
 
        if (ioctl(sk, SIOCBRADDIF, &ifr) < 0)
@@ -1272,7 +1182,7 @@ int connman_inet_setup_tunnel(char *tunnel, int mtu)
        __u32 mask;
        __u32 flags;
 
-       if (tunnel == NULL)
+       if (!tunnel)
                return -EINVAL;
 
        sk = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
@@ -1286,7 +1196,7 @@ int connman_inet_setup_tunnel(char *tunnel, int mtu)
                goto done;
 
        memset(&ifr, 0, sizeof(ifr));
-       strncpy(ifr.ifr_name, tunnel, IFNAMSIZ);
+       strncpy(ifr.ifr_name, tunnel, sizeof(ifr.ifr_name) - 1);
        err = ioctl(sk, SIOCGIFFLAGS, &ifr);
        if (err)
                goto done;
@@ -1342,11 +1252,15 @@ int connman_inet_create_tunnel(char **iface)
        return fd;
 }
 
-struct rs_cb_data {
+/*
+ * This callback struct is used when sending router and neighbor
+ * solicitation and advertisement messages.
+ */
+struct xs_cb_data {
        GIOChannel *channel;
-       __connman_inet_rs_cb_t callback;
+       void *callback;
        struct sockaddr_in6 addr;
-       guint rs_timeout;
+       guint timeout;
        guint watch_id;
        void *user_data;
 };
@@ -1361,16 +1275,16 @@ static const struct in6_addr in6addr_all_nodes_mc = IN6ADDR_ALL_NODES_MC_INIT;
 static const struct in6_addr in6addr_all_routers_mc =
                                                IN6ADDR_ALL_ROUTERS_MC_INIT;
 
-static void rs_cleanup(struct rs_cb_data *data)
+static void xs_cleanup(struct xs_cb_data *data)
 {
-       if (data->channel != NULL) {
+       if (data->channel) {
                g_io_channel_shutdown(data->channel, TRUE, NULL);
                g_io_channel_unref(data->channel);
                data->channel = NULL;
        }
 
-       if (data->rs_timeout > 0)
-               g_source_remove(data->rs_timeout);
+       if (data->timeout > 0)
+               g_source_remove(data->timeout);
 
        if (data->watch_id > 0)
                g_source_remove(data->watch_id);
@@ -1380,18 +1294,20 @@ static void rs_cleanup(struct rs_cb_data *data)
 
 static gboolean rs_timeout_cb(gpointer user_data)
 {
-       struct rs_cb_data *data = user_data;
+       struct xs_cb_data *data = user_data;
 
        DBG("user data %p", user_data);
 
-       if (data == NULL)
+       if (!data)
                return FALSE;
 
-       if (data->callback != NULL)
-               data->callback(NULL, 0, data->user_data);
+       if (data->callback) {
+               __connman_inet_rs_cb_t cb = data->callback;
+               cb(NULL, 0, data->user_data);
+       }
 
-       data->rs_timeout = 0;
-       rs_cleanup(data);
+       data->timeout = 0;
+       xs_cleanup(data);
        return FALSE;
 }
 
@@ -1401,10 +1317,11 @@ static int icmpv6_recv(int fd, gpointer user_data)
        struct iovec iov;
        unsigned char chdr[CMSG_BUF_LEN];
        unsigned char buf[1540];
-       struct rs_cb_data *data = user_data;
+       struct xs_cb_data *data = user_data;
        struct nd_router_advert *hdr;
        struct sockaddr_in6 saddr;
        ssize_t len;
+       __connman_inet_rs_cb_t cb = data->callback;
 
        DBG("");
 
@@ -1413,6 +1330,7 @@ static int icmpv6_recv(int fd, gpointer user_data)
 
        mhdr.msg_name = (void *)&saddr;
        mhdr.msg_namelen = sizeof(struct sockaddr_in6);
+       mhdr.msg_flags = 0;
        mhdr.msg_iov = &iov;
        mhdr.msg_iovlen = 1;
        mhdr.msg_control = (void *)chdr;
@@ -1420,8 +1338,8 @@ static int icmpv6_recv(int fd, gpointer user_data)
 
        len = recvmsg(fd, &mhdr, 0);
        if (len < 0) {
-               data->callback(NULL, 0, data->user_data);
-               rs_cleanup(data);
+               cb(NULL, 0, data->user_data);
+               xs_cleanup(data);
                return -errno;
        }
 
@@ -1431,14 +1349,13 @@ static int icmpv6_recv(int fd, gpointer user_data)
        if (hdr->nd_ra_code != 0)
                return 0;
 
-       data->callback(hdr, len, data->user_data);
-       rs_cleanup(data);
+       cb(hdr, len, data->user_data);
+       xs_cleanup(data);
 
        return len;
 }
 
-static gboolean icmpv6_event(GIOChannel *chan, GIOCondition cond,
-                                                               gpointer data)
+static gboolean icmpv6_event(GIOChannel *chan, GIOCondition cond, gpointer data)
 {
        int fd, ret;
 
@@ -1456,7 +1373,8 @@ static gboolean icmpv6_event(GIOChannel *chan, GIOCondition cond,
 }
 
 /* Adapted from RFC 1071 "C" Implementation Example */
-static uint16_t csum(const void *phdr, const void *data, socklen_t datalen)
+static uint16_t csum(const void *phdr, const void *data, socklen_t datalen,
+               const void *extra_data, socklen_t extra_datalen)
 {
        register unsigned long sum = 0;
        socklen_t count;
@@ -1477,13 +1395,25 @@ static uint16_t csum(const void *phdr, const void *data, socklen_t datalen)
                count -= 2;
        }
 
+       if (extra_data) {
+               count = extra_datalen;
+               addr = (uint16_t *)extra_data;
+
+               while (count > 1) {
+                       sum += *(addr++);
+                       count -= 2;
+               }
+       }
+
        while (sum >> 16)
                sum = (sum & 0xffff) + (sum >> 16);
 
        return (uint16_t)~sum;
 }
 
-static int ndisc_send_unspec(int type, int oif, const struct in6_addr *dest)
+static int ndisc_send_unspec(int type, int oif, const struct in6_addr *dest,
+                       const struct in6_addr *source,
+                       unsigned char *buf, size_t len, uint16_t lifetime)
 {
        struct _phdr {
                struct in6_addr src;
@@ -1499,16 +1429,17 @@ static int ndisc_send_unspec(int type, int oif, const struct in6_addr *dest)
                        struct icmp6_hdr icmp;
                        struct nd_neighbor_solicit ns;
                        struct nd_router_solicit rs;
+                       struct nd_router_advert ra;
                } i;
        } frame;
 
        struct msghdr msgh;
        struct cmsghdr *cmsg;
        struct in6_pktinfo *pinfo;
-       struct sockaddr_in6 dst;
+       struct sockaddr_in6 dst, src;
        char cbuf[CMSG_SPACE(sizeof(*pinfo))];
-       struct iovec iov;
-       int fd, datalen, ret;
+       struct iovec iov[2];
+       int fd, datalen, ret, iovlen = 1;
 
        DBG("");
 
@@ -1519,35 +1450,60 @@ static int ndisc_send_unspec(int type, int oif, const struct in6_addr *dest)
        memset(&frame, 0, sizeof(frame));
        memset(&dst, 0, sizeof(dst));
 
-       datalen = sizeof(frame.i.rs); /* 8, csum() safe */
+       if (type == ND_ROUTER_SOLICIT)
+               datalen = sizeof(frame.i.rs); /* 8, csum() safe */
+       else if (type == ND_ROUTER_ADVERT) {
+               datalen = sizeof(frame.i.ra); /* 16, csum() safe */
+               frame.i.ra.nd_ra_router_lifetime = htons(lifetime);
+       } else if (type == ND_NEIGHBOR_SOLICIT) {
+               datalen = sizeof(frame.i.ns); /* 24, csum() safe */
+               memcpy(&frame.i.ns.nd_ns_target, buf, sizeof(struct in6_addr));
+       } else {
+               close(fd);
+               return -EINVAL;
+       }
+
        dst.sin6_addr = *dest;
 
+       if (source)
+               src.sin6_addr = *source;
+       else
+               src.sin6_addr = in6addr_any;
+
        /* Fill in the IPv6 header */
        frame.ip.ip6_vfc = 0x60;
-       frame.ip.ip6_plen = htons(datalen);
+       frame.ip.ip6_plen = htons(datalen + len);
        frame.ip.ip6_nxt = IPPROTO_ICMPV6;
        frame.ip.ip6_hlim = 255;
        frame.ip.ip6_dst = dst.sin6_addr;
+       frame.ip.ip6_src = src.sin6_addr;
        /* all other fields are already set to zero */
 
        /* Prepare pseudo header for csum */
        memset(&phdr, 0, sizeof(phdr));
        phdr.dst = dst.sin6_addr;
-       phdr.plen = htonl(datalen);
+       phdr.src = src.sin6_addr;
+       phdr.plen = htonl(datalen + len);
        phdr.nxt = IPPROTO_ICMPV6;
 
        /* Fill in remaining ICMP header fields */
        frame.i.icmp.icmp6_type = type;
-       frame.i.icmp.icmp6_cksum = csum(&phdr, &frame.i, datalen);
+       frame.i.icmp.icmp6_cksum = csum(&phdr, &frame.i, datalen, buf, len);
 
-       iov.iov_base = &frame;
-       iov.iov_len = sizeof(frame.ip) + datalen;
+       iov[0].iov_base = &frame;
+       iov[0].iov_len = sizeof(frame.ip) + datalen;
+
+       if (buf) {
+               iov[1].iov_base = buf;
+               iov[1].iov_len = len;
+               iovlen = 2;
+       }
 
        dst.sin6_family = AF_INET6;
        msgh.msg_name = &dst;
        msgh.msg_namelen = sizeof(dst);
-       msgh.msg_iov = &iov;
-       msgh.msg_iovlen = 1;
+       msgh.msg_iov = iov;
+       msgh.msg_iovlen = iovlen;
        msgh.msg_flags = 0;
 
        memset(cbuf, 0, CMSG_SPACE(sizeof(*pinfo)));
@@ -1597,39 +1553,49 @@ static int if_mc_group(int sock, int ifindex, const struct in6_addr *mc_addr,
 
        ret = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
                        &val, sizeof(int));
+       if (ret < 0) {
+               ret = -errno;
+               DBG("Cannot set IPV6_MULTICAST_LOOP %d/%s", ret,
+                       strerror(-ret));
+               return ret;
+       }
 
-       if (ret < 0)
+       ret = setsockopt(sock, IPPROTO_IPV6, cmd, &mreq, sizeof(mreq));
+       if (ret < 0) {
+               ret = -errno;
+               DBG("Cannot set option %d %d/%s", cmd, ret, strerror(-ret));
                return ret;
+       }
 
-       return setsockopt(sock, IPPROTO_IPV6, cmd, &mreq, sizeof(mreq));
+       return 0;
 }
 
 int __connman_inet_ipv6_send_rs(int index, int timeout,
                        __connman_inet_rs_cb_t callback, void *user_data)
 {
-       struct rs_cb_data *data;
+       struct xs_cb_data *data;
        struct icmp6_filter filter;
        struct in6_addr solicit;
        struct in6_addr dst = in6addr_all_routers_mc;
        int sk;
 
-       DBG("");
-
        if (timeout <= 0)
                return -EINVAL;
 
-       data = g_try_malloc0(sizeof(struct rs_cb_data));
-       if (data == NULL)
+       data = g_try_malloc0(sizeof(struct xs_cb_data));
+       if (!data)
                return -ENOMEM;
 
        data->callback = callback;
        data->user_data = user_data;
-       data->rs_timeout = g_timeout_add_seconds(timeout, rs_timeout_cb, data);
+       data->timeout = g_timeout_add_seconds(timeout, rs_timeout_cb, data);
 
        sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
        if (sk < 0)
                return -errno;
 
+       DBG("sock %d", sk);
+
        ICMP6_FILTER_SETBLOCKALL(&filter);
        ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
 
@@ -1650,11 +1616,399 @@ int __connman_inet_ipv6_send_rs(int index, int timeout,
                        G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
                        icmpv6_event, data);
 
-       ndisc_send_unspec(ND_ROUTER_SOLICIT, index, &dst);
+       ndisc_send_unspec(ND_ROUTER_SOLICIT, index, &dst, NULL, NULL, 0, 0);
+
+       return 0;
+}
+
+static inline void ipv6_addr_advert_mult(const struct in6_addr *addr,
+                                       struct in6_addr *advert)
+{
+       ipv6_addr_set(advert, htonl(0xFF020000), 0, htonl(0x2),
+                       htonl(0xFF000000) | addr->s6_addr32[3]);
+}
+
+#define MSG_SIZE_SEND 1452
+
+static int inc_len(int len, int inc)
+{
+       if (len > MSG_SIZE_SEND)
+               return -EINVAL;
+
+       len += inc;
+       return len;
+}
+
+int __connman_inet_ipv6_send_ra(int index, struct in6_addr *src_addr,
+                               GSList *prefixes, int router_lifetime)
+{
+       GSList *list;
+       struct in6_addr src, *source;
+       struct in6_addr dst = in6addr_all_nodes_mc;
+       GDHCPIAPrefix *prefix;
+       unsigned char buf[MSG_SIZE_SEND];
+       char addr_str[INET6_ADDRSTRLEN];
+       int sk, err = 0;
+       int len, count = 0;
+
+       if (!prefixes)
+               return -EINVAL;
+
+       sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
+       if (sk < 0)
+               return -errno;
+
+       if (!src_addr) {
+               __connman_inet_get_interface_ll_address(index, AF_INET6, &src);
+               source = &src;
+       } else
+               source = src_addr;
+
+       DBG("sock %d index %d prefixes %p src %s lifetime %d", sk, index,
+               prefixes, inet_ntop(AF_INET6, source, addr_str,
+                               INET6_ADDRSTRLEN),
+               router_lifetime);
+
+       memset(buf, 0, MSG_SIZE_SEND);
+       len = 0;
+
+       for (list = prefixes; list; list = list->next) {
+               struct nd_opt_prefix_info *pinfo;
+
+               prefix = list->data;
+               pinfo = (struct nd_opt_prefix_info *)(buf + len);
+
+               len = inc_len(len, sizeof(*pinfo));
+               if (len < 0) {
+                       err = len;
+                       goto out;
+               }
+
+               pinfo->nd_opt_pi_type = ND_OPT_PREFIX_INFORMATION;
+               pinfo->nd_opt_pi_len = 4;
+               pinfo->nd_opt_pi_prefix_len = prefix->prefixlen;
+               pinfo->nd_opt_pi_flags_reserved = ND_OPT_PI_FLAG_ONLINK;
+               pinfo->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_AUTO;
+               if (router_lifetime > 0) {
+                       pinfo->nd_opt_pi_valid_time = htonl(prefix->valid);
+                       pinfo->nd_opt_pi_preferred_time =
+                                               htonl(prefix->preferred);
+               }
+               pinfo->nd_opt_pi_reserved2 = 0;
+
+               memcpy(&pinfo->nd_opt_pi_prefix, &prefix->prefix,
+                                               sizeof(struct in6_addr));
+
+               DBG("[%d] index %d prefix %s/%d", count, index,
+                       inet_ntop(AF_INET6, &prefix->prefix, addr_str,
+                               INET6_ADDRSTRLEN), prefix->prefixlen);
+
+               count++;
+       }
+
+       if (count > 0) {
+               err = ndisc_send_unspec(ND_ROUTER_ADVERT, index, &dst, source,
+                                       buf, len, router_lifetime);
+               if (err < 0)
+                       DBG("cannot send RA %d/%s", err, strerror(-err));
+       }
+
+out:
+       close(sk);
+       return err;
+}
+
+void __connman_inet_ipv6_stop_recv_rs(void *context)
+{
+       if (!context)
+               return;
+
+       xs_cleanup(context);
+}
+
+static int icmpv6_rs_recv(int fd, gpointer user_data)
+{
+       struct msghdr mhdr;
+       struct iovec iov;
+       unsigned char chdr[CMSG_BUF_LEN];
+       unsigned char buf[1540];
+       struct xs_cb_data *data = user_data;
+       struct nd_router_solicit *hdr;
+       struct sockaddr_in6 saddr;
+       ssize_t len;
+       __connman_inet_recv_rs_cb_t cb = data->callback;
+
+       DBG("");
+
+       iov.iov_len = sizeof(buf);
+       iov.iov_base = buf;
+
+       mhdr.msg_name = (void *)&saddr;
+       mhdr.msg_namelen = sizeof(struct sockaddr_in6);
+       mhdr.msg_flags = 0;
+       mhdr.msg_iov = &iov;
+       mhdr.msg_iovlen = 1;
+       mhdr.msg_control = (void *)chdr;
+       mhdr.msg_controllen = CMSG_BUF_LEN;
+
+       len = recvmsg(fd, &mhdr, 0);
+       if (len < 0) {
+               cb(NULL, 0, data->user_data);
+               return -errno;
+       }
+
+       hdr = (struct nd_router_solicit *)buf;
+       DBG("code %d len %zd hdr %zd", hdr->nd_rs_code, len,
+                               sizeof(struct nd_router_solicit));
+       if (hdr->nd_rs_code != 0)
+               return 0;
+
+       cb(hdr, len, data->user_data);
+       return len;
+}
+
+static gboolean icmpv6_rs_event(GIOChannel *chan, GIOCondition cond,
+                                                               gpointer data)
+{
+       int fd, ret;
+
+       DBG("");
+
+       if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
+               return FALSE;
+
+       fd = g_io_channel_unix_get_fd(chan);
+       ret = icmpv6_rs_recv(fd, data);
+       if (ret == 0)
+               return TRUE;
+
+       return FALSE;
+}
+
+int __connman_inet_ipv6_start_recv_rs(int index,
+                                       __connman_inet_recv_rs_cb_t callback,
+                                       void *user_data,
+                                       void **context)
+{
+       struct xs_cb_data *data;
+       struct icmp6_filter filter;
+       char addr_str[INET6_ADDRSTRLEN];
+       int sk, err;
+
+       data = g_try_malloc0(sizeof(struct xs_cb_data));
+       if (!data)
+               return -ENOMEM;
+
+       data->callback = callback;
+       data->user_data = user_data;
+
+       sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
+       if (sk < 0) {
+               g_free(data);
+               return -errno;
+       }
+
+       DBG("sock %d", sk);
+
+       ICMP6_FILTER_SETBLOCKALL(&filter);
+       ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
+
+       setsockopt(sk, IPPROTO_ICMPV6, ICMP6_FILTER, &filter,
+                                               sizeof(struct icmp6_filter));
+
+       err = if_mc_group(sk, index, &in6addr_all_routers_mc, IPV6_JOIN_GROUP);
+       if (err < 0)
+               DBG("Cannot join mc %s %d/%s", inet_ntop(AF_INET6,
+                       &in6addr_all_routers_mc, addr_str, INET6_ADDRSTRLEN),
+                       err, strerror(-err));
+
+       data->channel = g_io_channel_unix_new(sk);
+       g_io_channel_set_close_on_unref(data->channel, TRUE);
+
+       g_io_channel_set_encoding(data->channel, NULL, NULL);
+       g_io_channel_set_buffered(data->channel, FALSE);
+
+       data->watch_id = g_io_add_watch(data->channel,
+                       G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
+                       icmpv6_rs_event, data);
+
+       *context = data;
 
        return 0;
 }
 
+static gboolean ns_timeout_cb(gpointer user_data)
+{
+       struct xs_cb_data *data = user_data;
+
+       DBG("user data %p", user_data);
+
+       if (!data)
+               return FALSE;
+
+       if (data->callback) {
+               __connman_inet_ns_cb_t cb = data->callback;
+               cb(NULL, 0, &data->addr.sin6_addr, data->user_data);
+       }
+
+       data->timeout = 0;
+       xs_cleanup(data);
+       return FALSE;
+}
+
+static int icmpv6_nd_recv(int fd, gpointer user_data)
+{
+       struct msghdr mhdr;
+       struct iovec iov;
+       unsigned char chdr[CMSG_BUF_LEN];
+       unsigned char buf[1540];
+       struct xs_cb_data *data = user_data;
+       struct nd_neighbor_advert *hdr;
+       struct sockaddr_in6 saddr;
+       ssize_t len;
+       __connman_inet_ns_cb_t cb = data->callback;
+
+       DBG("");
+
+       iov.iov_len = sizeof(buf);
+       iov.iov_base = buf;
+
+       mhdr.msg_name = (void *)&saddr;
+       mhdr.msg_namelen = sizeof(struct sockaddr_in6);
+       mhdr.msg_flags = 0;
+       mhdr.msg_iov = &iov;
+       mhdr.msg_iovlen = 1;
+       mhdr.msg_control = (void *)chdr;
+       mhdr.msg_controllen = CMSG_BUF_LEN;
+
+       len = recvmsg(fd, &mhdr, 0);
+       if (len < 0) {
+               cb(NULL, 0, &data->addr.sin6_addr, data->user_data);
+               xs_cleanup(data);
+               return -errno;
+       }
+
+       hdr = (struct nd_neighbor_advert *)buf;
+       DBG("code %d len %zd hdr %zd", hdr->nd_na_code, len,
+                               sizeof(struct nd_neighbor_advert));
+       if (hdr->nd_na_code != 0)
+               return 0;
+
+       /*
+        * We can receive any neighbor advertisement so we need to check if the
+        * packet was meant for us and ignore the packet otherwise.
+        */
+       if (memcmp(&data->addr.sin6_addr, &hdr->nd_na_target,
+                       sizeof(struct in6_addr)))
+               return 0;
+
+       cb(hdr, len, &data->addr.sin6_addr, data->user_data);
+       xs_cleanup(data);
+
+       return len;
+}
+
+static gboolean icmpv6_nd_event(GIOChannel *chan, GIOCondition cond,
+                                                               gpointer data)
+{
+       int fd, ret;
+
+       DBG("");
+
+       if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
+               return FALSE;
+
+       fd = g_io_channel_unix_get_fd(chan);
+       ret = icmpv6_nd_recv(fd, data);
+       if (ret == 0)
+               return TRUE;
+
+       return FALSE;
+}
+
+int __connman_inet_ipv6_do_dad(int index, int timeout_ms,
+                               struct in6_addr *addr,
+                               __connman_inet_ns_cb_t callback,
+                               void *user_data)
+{
+       struct xs_cb_data *data;
+       struct icmp6_filter filter;
+       struct in6_addr solicit;
+       int sk, err, val = 1;
+
+       if (timeout_ms <= 0)
+               return -EINVAL;
+
+       data = g_try_malloc0(sizeof(struct xs_cb_data));
+       if (!data)
+               return -ENOMEM;
+
+       data->callback = callback;
+       data->user_data = user_data;
+       data->timeout = g_timeout_add_full(G_PRIORITY_DEFAULT,
+                                       (guint)timeout_ms,
+                                       ns_timeout_cb,
+                                       data,
+                                        NULL);
+       memcpy(&data->addr.sin6_addr, addr, sizeof(struct in6_addr));
+
+       sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
+       if (sk < 0)
+               return -errno;
+
+       DBG("sock %d", sk);
+
+       ICMP6_FILTER_SETBLOCKALL(&filter);
+       ICMP6_FILTER_SETPASS(ND_NEIGHBOR_ADVERT, &filter);
+
+       setsockopt(sk, IPPROTO_ICMPV6, ICMP6_FILTER, &filter,
+                                               sizeof(struct icmp6_filter));
+
+        if (setsockopt(sk, IPPROTO_IPV6, IPV6_RECVPKTINFO,
+                                               &val, sizeof(val)) < 0) {
+               err = -errno;
+                DBG("Cannot set IPV6_RECVPKTINFO %d/%s", err,
+                                                       strerror(-err));
+               close(sk);
+               return err;
+        }
+
+        if (setsockopt(sk, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
+                                               &val, sizeof(val)) < 0) {
+               err = -errno;
+                DBG("Cannot set IPV6_RECVHOPLIMIT %d/%s", err,
+                                                       strerror(-err));
+               close(sk);
+               return err;
+        }
+
+       val = 0;
+       setsockopt(sk, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &val, sizeof(val));
+
+       ipv6_addr_solict_mult(addr, &solicit);
+       if_mc_group(sk, index, &in6addr_all_nodes_mc, IPV6_JOIN_GROUP);
+       if_mc_group(sk, index, &solicit, IPV6_JOIN_GROUP);
+
+       data->channel = g_io_channel_unix_new(sk);
+       g_io_channel_set_close_on_unref(data->channel, TRUE);
+
+       g_io_channel_set_encoding(data->channel, NULL, NULL);
+       g_io_channel_set_buffered(data->channel, FALSE);
+
+       data->watch_id = g_io_add_watch(data->channel,
+                       G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
+                       icmpv6_nd_event, data);
+
+       err = ndisc_send_unspec(ND_NEIGHBOR_SOLICIT, index, &solicit, NULL,
+                       (unsigned char *)addr, 0, 0);
+       if (err < 0) {
+               DBG("Cannot send NS %d/%s", err, strerror(-err));
+               xs_cleanup(data);
+       }
+
+       return err;
+}
+
 GSList *__connman_inet_ipv6_get_prefixes(struct nd_router_advert *hdr,
                                        unsigned int length)
 {
@@ -1686,7 +2040,7 @@ GSList *__connman_inet_ipv6_get_prefixes(struct nd_router_advert *hdr,
                        pinfo = (struct nd_opt_prefix_info *)pos;
                        prefix = inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix,
                                        prefix_str, INET6_ADDRSTRLEN);
-                       if (prefix == NULL)
+                       if (!prefix)
                                break;
 
                        str = g_strdup_printf("%s/%d", prefix,
@@ -1759,7 +2113,7 @@ static int get_dest_addr(int family, int index, char *buf, int len)
                return -errno;
        }
 
-       if (inet_ntop(family, addr, buf, len) == NULL) {
+       if (!inet_ntop(family, addr, buf, len)) {
                DBG("error %d/%s", errno, strerror(errno));
                return -errno;
        }
@@ -1854,7 +2208,7 @@ static void inet_rtnl_cleanup(struct inet_rtnl_cb_data *data)
 {
        struct __connman_inet_rtnl_handle *rth = data->rtnl;
 
-       if (data->channel != NULL) {
+       if (data->channel) {
                g_io_channel_shutdown(data->channel, TRUE, NULL);
                g_io_channel_unref(data->channel);
                data->channel = NULL;
@@ -1868,7 +2222,7 @@ static void inet_rtnl_cleanup(struct inet_rtnl_cb_data *data)
        if (data->watch_id > 0)
                g_source_remove(data->watch_id);
 
-       if (rth != NULL) {
+       if (rth) {
                __connman_inet_rtnl_close(rth);
                g_free(rth);
        }
@@ -1882,10 +2236,10 @@ static gboolean inet_rtnl_timeout_cb(gpointer user_data)
 
        DBG("user data %p", user_data);
 
-       if (data == NULL)
+       if (!data)
                return FALSE;
 
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(NULL, data->user_data);
 
        data->rtnl_timeout = 0;
@@ -2006,9 +2360,9 @@ int __connman_inet_rtnl_talk(struct __connman_inet_rtnl_handle *rtnl,
 
        n->nlmsg_seq = seq = ++rtnl->seq;
 
-       if (callback != NULL) {
+       if (callback) {
                data = g_try_malloc0(sizeof(struct inet_rtnl_cb_data));
-               if (data == NULL)
+               if (!data)
                        return -ENOMEM;
 
                data->callback = callback;
@@ -2031,9 +2385,10 @@ int __connman_inet_rtnl_talk(struct __connman_inet_rtnl_handle *rtnl,
 
        err = sendto(rtnl->fd, &rtnl->req.n, rtnl->req.n.nlmsg_len, 0,
                (struct sockaddr *) &nladdr, sizeof(nladdr));
-       DBG("handle %p len %d err %d", rtnl, rtnl->req.n.nlmsg_len, err);
+       DBG("handle %p len %d", rtnl, rtnl->req.n.nlmsg_len);
        if (err < 0) {
-               connman_error("Can not talk to rtnetlink");
+               connman_error("Can not talk to rtnetlink err %d %s",
+                       -errno, strerror(errno));
                return -errno;
        }
 
@@ -2105,7 +2460,7 @@ static void get_route_cb(struct nlmsghdr *answer, void *user_data)
 
        DBG("answer %p data %p", answer, user_data);
 
-       if (answer == NULL)
+       if (!answer)
                goto out;
 
        len = answer->nlmsg_len;
@@ -2126,10 +2481,10 @@ static void get_route_cb(struct nlmsghdr *answer, void *user_data)
 
        parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
 
-       if (tb[RTA_OIF] != NULL)
+       if (tb[RTA_OIF])
                index = *(int *)RTA_DATA(tb[RTA_OIF]);
 
-       if (tb[RTA_GATEWAY] != NULL)
+       if (tb[RTA_GATEWAY])
                addr = inet_ntop(r->rtm_family,
                                RTA_DATA(tb[RTA_GATEWAY]),
                                abuf, sizeof(abuf));
@@ -2137,7 +2492,7 @@ static void get_route_cb(struct nlmsghdr *answer, void *user_data)
        DBG("addr %s index %d user %p", addr, index, data->user_data);
 
 out:
-       if (data != NULL && data->callback != NULL)
+       if (data && data->callback)
                data->callback(addr, index, data->user_data);
 
        g_free(data);
@@ -2158,7 +2513,7 @@ int __connman_inet_get_route(const char *dest_address,
 
        DBG("dest %s", dest_address);
 
-       if (dest_address == NULL)
+       if (!dest_address)
                return -EINVAL;
 
        memset(&hints, 0, sizeof(hints));
@@ -2170,7 +2525,7 @@ int __connman_inet_get_route(const char *dest_address,
                return -EINVAL;
 
        rth = g_try_malloc0(sizeof(struct __connman_inet_rtnl_handle));
-       if (rth == NULL) {
+       if (!rth) {
                freeaddrinfo(rp);
                return -ENOMEM;
        }
@@ -2197,7 +2552,7 @@ int __connman_inet_get_route(const char *dest_address,
                goto fail;
 
        data = g_try_malloc(sizeof(struct get_route_cb_data));
-       if (data == NULL) {
+       if (!data) {
                err = -ENOMEM;
                goto done;
        }
@@ -2242,7 +2597,7 @@ int connman_inet_check_ipaddress(const char *host)
 }
 
 /* Check routine modified from ics-dhcp 4.2.3-P2 */
-connman_bool_t connman_inet_check_hostname(const char *ptr, size_t len)
+bool connman_inet_check_hostname(const char *ptr, size_t len)
 {
        const char *p;
 
@@ -2250,7 +2605,7 @@ connman_bool_t connman_inet_check_hostname(const char *ptr, size_t len)
         * Not empty or complete length not over 255 characters.
         */
        if ((len == 0) || (len > 256))
-               return FALSE;
+               return false;
 
        /*
         * Consists of [[:alnum:]-]+ labels separated by [.]
@@ -2263,7 +2618,7 @@ connman_bool_t connman_inet_check_hostname(const char *ptr, size_t len)
                         * Not allowed at begin or end of a label.
                         */
                        if (((p - ptr) == 0) || (len == 0) || (p[1] == '.'))
-                               return FALSE;
+                               return false;
 
                } else if (*p == '.') {
                        /*
@@ -2273,7 +2628,7 @@ connman_bool_t connman_inet_check_hostname(const char *ptr, size_t len)
                        size_t d = p - ptr;
 
                        if ((d <= 0) || (d >= 64))
-                               return FALSE;
+                               return false;
 
                        ptr = p + 1; /* Jump to the next label */
 
@@ -2281,11 +2636,11 @@ connman_bool_t connman_inet_check_hostname(const char *ptr, size_t len)
                        /*
                         * Also numbers at the begin are fine
                         */
-                       return FALSE;
+                       return false;
                }
        }
 
-       return TRUE;
+       return true;
 }
 
 char **__connman_inet_get_running_interfaces(void)
@@ -2310,7 +2665,7 @@ char **__connman_inet_get_running_interfaces(void)
         * calls.
         */
        ifr = g_try_malloc0(ifc.ifc_len * 2);
-       if (ifr == NULL)
+       if (!ifr)
                goto error;
 
        ifc.ifc_req = ifr;
@@ -2321,7 +2676,7 @@ char **__connman_inet_get_running_interfaces(void)
        numif = ifc.ifc_len / sizeof(struct ifreq);
 
        result = g_try_malloc0((numif + 1) * sizeof(char *));
-       if (result == NULL)
+       if (!result)
                goto error;
 
        close(sk);
@@ -2366,16 +2721,16 @@ error:
        return NULL;
 }
 
-connman_bool_t connman_inet_is_ipv6_supported()
+bool connman_inet_is_ipv6_supported()
 {
        int sk;
 
        sk = socket(PF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sk < 0)
-               return FALSE;
+               return false;
 
        close(sk);
-       return TRUE;
+       return true;
 }
 
 int __connman_inet_get_interface_address(int index, int family, void *address)
@@ -2384,7 +2739,7 @@ int __connman_inet_get_interface_address(int index, int family, void *address)
        int err = -ENOENT;
        char name[IF_NAMESIZE];
 
-       if (if_indextoname(index, name) == NULL)
+       if (!if_indextoname(index, name))
                return -EINVAL;
 
        DBG("index %d interface %s", index, name);
@@ -2395,8 +2750,8 @@ int __connman_inet_get_interface_address(int index, int family, void *address)
                return err;
        }
 
-       for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
-               if (ifa->ifa_addr == NULL)
+       for (ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
+               if (!ifa->ifa_addr)
                        continue;
 
                if (strncmp(ifa->ifa_name, name, IF_NAMESIZE) == 0 &&
@@ -2431,3 +2786,237 @@ out:
        freeifaddrs(ifaddr);
        return err;
 }
+
+static int iprule_modify(int cmd, int family, uint32_t table_id,
+                       uint32_t fwmark)
+{
+       struct __connman_inet_rtnl_handle rth;
+       int ret;
+
+       memset(&rth, 0, sizeof(rth));
+
+       rth.req.n.nlmsg_type = cmd;
+       rth.req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
+       rth.req.n.nlmsg_flags = NLM_F_REQUEST;
+       rth.req.u.r.rt.rtm_family = family;
+       rth.req.u.r.rt.rtm_protocol = RTPROT_BOOT;
+       rth.req.u.r.rt.rtm_scope = RT_SCOPE_UNIVERSE;
+       rth.req.u.r.rt.rtm_table = table_id;
+       rth.req.u.r.rt.rtm_type = RTN_UNSPEC;
+       rth.req.u.r.rt.rtm_flags = 0;
+
+       if (cmd == RTM_NEWRULE) {
+               rth.req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
+               rth.req.u.r.rt.rtm_type = RTN_UNICAST;
+       }
+
+       __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
+                                                       FRA_FWMARK, fwmark);
+
+       if (table_id < 256) {
+               rth.req.u.r.rt.rtm_table = table_id;
+       } else {
+               rth.req.u.r.rt.rtm_table = RT_TABLE_UNSPEC;
+               __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
+                                               FRA_TABLE, table_id);
+       }
+
+       if (rth.req.u.r.rt.rtm_family == AF_UNSPEC)
+               rth.req.u.r.rt.rtm_family = AF_INET;
+
+       ret = __connman_inet_rtnl_open(&rth);
+       if (ret < 0)
+               goto done;
+
+       ret = __connman_inet_rtnl_send(&rth, &rth.req.n);
+
+done:
+       __connman_inet_rtnl_close(&rth);
+
+       return ret;
+}
+
+int __connman_inet_add_fwmark_rule(uint32_t table_id, int family, uint32_t fwmark)
+{
+       /* ip rule add fwmark 9876 table 1234 */
+
+       return iprule_modify(RTM_NEWRULE, family, table_id, fwmark);
+}
+
+int __connman_inet_del_fwmark_rule(uint32_t table_id, int family, uint32_t fwmark)
+{
+       return iprule_modify(RTM_DELRULE, family, table_id, fwmark);
+}
+
+static int iproute_default_modify(int cmd, uint32_t table_id, int ifindex,
+                       const char *gateway)
+{
+       struct __connman_inet_rtnl_handle rth;
+       unsigned char buf[sizeof(struct in6_addr)];
+       int ret, len;
+       int family = connman_inet_check_ipaddress(gateway);
+
+       switch (family) {
+       case AF_INET:
+               len = 4;
+               break;
+       case AF_INET6:
+               len = 16;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ret = inet_pton(family, gateway, buf);
+       if (ret <= 0)
+               return -EINVAL;
+
+       memset(&rth, 0, sizeof(rth));
+
+       rth.req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
+       rth.req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL;
+       rth.req.n.nlmsg_type = cmd;
+       rth.req.u.r.rt.rtm_family = family;
+       rth.req.u.r.rt.rtm_table = RT_TABLE_MAIN;
+       rth.req.u.r.rt.rtm_scope = RT_SCOPE_NOWHERE;
+       rth.req.u.r.rt.rtm_protocol = RTPROT_BOOT;
+       rth.req.u.r.rt.rtm_scope = RT_SCOPE_UNIVERSE;
+       rth.req.u.r.rt.rtm_type = RTN_UNICAST;
+
+       __connman_inet_rtnl_addattr_l(&rth.req.n, sizeof(rth.req), RTA_GATEWAY,
+                                                               buf, len);
+       if (table_id < 256) {
+               rth.req.u.r.rt.rtm_table = table_id;
+       } else {
+               rth.req.u.r.rt.rtm_table = RT_TABLE_UNSPEC;
+               __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
+                                                       RTA_TABLE, table_id);
+       }
+
+       __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
+                                                       RTA_OIF, ifindex);
+
+       ret = __connman_inet_rtnl_open(&rth);
+       if (ret < 0)
+               goto done;
+
+       ret = __connman_inet_rtnl_send(&rth, &rth.req.n);
+
+done:
+       __connman_inet_rtnl_close(&rth);
+
+       return ret;
+}
+
+int __connman_inet_add_default_to_table(uint32_t table_id, int ifindex,
+                                               const char *gateway)
+{
+       /* ip route add default via 1.2.3.4 dev wlan0 table 1234 */
+
+       return iproute_default_modify(RTM_NEWROUTE, table_id, ifindex, gateway);
+}
+
+int __connman_inet_del_default_from_table(uint32_t table_id, int ifindex,
+                                               const char *gateway)
+{
+       /* ip route del default via 1.2.3.4 dev wlan0 table 1234 */
+
+       return iproute_default_modify(RTM_DELROUTE, table_id, ifindex, gateway);
+}
+
+int __connman_inet_get_interface_ll_address(int index, int family,
+                                                               void *address)
+{
+       struct ifaddrs *ifaddr, *ifa;
+       int err = -ENOENT;
+       char name[IF_NAMESIZE];
+
+       if (!if_indextoname(index, name))
+               return -EINVAL;
+
+       DBG("index %d interface %s", index, name);
+
+       if (getifaddrs(&ifaddr) < 0) {
+               err = -errno;
+               DBG("Cannot get addresses err %d/%s", err, strerror(-err));
+               return err;
+       }
+
+       for (ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
+               if (!ifa->ifa_addr)
+                       continue;
+
+               if (strncmp(ifa->ifa_name, name, IF_NAMESIZE) == 0 &&
+                                       ifa->ifa_addr->sa_family == family) {
+                       if (family == AF_INET) {
+                               struct sockaddr_in *in4 = (struct sockaddr_in *)
+                                       ifa->ifa_addr;
+                               if (in4->sin_addr.s_addr == INADDR_ANY)
+                                       continue;
+                               if ((in4->sin_addr.s_addr & IN_CLASSB_NET) !=
+                                               ((in_addr_t) 0xa9fe0000))
+                                       continue;
+                               memcpy(address, &in4->sin_addr,
+                                                       sizeof(struct in_addr));
+                       } else if (family == AF_INET6) {
+                               struct sockaddr_in6 *in6 =
+                                       (struct sockaddr_in6 *)ifa->ifa_addr;
+                               if (memcmp(&in6->sin6_addr, &in6addr_any,
+                                               sizeof(struct in6_addr)) == 0)
+                                       continue;
+                               if (!IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr))
+                                       continue;
+
+                               memcpy(address, &in6->sin6_addr,
+                                               sizeof(struct in6_addr));
+                       } else {
+                               err = -EINVAL;
+                               goto out;
+                       }
+
+                       err = 0;
+                       break;
+               }
+       }
+
+out:
+       freeifaddrs(ifaddr);
+       return err;
+}
+
+int __connman_inet_get_address_netmask(int ifindex,
+                                       struct sockaddr_in *address,
+                                       struct sockaddr_in *netmask)
+{
+       int sk, ret = -EINVAL;
+       struct ifreq ifr;
+
+       DBG("index %d", ifindex);
+
+       sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+       if (sk < 0)
+               return -EINVAL;
+
+       memset(&ifr, 0, sizeof(ifr));
+       ifr.ifr_ifindex = ifindex;
+
+       if (ioctl(sk, SIOCGIFNAME, &ifr) < 0)
+               goto out;
+
+       if (ioctl(sk, SIOCGIFNETMASK, &ifr) < 0)
+               goto out;
+
+       memcpy(netmask, (struct sockaddr_in *)&ifr.ifr_netmask,
+                                               sizeof(struct sockaddr_in));
+
+       if (ioctl(sk, SIOCGIFADDR, &ifr) < 0)
+               goto out;
+
+       memcpy(address, (struct sockaddr_in *)&ifr.ifr_addr,
+                                               sizeof(struct sockaddr_in));
+       ret = 0;
+
+out:
+       close(sk);
+       return ret;
+}
index f451f1c..72ba6f6 100644 (file)
@@ -3,7 +3,7 @@
  *  Connection Manager
  *
  *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
- *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2012-2013  BMW Car IT GmbH. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -95,7 +95,7 @@ static gboolean inotify_data(GIOChannel *channel, GIOCondition cond,
                next_event += len;
                bytes_read -= len;
 
-               for (list = inotify->list; list != NULL; list = list->next) {
+               for (list = inotify->list; list; list = list->next) {
                        inotify_event_cb callback = list->data;
 
                        (*callback)(event, ident);
@@ -125,7 +125,7 @@ static int create_watch(const char *path, struct connman_inotify *inotify)
        }
 
        inotify->channel = g_io_channel_unix_new(fd);
-       if (inotify->channel == NULL) {
+       if (!inotify->channel) {
                connman_error("Creation of inotify channel failed");
                inotify_rm_watch(fd, inotify->wd);
                inotify->wd = 0;
@@ -149,7 +149,7 @@ static void remove_watch(struct connman_inotify *inotify)
 {
        int fd;
 
-       if (inotify->channel == NULL)
+       if (!inotify->channel)
                return;
 
        if (inotify->watch > 0)
@@ -168,15 +168,15 @@ int connman_inotify_register(const char *path, inotify_event_cb callback)
        struct connman_inotify *inotify;
        int err;
 
-       if (callback == NULL)
+       if (!callback)
                return -EINVAL;
 
        inotify = g_hash_table_lookup(inotify_hash, path);
-       if (inotify != NULL)
+       if (inotify)
                goto update;
 
        inotify = g_try_new0(struct connman_inotify, 1);
-       if (inotify == NULL)
+       if (!inotify)
                return -ENOMEM;
 
        inotify->wd = -1;
@@ -210,11 +210,11 @@ void connman_inotify_unregister(const char *path, inotify_event_cb callback)
        struct connman_inotify *inotify;
 
        inotify = g_hash_table_lookup(inotify_hash, path);
-       if (inotify == NULL)
+       if (!inotify)
                return;
 
        inotify->list = g_slist_remove(inotify->list, callback);
-       if (inotify->list != NULL)
+       if (inotify->list)
                return;
 
        g_hash_table_remove(inotify_hash, path);
index f66bb67..57f9435 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -38,7 +38,7 @@ struct connman_ipaddress *connman_ipaddress_alloc(int family)
        struct connman_ipaddress *ipaddress;
 
        ipaddress = g_try_new0(struct connman_ipaddress, 1);
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return NULL;
 
        ipaddress->family = family;
@@ -53,7 +53,7 @@ struct connman_ipaddress *connman_ipaddress_alloc(int family)
 
 void connman_ipaddress_free(struct connman_ipaddress *ipaddress)
 {
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return;
 
        g_free(ipaddress->broadcast);
@@ -69,7 +69,7 @@ unsigned char __connman_ipaddress_netmask_prefix_len(const char *netmask)
        in_addr_t mask;
        in_addr_t host;
 
-       if (netmask == NULL)
+       if (!netmask)
                return 32;
 
        mask = inet_network(netmask);
@@ -86,19 +86,19 @@ unsigned char __connman_ipaddress_netmask_prefix_len(const char *netmask)
        return bits;
 }
 
-static gboolean check_ipv6_address(const char *address)
+static bool check_ipv6_address(const char *address)
 {
        unsigned char buf[sizeof(struct in6_addr)];
        int err;
 
-       if (address == NULL)
-               return FALSE;
+       if (!address)
+               return false;
 
        err = inet_pton(AF_INET6, address, buf);
        if (err > 0)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 int connman_ipaddress_set_ipv6(struct connman_ipaddress *ipaddress,
@@ -106,10 +106,10 @@ int connman_ipaddress_set_ipv6(struct connman_ipaddress *ipaddress,
                                unsigned char prefix_length,
                                const char *gateway)
 {
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return -EINVAL;
 
-       if (check_ipv6_address(address) == FALSE)
+       if (!check_ipv6_address(address))
                return -EINVAL;
 
        DBG("prefix_len %d address %s gateway %s",
@@ -131,7 +131,7 @@ int connman_ipaddress_set_ipv6(struct connman_ipaddress *ipaddress,
 int connman_ipaddress_set_ipv4(struct connman_ipaddress *ipaddress,
                const char *address, const char *netmask, const char *gateway)
 {
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return -EINVAL;
 
        ipaddress->family = AF_INET;
@@ -150,7 +150,7 @@ int connman_ipaddress_set_ipv4(struct connman_ipaddress *ipaddress,
 void connman_ipaddress_set_peer(struct connman_ipaddress *ipaddress,
                                const char *peer)
 {
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return;
 
        g_free(ipaddress->peer);
@@ -159,7 +159,7 @@ void connman_ipaddress_set_peer(struct connman_ipaddress *ipaddress,
 
 void connman_ipaddress_clear(struct connman_ipaddress *ipaddress)
 {
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return;
 
        ipaddress->prefixlen = 0;
@@ -185,7 +185,7 @@ void connman_ipaddress_clear(struct connman_ipaddress *ipaddress)
 void connman_ipaddress_copy_address(struct connman_ipaddress *ipaddress,
                                        struct connman_ipaddress *source)
 {
-       if (ipaddress == NULL || source == NULL)
+       if (!ipaddress || !source)
                return;
 
        ipaddress->family = source->family;
index 694cc61..b23df16 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -50,18 +50,18 @@ struct connman_ipconfig {
        const struct connman_ipconfig_ops *ops;
        void *ops_data;
 
-       connman_bool_t enabled;
+       bool enabled;
        enum connman_ipconfig_method method;
        struct connman_ipaddress *address;
        struct connman_ipaddress *system;
 
        int ipv6_privacy_config;
        char *last_dhcp_address;
+       char **last_dhcpv6_prefixes;
 };
 
 struct connman_ipdevice {
        int index;
-       char *ifname;
        unsigned short type;
        unsigned int flags;
        char *address;
@@ -84,17 +84,17 @@ struct connman_ipdevice {
        struct connman_ipconfig *config_ipv4;
        struct connman_ipconfig *config_ipv6;
 
-       gboolean ipv6_enabled;
+       bool ipv6_enabled;
        int ipv6_privacy;
 };
 
 static GHashTable *ipdevice_hash = NULL;
 static GList *ipconfig_list = NULL;
-static connman_bool_t is_ipv6_supported = FALSE;
+static bool is_ipv6_supported = false;
 
 void __connman_ipconfig_clear_address(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        connman_ipaddress_clear(ipconfig->address);
@@ -175,27 +175,27 @@ static const char *scope2str(unsigned char scope)
        return "";
 }
 
-static gboolean get_ipv6_state(gchar *ifname)
+static bool get_ipv6_state(gchar *ifname)
 {
        int disabled;
        gchar *path;
        FILE *f;
-       gboolean enabled = FALSE;
+       bool enabled = false;
 
-       if (ifname == NULL)
+       if (!ifname)
                path = g_strdup("/proc/sys/net/ipv6/conf/all/disable_ipv6");
        else
                path = g_strdup_printf(
                        "/proc/sys/net/ipv6/conf/%s/disable_ipv6", ifname);
 
-       if (path == NULL)
+       if (!path)
                return enabled;
 
        f = fopen(path, "r");
 
        g_free(path);
 
-       if (f != NULL) {
+       if (f) {
                if (fscanf(f, "%d", &disabled) > 0)
                        enabled = !disabled;
                fclose(f);
@@ -204,28 +204,28 @@ static gboolean get_ipv6_state(gchar *ifname)
        return enabled;
 }
 
-static void set_ipv6_state(gchar *ifname, gboolean enable)
+static void set_ipv6_state(gchar *ifname, bool enable)
 {
        gchar *path;
        FILE *f;
 
-       if (ifname == NULL)
+       if (!ifname)
                path = g_strdup("/proc/sys/net/ipv6/conf/all/disable_ipv6");
        else
                path = g_strdup_printf(
                        "/proc/sys/net/ipv6/conf/%s/disable_ipv6", ifname);
 
-       if (path == NULL)
+       if (!path)
                return;
 
        f = fopen(path, "r+");
 
        g_free(path);
 
-       if (f == NULL)
+       if (!f)
                return;
 
-       if (enable == FALSE)
+       if (!enable)
                fprintf(f, "1");
        else
                fprintf(f, "0");
@@ -239,20 +239,20 @@ static int get_ipv6_privacy(gchar *ifname)
        FILE *f;
        int value;
 
-       if (ifname == NULL)
+       if (!ifname)
                return 0;
 
        path = g_strdup_printf("/proc/sys/net/ipv6/conf/%s/use_tempaddr",
                                                                ifname);
 
-       if (path == NULL)
+       if (!path)
                return 0;
 
        f = fopen(path, "r");
 
        g_free(path);
 
-       if (f == NULL)
+       if (!f)
                return 0;
 
        if (fscanf(f, "%d", &value) <= 0)
@@ -271,13 +271,13 @@ static void set_ipv6_privacy(gchar *ifname, int value)
        gchar *path;
        FILE *f;
 
-       if (ifname == NULL)
+       if (!ifname)
                return;
 
        path = g_strdup_printf("/proc/sys/net/ipv6/conf/%s/use_tempaddr",
                                                                ifname);
 
-       if (path == NULL)
+       if (!path)
                return;
 
        if (value < 0)
@@ -287,21 +287,21 @@ static void set_ipv6_privacy(gchar *ifname, int value)
 
        g_free(path);
 
-       if (f == NULL)
+       if (!f)
                return;
 
        fprintf(f, "%d", value);
        fclose(f);
 }
 
-static int get_rp_filter()
+static int get_rp_filter(void)
 {
        FILE *f;
        int value = -EINVAL, tmp;
 
        f = fopen("/proc/sys/net/ipv4/conf/all/rp_filter", "r");
 
-       if (f != NULL) {
+       if (f) {
                if (fscanf(f, "%d", &tmp) == 1)
                        value = tmp;
                fclose(f);
@@ -316,7 +316,7 @@ static void set_rp_filter(int value)
 
        f = fopen("/proc/sys/net/ipv4/conf/all/rp_filter", "r+");
 
-       if (f == NULL)
+       if (!f)
                return;
 
        fprintf(f, "%d", value);
@@ -348,27 +348,48 @@ void __connman_ipconfig_unset_rp_filter(int old_value)
        connman_info("rp_filter restored to %d", old_value);
 }
 
-gboolean __connman_ipconfig_ipv6_privacy_enabled(struct connman_ipconfig *ipconfig)
+bool __connman_ipconfig_ipv6_privacy_enabled(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
-               return FALSE;
+       if (!ipconfig)
+               return false;
 
        return ipconfig->ipv6_privacy_config == 0 ? FALSE : TRUE;
 }
 
+bool __connman_ipconfig_ipv6_is_enabled(struct connman_ipconfig *ipconfig)
+{
+       struct connman_ipdevice *ipdevice;
+       char *ifname;
+       bool ret;
+
+       if (!ipconfig)
+               return false;
+
+       ipdevice = g_hash_table_lookup(ipdevice_hash,
+                                       GINT_TO_POINTER(ipconfig->index));
+       if (!ipdevice)
+               return false;
+
+       ifname = connman_inet_ifname(ipconfig->index);
+       ret = get_ipv6_state(ifname);
+       g_free(ifname);
+
+       return ret;
+}
+
 static void free_ipdevice(gpointer data)
 {
        struct connman_ipdevice *ipdevice = data;
+       char *ifname = connman_inet_ifname(ipdevice->index);
 
-       connman_info("%s {remove} index %d", ipdevice->ifname,
-                                                       ipdevice->index);
+       connman_info("%s {remove} index %d", ifname, ipdevice->index);
 
-       if (ipdevice->config_ipv4 != NULL) {
+       if (ipdevice->config_ipv4) {
                __connman_ipconfig_unref(ipdevice->config_ipv4);
                ipdevice->config_ipv4 = NULL;
        }
 
-       if (ipdevice->config_ipv6 != NULL) {
+       if (ipdevice->config_ipv6) {
                __connman_ipconfig_unref(ipdevice->config_ipv6);
                ipdevice->config_ipv6 = NULL;
        }
@@ -380,10 +401,10 @@ static void free_ipdevice(gpointer data)
 
        g_free(ipdevice->address);
 
-       set_ipv6_state(ipdevice->ifname, ipdevice->ipv6_enabled);
-       set_ipv6_privacy(ipdevice->ifname, ipdevice->ipv6_privacy);
+       set_ipv6_state(ifname, ipdevice->ipv6_enabled);
+       set_ipv6_privacy(ifname, ipdevice->ipv6_privacy);
 
-       g_free(ipdevice->ifname);
+       g_free(ifname);
        g_free(ipdevice);
 }
 
@@ -409,19 +430,19 @@ static void __connman_ipconfig_lower_down(struct connman_ipdevice *ipdevice)
 }
 
 static void update_stats(struct connman_ipdevice *ipdevice,
-                                               struct rtnl_link_stats *stats)
+                       const char *ifname, struct rtnl_link_stats *stats)
 {
        struct connman_service *service;
 
        if (stats->rx_packets == 0 && stats->tx_packets == 0)
                return;
 
-       connman_info("%s {RX} %u packets %u bytes", ipdevice->ifname,
+       connman_info("%s {RX} %u packets %u bytes", ifname,
                                        stats->rx_packets, stats->rx_bytes);
-       connman_info("%s {TX} %u packets %u bytes", ipdevice->ifname,
+       connman_info("%s {TX} %u packets %u bytes", ifname,
                                        stats->tx_packets, stats->tx_bytes);
 
-       if (ipdevice->config_ipv4 == NULL && ipdevice->config_ipv6 == NULL)
+       if (!ipdevice->config_ipv4 && !ipdevice->config_ipv6)
                return;
 
        if (ipdevice->config_ipv4)
@@ -431,7 +452,7 @@ static void update_stats(struct connman_ipdevice *ipdevice,
        else
                return;
 
-       if (service == NULL)
+       if (!service)
                return;
 
        ipdevice->rx_packets = stats->rx_packets;
@@ -456,78 +477,69 @@ void __connman_ipconfig_newlink(int index, unsigned short type,
                                                struct rtnl_link_stats *stats)
 {
        struct connman_ipdevice *ipdevice;
-       GList *list;
+       GList *list, *ipconfig_copy;
        GString *str;
-       gboolean up = FALSE, down = FALSE;
-       gboolean lower_up = FALSE, lower_down = FALSE;
+       bool up = false, down = false;
+       bool lower_up = false, lower_down = false;
+       char *ifname;
 
        DBG("index %d", index);
 
        if (type == ARPHRD_LOOPBACK)
                return;
 
-       ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice != NULL) {
-               char *ifname = connman_inet_ifname(index);
-               if (g_strcmp0(ipdevice->ifname, ifname) != 0) {
-                       DBG("interface name changed %s -> %s",
-                               ipdevice->ifname, ifname);
-
-                       g_free(ipdevice->ifname);
-                       ipdevice->ifname = ifname;
-               } else
-                       g_free(ifname);
+       ifname = connman_inet_ifname(index);
 
+       ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
+       if (ipdevice)
                goto update;
-       }
 
        ipdevice = g_try_new0(struct connman_ipdevice, 1);
-       if (ipdevice == NULL)
-               return;
+       if (!ipdevice)
+               goto out;
 
        ipdevice->index = index;
-       ipdevice->ifname = connman_inet_ifname(index);
        ipdevice->type = type;
 
-       ipdevice->ipv6_enabled = get_ipv6_state(ipdevice->ifname);
-       ipdevice->ipv6_privacy = get_ipv6_privacy(ipdevice->ifname);
+       ipdevice->ipv6_enabled = get_ipv6_state(ifname);
+       ipdevice->ipv6_privacy = get_ipv6_privacy(ifname);
 
        ipdevice->address = g_strdup(address);
 
        g_hash_table_insert(ipdevice_hash, GINT_TO_POINTER(index), ipdevice);
 
-       connman_info("%s {create} index %d type %d <%s>", ipdevice->ifname,
+       connman_info("%s {create} index %d type %d <%s>", ifname,
                                                index, type, type2str(type));
 
 update:
        ipdevice->mtu = mtu;
 
-       update_stats(ipdevice, stats);
+       update_stats(ipdevice, ifname, stats);
 
        if (flags == ipdevice->flags)
-               return;
+               goto out;
 
        if ((ipdevice->flags & IFF_UP) != (flags & IFF_UP)) {
                if (flags & IFF_UP)
-                       up = TRUE;
+                       up = true;
                else
-                       down = TRUE;
+                       down = true;
        }
 
        if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) !=
                                (flags & (IFF_RUNNING | IFF_LOWER_UP))) {
                if ((flags & (IFF_RUNNING | IFF_LOWER_UP)) ==
                                        (IFF_RUNNING | IFF_LOWER_UP))
-                       lower_up = TRUE;
+                       lower_up = true;
                else if ((flags & (IFF_RUNNING | IFF_LOWER_UP)) == 0)
-                       lower_down = TRUE;
+                       lower_down = true;
        }
 
        ipdevice->flags = flags;
 
        str = g_string_new(NULL);
-       if (str == NULL)
-               return;
+       if (!str)
+               goto out;
 
        if (flags & IFF_UP)
                g_string_append(str, "UP");
@@ -540,50 +552,59 @@ update:
        if (flags & IFF_LOWER_UP)
                g_string_append(str, ",LOWER_UP");
 
-       connman_info("%s {update} flags %u <%s>", ipdevice->ifname,
-                                                       flags, str->str);
+       connman_info("%s {update} flags %u <%s>", ifname, flags, str->str);
 
        g_string_free(str, TRUE);
 
-       for (list = g_list_first(ipconfig_list); list;
+       ipconfig_copy = g_list_copy(ipconfig_list);
+
+       for (list = g_list_first(ipconfig_copy); list;
                                                list = g_list_next(list)) {
                struct connman_ipconfig *ipconfig = list->data;
 
                if (index != ipconfig->index)
                        continue;
 
-               if (ipconfig->ops == NULL)
+               if (!ipconfig->ops)
                        continue;
 
-               if (up == TRUE && ipconfig->ops->up)
-                       ipconfig->ops->up(ipconfig);
-               if (lower_up == TRUE && ipconfig->ops->lower_up)
-                       ipconfig->ops->lower_up(ipconfig);
+               if (up && ipconfig->ops->up)
+                       ipconfig->ops->up(ipconfig, ifname);
+               if (lower_up && ipconfig->ops->lower_up)
+                       ipconfig->ops->lower_up(ipconfig, ifname);
 
-               if (lower_down == TRUE && ipconfig->ops->lower_down)
-                       ipconfig->ops->lower_down(ipconfig);
-               if (down == TRUE && ipconfig->ops->down)
-                       ipconfig->ops->down(ipconfig);
+               if (lower_down && ipconfig->ops->lower_down)
+                       ipconfig->ops->lower_down(ipconfig, ifname);
+               if (down && ipconfig->ops->down)
+                       ipconfig->ops->down(ipconfig, ifname);
        }
 
+       g_list_free(ipconfig_copy);
+
        if (lower_up)
                __connman_ipconfig_lower_up(ipdevice);
        if (lower_down)
                __connman_ipconfig_lower_down(ipdevice);
+
+out:
+       g_free(ifname);
 }
 
 void __connman_ipconfig_dellink(int index, struct rtnl_link_stats *stats)
 {
        struct connman_ipdevice *ipdevice;
        GList *list;
+       char *ifname;
 
        DBG("index %d", index);
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
-       update_stats(ipdevice, stats);
+       ifname = connman_inet_ifname(index);
+
+       update_stats(ipdevice, ifname, stats);
 
        for (list = g_list_first(ipconfig_list); list;
                                                list = g_list_next(list)) {
@@ -594,15 +615,17 @@ void __connman_ipconfig_dellink(int index, struct rtnl_link_stats *stats)
 
                ipconfig->index = -1;
 
-               if (ipconfig->ops == NULL)
+               if (!ipconfig->ops)
                        continue;
 
                if (ipconfig->ops->lower_down)
-                       ipconfig->ops->lower_down(ipconfig);
+                       ipconfig->ops->lower_down(ipconfig, ifname);
                if (ipconfig->ops->down)
-                       ipconfig->ops->down(ipconfig);
+                       ipconfig->ops->down(ipconfig, ifname);
        }
 
+       g_free(ifname);
+
        __connman_ipconfig_lower_down(ipdevice);
 
        g_hash_table_remove(ipdevice_hash, GINT_TO_POINTER(index));
@@ -626,15 +649,16 @@ void __connman_ipconfig_newaddr(int index, int family, const char *label,
        struct connman_ipaddress *ipaddress;
        enum connman_ipconfig_type type;
        GList *list;
+       char *ifname;
 
        DBG("index %d", index);
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
        ipaddress = connman_ipaddress_alloc(family);
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return;
 
        ipaddress->prefixlen = prefixlen;
@@ -656,21 +680,22 @@ void __connman_ipconfig_newaddr(int index, int family, const char *label,
        ipdevice->address_list = g_slist_prepend(ipdevice->address_list,
                                                                ipaddress);
 
+       ifname = connman_inet_ifname(index);
        connman_info("%s {add} address %s/%u label %s family %d",
-               ipdevice->ifname, address, prefixlen, label, family);
+               ifname, address, prefixlen, label, family);
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                __connman_ippool_newaddr(index, address, prefixlen);
 
-       if (ipdevice->config_ipv4 != NULL && family == AF_INET)
+       if (ipdevice->config_ipv4 && family == AF_INET)
                connman_ipaddress_copy_address(ipdevice->config_ipv4->system,
                                        ipaddress);
 
-       else if (ipdevice->config_ipv6 != NULL && family == AF_INET6)
+       else if (ipdevice->config_ipv6 && family == AF_INET6)
                connman_ipaddress_copy_address(ipdevice->config_ipv6->system,
                                        ipaddress);
        else
-               return;
+               goto out;
 
        if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) != (IFF_RUNNING | IFF_LOWER_UP))
                return;
@@ -685,12 +710,15 @@ void __connman_ipconfig_newaddr(int index, int family, const char *label,
                if (type != ipconfig->type)
                        continue;
 
-               if (ipconfig->ops == NULL)
+               if (!ipconfig->ops)
                        continue;
 
                if (ipconfig->ops->ip_bound)
-                       ipconfig->ops->ip_bound(ipconfig);
+                       ipconfig->ops->ip_bound(ipconfig, ifname);
        }
+
+out:
+       g_free(ifname);
 }
 
 void __connman_ipconfig_deladdr(int index, int family, const char *label,
@@ -700,15 +728,16 @@ void __connman_ipconfig_deladdr(int index, int family, const char *label,
        struct connman_ipaddress *ipaddress;
        enum connman_ipconfig_type type;
        GList *list;
+       char *ifname;
 
        DBG("index %d", index);
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
        ipaddress = find_ipaddress(ipdevice, prefixlen, address);
-       if (ipaddress == NULL)
+       if (!ipaddress)
                return;
 
        if (family == AF_INET)
@@ -727,14 +756,15 @@ void __connman_ipconfig_deladdr(int index, int family, const char *label,
        connman_ipaddress_clear(ipaddress);
        g_free(ipaddress);
 
-       connman_info("%s {del} address %s/%u label %s", ipdevice->ifname,
+       ifname = connman_inet_ifname(index);
+       connman_info("%s {del} address %s/%u label %s", ifname,
                                                address, prefixlen, label);
 
        if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) != (IFF_RUNNING | IFF_LOWER_UP))
-               return;
+               goto out;
 
        if (g_slist_length(ipdevice->address_list) > 0)
-               return;
+               goto out;
 
        for (list = g_list_first(ipconfig_list); list;
                                                list = g_list_next(list)) {
@@ -746,25 +776,31 @@ void __connman_ipconfig_deladdr(int index, int family, const char *label,
                if (type != ipconfig->type)
                        continue;
 
-               if (ipconfig->ops == NULL)
+               if (!ipconfig->ops)
                        continue;
 
                if (ipconfig->ops->ip_release)
-                       ipconfig->ops->ip_release(ipconfig);
+                       ipconfig->ops->ip_release(ipconfig, ifname);
        }
+
+out:
+       g_free(ifname);
 }
 
 void __connman_ipconfig_newroute(int index, int family, unsigned char scope,
                                        const char *dst, const char *gateway)
 {
        struct connman_ipdevice *ipdevice;
+       char *ifname;
 
        DBG("index %d", index);
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
+       ifname = connman_inet_ifname(index);
+
        if (scope == 0 && (g_strcmp0(dst, "0.0.0.0") == 0 ||
                                                g_strcmp0(dst, "::") == 0)) {
                GList *config_list;
@@ -775,8 +811,8 @@ void __connman_ipconfig_newroute(int index, int family, unsigned char scope,
                        g_free(ipdevice->ipv6_gateway);
                        ipdevice->ipv6_gateway = g_strdup(gateway);
 
-                       if (ipdevice->config_ipv6 != NULL &&
-                               ipdevice->config_ipv6->system != NULL) {
+                       if (ipdevice->config_ipv6 &&
+                               ipdevice->config_ipv6->system) {
                                g_free(ipdevice->config_ipv6->system->gateway);
                                ipdevice->config_ipv6->system->gateway =
                                        g_strdup(gateway);
@@ -786,14 +822,14 @@ void __connman_ipconfig_newroute(int index, int family, unsigned char scope,
                        g_free(ipdevice->ipv4_gateway);
                        ipdevice->ipv4_gateway = g_strdup(gateway);
 
-                       if (ipdevice->config_ipv4 != NULL &&
-                               ipdevice->config_ipv4->system != NULL) {
+                       if (ipdevice->config_ipv4 &&
+                               ipdevice->config_ipv4->system) {
                                g_free(ipdevice->config_ipv4->system->gateway);
                                ipdevice->config_ipv4->system->gateway =
                                        g_strdup(gateway);
                        }
                } else
-                       return;
+                       goto out;
 
                for (config_list = g_list_first(ipconfig_list); config_list;
                                        config_list = g_list_next(config_list)) {
@@ -805,30 +841,35 @@ void __connman_ipconfig_newroute(int index, int family, unsigned char scope,
                        if (type != ipconfig->type)
                                continue;
 
-                       if (ipconfig->ops == NULL)
+                       if (!ipconfig->ops)
                                continue;
 
                        if (ipconfig->ops->route_set)
-                               ipconfig->ops->route_set(ipconfig);
+                               ipconfig->ops->route_set(ipconfig, ifname);
                }
        }
 
        connman_info("%s {add} route %s gw %s scope %u <%s>",
-                                       ipdevice->ifname, dst, gateway,
-                                               scope, scope2str(scope));
+               ifname, dst, gateway, scope, scope2str(scope));
+
+out:
+       g_free(ifname);
 }
 
 void __connman_ipconfig_delroute(int index, int family, unsigned char scope,
                                        const char *dst, const char *gateway)
 {
        struct connman_ipdevice *ipdevice;
+       char *ifname;
 
        DBG("index %d", index);
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
+       ifname = connman_inet_ifname(index);
+
        if (scope == 0 && (g_strcmp0(dst, "0.0.0.0") == 0 ||
                                                g_strcmp0(dst, "::") == 0)) {
                GList *config_list;
@@ -839,8 +880,8 @@ void __connman_ipconfig_delroute(int index, int family, unsigned char scope,
                        g_free(ipdevice->ipv6_gateway);
                        ipdevice->ipv6_gateway = NULL;
 
-                       if (ipdevice->config_ipv6 != NULL &&
-                               ipdevice->config_ipv6->system != NULL) {
+                       if (ipdevice->config_ipv6 &&
+                               ipdevice->config_ipv6->system) {
                                g_free(ipdevice->config_ipv6->system->gateway);
                                ipdevice->config_ipv6->system->gateway = NULL;
                        }
@@ -849,13 +890,13 @@ void __connman_ipconfig_delroute(int index, int family, unsigned char scope,
                        g_free(ipdevice->ipv4_gateway);
                        ipdevice->ipv4_gateway = NULL;
 
-                       if (ipdevice->config_ipv4 != NULL &&
-                               ipdevice->config_ipv4->system != NULL) {
+                       if (ipdevice->config_ipv4 &&
+                               ipdevice->config_ipv4->system) {
                                g_free(ipdevice->config_ipv4->system->gateway);
                                ipdevice->config_ipv4->system->gateway = NULL;
                        }
                } else
-                       return;
+                       goto out;
 
                for (config_list = g_list_first(ipconfig_list); config_list;
                                        config_list = g_list_next(config_list)) {
@@ -867,17 +908,19 @@ void __connman_ipconfig_delroute(int index, int family, unsigned char scope,
                        if (type != ipconfig->type)
                                continue;
 
-                       if (ipconfig->ops == NULL)
+                       if (!ipconfig->ops)
                                continue;
 
                        if (ipconfig->ops->route_unset)
-                               ipconfig->ops->route_unset(ipconfig);
+                               ipconfig->ops->route_unset(ipconfig, ifname);
                }
        }
 
        connman_info("%s {del} route %s gw %s scope %u <%s>",
-                                       ipdevice->ifname, dst, gateway,
-                                               scope, scope2str(scope));
+               ifname, dst, gateway, scope, scope2str(scope));
+
+out:
+       g_free(ifname);
 }
 
 void __connman_ipconfig_foreach(void (*function) (int index, void *user_data),
@@ -886,7 +929,7 @@ void __connman_ipconfig_foreach(void (*function) (int index, void *user_data),
        GList *list, *keys;
 
        keys = g_hash_table_get_keys(ipdevice_hash);
-       if (keys == NULL)
+       if (!keys)
                return;
 
        for (list = g_list_first(keys); list; list = g_list_next(list)) {
@@ -909,7 +952,7 @@ unsigned short __connman_ipconfig_get_type_from_index(int index)
        struct connman_ipdevice *ipdevice;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return ARPHRD_VOID;
 
        return ipdevice->type;
@@ -920,7 +963,7 @@ unsigned int __connman_ipconfig_get_flags_from_index(int index)
        struct connman_ipdevice *ipdevice;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return 0;
 
        return ipdevice->flags;
@@ -932,24 +975,24 @@ const char *__connman_ipconfig_get_gateway_from_index(int index,
        struct connman_ipdevice *ipdevice;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return NULL;
 
        if (type != CONNMAN_IPCONFIG_TYPE_IPV6) {
-               if (ipdevice->ipv4_gateway != NULL)
+               if (ipdevice->ipv4_gateway)
                        return ipdevice->ipv4_gateway;
 
-               if (ipdevice->config_ipv4 != NULL &&
-                               ipdevice->config_ipv4->address != NULL)
+               if (ipdevice->config_ipv4 &&
+                               ipdevice->config_ipv4->address)
                        return ipdevice->config_ipv4->address->gateway;
        }
 
        if (type != CONNMAN_IPCONFIG_TYPE_IPV4) {
-               if (ipdevice->ipv6_gateway != NULL)
+               if (ipdevice->ipv6_gateway)
                        return ipdevice->ipv6_gateway;
 
-               if (ipdevice->config_ipv6 != NULL &&
-                               ipdevice->config_ipv6->address != NULL)
+               if (ipdevice->config_ipv6 &&
+                               ipdevice->config_ipv6->address)
                        return ipdevice->config_ipv6->address->gateway;
        }
 
@@ -963,15 +1006,16 @@ void __connman_ipconfig_set_index(struct connman_ipconfig *ipconfig, int index)
 
 const char *__connman_ipconfig_get_local(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->local;
 }
 
-void __connman_ipconfig_set_local(struct connman_ipconfig *ipconfig, const char *address)
+void __connman_ipconfig_set_local(struct connman_ipconfig *ipconfig,
+                                       const char *address)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        g_free(ipconfig->address->local);
@@ -980,15 +1024,16 @@ void __connman_ipconfig_set_local(struct connman_ipconfig *ipconfig, const char
 
 const char *__connman_ipconfig_get_peer(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->peer;
 }
 
-void __connman_ipconfig_set_peer(struct connman_ipconfig *ipconfig, const char *address)
+void __connman_ipconfig_set_peer(struct connman_ipconfig *ipconfig,
+                                       const char *address)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        g_free(ipconfig->address->peer);
@@ -997,15 +1042,16 @@ void __connman_ipconfig_set_peer(struct connman_ipconfig *ipconfig, const char *
 
 const char *__connman_ipconfig_get_broadcast(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->broadcast;
 }
 
-void __connman_ipconfig_set_broadcast(struct connman_ipconfig *ipconfig, const char *broadcast)
+void __connman_ipconfig_set_broadcast(struct connman_ipconfig *ipconfig,
+                                       const char *broadcast)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        g_free(ipconfig->address->broadcast);
@@ -1014,17 +1060,18 @@ void __connman_ipconfig_set_broadcast(struct connman_ipconfig *ipconfig, const c
 
 const char *__connman_ipconfig_get_gateway(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->gateway;
 }
 
-void __connman_ipconfig_set_gateway(struct connman_ipconfig *ipconfig, const char *gateway)
+void __connman_ipconfig_set_gateway(struct connman_ipconfig *ipconfig,
+                                       const char *gateway)
 {
        DBG("");
 
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
        g_free(ipconfig->address->gateway);
        ipconfig->address->gateway = g_strdup(gateway);
@@ -1036,11 +1083,11 @@ int __connman_ipconfig_gateway_add(struct connman_ipconfig *ipconfig)
 
        DBG("");
 
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return -EINVAL;
 
        service = __connman_service_lookup_from_index(ipconfig->index);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        __connman_connection_gateway_remove(service, ipconfig->type);
@@ -1065,21 +1112,22 @@ void __connman_ipconfig_gateway_remove(struct connman_ipconfig *ipconfig)
        DBG("");
 
        service = __connman_service_lookup_from_index(ipconfig->index);
-       if (service != NULL)
+       if (service)
                __connman_connection_gateway_remove(service, ipconfig->type);
 }
 
 unsigned char __connman_ipconfig_get_prefixlen(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return 0;
 
        return ipconfig->address->prefixlen;
 }
 
-void __connman_ipconfig_set_prefixlen(struct connman_ipconfig *ipconfig, unsigned char prefixlen)
+void __connman_ipconfig_set_prefixlen(struct connman_ipconfig *ipconfig,
+                                       unsigned char prefixlen)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        ipconfig->address->prefixlen = prefixlen;
@@ -1093,26 +1141,26 @@ static struct connman_ipconfig *create_ipv6config(int index)
        DBG("index %d", index);
 
        ipv6config = g_try_new0(struct connman_ipconfig, 1);
-       if (ipv6config == NULL)
+       if (!ipv6config)
                return NULL;
 
        ipv6config->refcount = 1;
 
        ipv6config->index = index;
-       ipv6config->enabled = FALSE;
+       ipv6config->enabled = false;
        ipv6config->type = CONNMAN_IPCONFIG_TYPE_IPV6;
 
-       if (is_ipv6_supported == FALSE)
+       if (!is_ipv6_supported)
                ipv6config->method = CONNMAN_IPCONFIG_METHOD_OFF;
        else
                ipv6config->method = CONNMAN_IPCONFIG_METHOD_AUTO;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice != NULL)
+       if (ipdevice)
                ipv6config->ipv6_privacy_config = ipdevice->ipv6_privacy;
 
        ipv6config->address = connman_ipaddress_alloc(AF_INET6);
-       if (ipv6config->address == NULL) {
+       if (!ipv6config->address) {
                g_free(ipv6config);
                return NULL;
        }
@@ -1143,17 +1191,17 @@ struct connman_ipconfig *__connman_ipconfig_create(int index,
        DBG("index %d", index);
 
        ipconfig = g_try_new0(struct connman_ipconfig, 1);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return NULL;
 
        ipconfig->refcount = 1;
 
        ipconfig->index = index;
-       ipconfig->enabled = FALSE;
+       ipconfig->enabled = false;
        ipconfig->type = CONNMAN_IPCONFIG_TYPE_IPV4;
 
        ipconfig->address = connman_ipaddress_alloc(AF_INET);
-       if (ipconfig->address == NULL) {
+       if (!ipconfig->address) {
                g_free(ipconfig);
                return NULL;
        }
@@ -1193,7 +1241,7 @@ __connman_ipconfig_ref_debug(struct connman_ipconfig *ipconfig,
 void __connman_ipconfig_unref_debug(struct connman_ipconfig *ipconfig,
                                const char *file, int line, const char *caller)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        DBG("%p ref %d by %s:%d:%s()", ipconfig, ipconfig->refcount - 1,
@@ -1207,7 +1255,7 @@ void __connman_ipconfig_unref_debug(struct connman_ipconfig *ipconfig,
 
        __connman_ipconfig_set_ops(ipconfig, NULL);
 
-       if (ipconfig->origin != NULL && ipconfig->origin != ipconfig) {
+       if (ipconfig->origin && ipconfig->origin != ipconfig) {
                __connman_ipconfig_unref(ipconfig->origin);
                ipconfig->origin = NULL;
        }
@@ -1215,6 +1263,7 @@ void __connman_ipconfig_unref_debug(struct connman_ipconfig *ipconfig,
        connman_ipaddress_free(ipconfig->system);
        connman_ipaddress_free(ipconfig->address);
        g_free(ipconfig->last_dhcp_address);
+       g_strfreev(ipconfig->last_dhcpv6_prefixes);
        g_free(ipconfig);
 }
 
@@ -1226,7 +1275,7 @@ void __connman_ipconfig_unref_debug(struct connman_ipconfig *ipconfig,
  */
 void *__connman_ipconfig_get_data(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return NULL;
 
        return ipconfig->ops_data;
@@ -1252,40 +1301,16 @@ void __connman_ipconfig_set_data(struct connman_ipconfig *ipconfig, void *data)
  */
 int __connman_ipconfig_get_index(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -1;
 
-       if (ipconfig->origin != NULL)
+       if (ipconfig->origin)
                return ipconfig->origin->index;
 
        return ipconfig->index;
 }
 
 /**
- * connman_ipconfig_get_ifname:
- * @ipconfig: ipconfig structure
- *
- * Get interface name
- */
-const char *__connman_ipconfig_get_ifname(struct connman_ipconfig *ipconfig)
-{
-       struct connman_ipdevice *ipdevice;
-
-       if (ipconfig == NULL)
-               return NULL;
-
-       if (ipconfig->index < 0)
-               return NULL;
-
-       ipdevice = g_hash_table_lookup(ipdevice_hash,
-                                       GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
-               return NULL;
-
-       return ipdevice->ifname;
-}
-
-/**
  * connman_ipconfig_set_ops:
  * @ipconfig: ipconfig structure
  * @ops: operation callbacks
@@ -1313,9 +1338,10 @@ int __connman_ipconfig_set_method(struct connman_ipconfig *ipconfig,
        return 0;
 }
 
-enum connman_ipconfig_method __connman_ipconfig_get_method(struct connman_ipconfig *ipconfig)
+enum connman_ipconfig_method __connman_ipconfig_get_method(
+                               struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return CONNMAN_IPCONFIG_METHOD_UNKNOWN;
 
        return ipconfig->method;
@@ -1350,7 +1376,7 @@ int __connman_ipconfig_address_remove(struct connman_ipconfig *ipconfig)
 
        DBG("");
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return 0;
 
        DBG("method %d", ipconfig->method);
@@ -1378,7 +1404,7 @@ int __connman_ipconfig_address_unset(struct connman_ipconfig *ipconfig)
 
        DBG("");
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return 0;
 
        DBG("method %d", ipconfig->method);
@@ -1415,12 +1441,12 @@ int __connman_ipconfig_set_proxy_autoconfig(struct connman_ipconfig *ipconfig,
 
        DBG("ipconfig %p", ipconfig);
 
-       if (ipconfig == NULL || ipconfig->index < 0)
+       if (!ipconfig || ipconfig->index < 0)
                return -ENODEV;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return -ENXIO;
 
        g_free(ipdevice->pac);
@@ -1435,12 +1461,12 @@ const char *__connman_ipconfig_get_proxy_autoconfig(struct connman_ipconfig *ipc
 
        DBG("ipconfig %p", ipconfig);
 
-       if (ipconfig == NULL || ipconfig->index < 0)
+       if (!ipconfig || ipconfig->index < 0)
                return NULL;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return NULL;
 
        return ipdevice->pac;
@@ -1449,7 +1475,7 @@ const char *__connman_ipconfig_get_proxy_autoconfig(struct connman_ipconfig *ipc
 void __connman_ipconfig_set_dhcp_address(struct connman_ipconfig *ipconfig,
                                        const char *address)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        g_free(ipconfig->last_dhcp_address);
@@ -1458,47 +1484,74 @@ void __connman_ipconfig_set_dhcp_address(struct connman_ipconfig *ipconfig,
 
 char *__connman_ipconfig_get_dhcp_address(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return NULL;
 
        return ipconfig->last_dhcp_address;
 }
 
+void __connman_ipconfig_set_dhcpv6_prefixes(struct connman_ipconfig *ipconfig,
+                                       char **prefixes)
+{
+       if (!ipconfig)
+               return;
+
+       g_strfreev(ipconfig->last_dhcpv6_prefixes);
+       ipconfig->last_dhcpv6_prefixes = prefixes;
+}
+
+char **__connman_ipconfig_get_dhcpv6_prefixes(struct connman_ipconfig *ipconfig)
+{
+       if (!ipconfig)
+               return NULL;
+
+       return ipconfig->last_dhcpv6_prefixes;
+}
+
 static void disable_ipv6(struct connman_ipconfig *ipconfig)
 {
        struct connman_ipdevice *ipdevice;
+       char *ifname;
 
        DBG("");
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
-       set_ipv6_state(ipdevice->ifname, FALSE);
+       ifname = connman_inet_ifname(ipconfig->index);
+
+       set_ipv6_state(ifname, false);
+
+       g_free(ifname);
 }
 
 static void enable_ipv6(struct connman_ipconfig *ipconfig)
 {
        struct connman_ipdevice *ipdevice;
+       char *ifname;
 
        DBG("");
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
+       ifname = connman_inet_ifname(ipconfig->index);
+
        if (ipconfig->method == CONNMAN_IPCONFIG_METHOD_AUTO)
-               set_ipv6_privacy(ipdevice->ifname,
-                               ipconfig->ipv6_privacy_config);
+               set_ipv6_privacy(ifname, ipconfig->ipv6_privacy_config);
+
+       set_ipv6_state(ifname, true);
 
-       set_ipv6_state(ipdevice->ifname, TRUE);
+       g_free(ifname);
 }
 
 void __connman_ipconfig_enable_ipv6(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL || ipconfig->type != CONNMAN_IPCONFIG_TYPE_IPV6)
+       if (!ipconfig || ipconfig->type != CONNMAN_IPCONFIG_TYPE_IPV6)
                return;
 
        enable_ipv6(ipconfig);
@@ -1506,21 +1559,21 @@ void __connman_ipconfig_enable_ipv6(struct connman_ipconfig *ipconfig)
 
 void __connman_ipconfig_disable_ipv6(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL || ipconfig->type != CONNMAN_IPCONFIG_TYPE_IPV6)
+       if (!ipconfig || ipconfig->type != CONNMAN_IPCONFIG_TYPE_IPV6)
                return;
 
        disable_ipv6(ipconfig);
 }
 
-connman_bool_t __connman_ipconfig_is_usable(struct connman_ipconfig *ipconfig)
+bool __connman_ipconfig_is_usable(struct connman_ipconfig *ipconfig)
 {
-       if (ipconfig == NULL)
-               return FALSE;
+       if (!ipconfig)
+               return false;
 
        switch (ipconfig->method) {
        case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
        case CONNMAN_IPCONFIG_METHOD_OFF:
-               return FALSE;
+               return false;
        case CONNMAN_IPCONFIG_METHOD_AUTO:
        case CONNMAN_IPCONFIG_METHOD_FIXED:
        case CONNMAN_IPCONFIG_METHOD_DHCP:
@@ -1528,24 +1581,25 @@ connman_bool_t __connman_ipconfig_is_usable(struct connman_ipconfig *ipconfig)
                break;
        }
 
-       return TRUE;
+       return true;
 }
 
 int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
 {
        struct connman_ipdevice *ipdevice;
-       gboolean up = FALSE, down = FALSE;
-       gboolean lower_up = FALSE, lower_down = FALSE;
+       bool up = false, down = false;
+       bool lower_up = false, lower_down = false;
        enum connman_ipconfig_type type;
+       char *ifname;
 
        DBG("ipconfig %p", ipconfig);
 
-       if (ipconfig == NULL || ipconfig->index < 0)
+       if (!ipconfig || ipconfig->index < 0)
                return -ENODEV;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return -ENXIO;
 
        if (ipconfig->type == CONNMAN_IPCONFIG_TYPE_IPV4) {
@@ -1559,10 +1613,10 @@ int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
        } else
                return -EINVAL;
 
-       ipconfig->enabled = TRUE;
+       ipconfig->enabled = true;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
-                                       ipdevice->config_ipv4 != NULL) {
+                                       ipdevice->config_ipv4) {
                ipconfig_list = g_list_remove(ipconfig_list,
                                                        ipdevice->config_ipv4);
 
@@ -1572,7 +1626,7 @@ int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
        }
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
-                                       ipdevice->config_ipv6 != NULL) {
+                                       ipdevice->config_ipv6) {
                ipconfig_list = g_list_remove(ipconfig_list,
                                                        ipdevice->config_ipv6);
 
@@ -1591,25 +1645,29 @@ int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
        ipconfig_list = g_list_append(ipconfig_list, ipconfig);
 
        if (ipdevice->flags & IFF_UP)
-               up = TRUE;
+               up = true;
        else
-               down = TRUE;
+               down = true;
 
        if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) ==
                        (IFF_RUNNING | IFF_LOWER_UP))
-               lower_up = TRUE;
+               lower_up = true;
        else if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) == 0)
-               lower_down = TRUE;
+               lower_down = true;
 
-       if (up == TRUE && ipconfig->ops->up)
-               ipconfig->ops->up(ipconfig);
-       if (lower_up == TRUE && ipconfig->ops->lower_up)
-               ipconfig->ops->lower_up(ipconfig);
+       ifname = connman_inet_ifname(ipconfig->index);
 
-       if (lower_down == TRUE && ipconfig->ops->lower_down)
-               ipconfig->ops->lower_down(ipconfig);
-       if (down == TRUE && ipconfig->ops->down)
-               ipconfig->ops->down(ipconfig);
+       if (up && ipconfig->ops->up)
+               ipconfig->ops->up(ipconfig, ifname);
+       if (lower_up && ipconfig->ops->lower_up)
+               ipconfig->ops->lower_up(ipconfig, ifname);
+
+       if (lower_down && ipconfig->ops->lower_down)
+               ipconfig->ops->lower_down(ipconfig, ifname);
+       if (down && ipconfig->ops->down)
+               ipconfig->ops->down(ipconfig, ifname);
+
+       g_free(ifname);
 
        return 0;
 }
@@ -1620,18 +1678,18 @@ int __connman_ipconfig_disable(struct connman_ipconfig *ipconfig)
 
        DBG("ipconfig %p", ipconfig);
 
-       if (ipconfig == NULL || ipconfig->index < 0)
+       if (!ipconfig || ipconfig->index < 0)
                return -ENODEV;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return -ENXIO;
 
-       if (ipdevice->config_ipv4 == NULL && ipdevice->config_ipv6 == NULL)
+       if (!ipdevice->config_ipv4 && !ipdevice->config_ipv6)
                return -EINVAL;
 
-       ipconfig->enabled = FALSE;
+       ipconfig->enabled = false;
 
        if (ipdevice->config_ipv4 == ipconfig) {
                ipconfig_list = g_list_remove(ipconfig_list, ipconfig);
@@ -1700,10 +1758,8 @@ static const char *privacy2string(int privacy)
                return "disabled";
        else if (privacy == 1)
                return "enabled";
-       else if (privacy > 1)
+       else
                return "prefered";
-
-       return "disabled";
 }
 
 static int string2privacy(const char *privacy)
@@ -1712,6 +1768,8 @@ static int string2privacy(const char *privacy)
                return 0;
        else if (g_strcmp0(privacy, "enabled") == 0)
                return 1;
+       else if (g_strcmp0(privacy, "preferred") == 0)
+               return 2;
        else if (g_strcmp0(privacy, "prefered") == 0)
                return 2;
        else
@@ -1723,7 +1781,7 @@ int __connman_ipconfig_ipv6_set_privacy(struct connman_ipconfig *ipconfig,
 {
        int privacy;
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -EINVAL;
 
        DBG("ipconfig %p privacy %s", ipconfig, value);
@@ -1749,7 +1807,7 @@ void __connman_ipconfig_append_ipv4(struct connman_ipconfig *ipconfig,
                return;
 
        str = __connman_ipconfig_method2string(ipconfig->method);
-       if (str == NULL)
+       if (!str)
                return;
 
        connman_dbus_dict_append_basic(iter, "Method", DBUS_TYPE_STRING, &str);
@@ -1770,10 +1828,10 @@ void __connman_ipconfig_append_ipv4(struct connman_ipconfig *ipconfig,
                break;
        }
 
-       if (append_addr == NULL)
+       if (!append_addr)
                return;
 
-       if (append_addr->local != NULL) {
+       if (append_addr->local) {
                in_addr_t addr;
                struct in_addr netmask;
                char *mask;
@@ -1788,7 +1846,7 @@ void __connman_ipconfig_append_ipv4(struct connman_ipconfig *ipconfig,
                                                DBUS_TYPE_STRING, &mask);
        }
 
-       if (append_addr->gateway != NULL)
+       if (append_addr->gateway)
                connman_dbus_dict_append_basic(iter, "Gateway",
                                DBUS_TYPE_STRING, &append_addr->gateway);
 }
@@ -1806,10 +1864,10 @@ void __connman_ipconfig_append_ipv6(struct connman_ipconfig *ipconfig,
                return;
 
        str = __connman_ipconfig_method2string(ipconfig->method);
-       if (str == NULL)
+       if (!str)
                return;
 
-       if (ipconfig_ipv4 != NULL &&
+       if (ipconfig_ipv4 &&
                        ipconfig->method == CONNMAN_IPCONFIG_METHOD_AUTO) {
                if (__connman_6to4_check(ipconfig_ipv4) == 1)
                        str = "6to4";
@@ -1833,10 +1891,10 @@ void __connman_ipconfig_append_ipv6(struct connman_ipconfig *ipconfig,
                break;
        }
 
-       if (append_addr == NULL)
+       if (!append_addr)
                return;
 
-       if (append_addr->local != NULL) {
+       if (append_addr->local) {
                connman_dbus_dict_append_basic(iter, "Address",
                                DBUS_TYPE_STRING, &append_addr->local);
                connman_dbus_dict_append_basic(iter, "PrefixLength",
@@ -1844,7 +1902,7 @@ void __connman_ipconfig_append_ipv6(struct connman_ipconfig *ipconfig,
                                                &append_addr->prefixlen);
        }
 
-       if (append_addr->gateway != NULL)
+       if (append_addr->gateway)
                connman_dbus_dict_append_basic(iter, "Gateway",
                                DBUS_TYPE_STRING, &append_addr->gateway);
 
@@ -1861,7 +1919,7 @@ void __connman_ipconfig_append_ipv6config(struct connman_ipconfig *ipconfig,
        DBG("");
 
        str = __connman_ipconfig_method2string(ipconfig->method);
-       if (str == NULL)
+       if (!str)
                return;
 
        connman_dbus_dict_append_basic(iter, "Method", DBUS_TYPE_STRING, &str);
@@ -1877,10 +1935,10 @@ void __connman_ipconfig_append_ipv6config(struct connman_ipconfig *ipconfig,
                break;
        }
 
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
-       if (ipconfig->address->local != NULL) {
+       if (ipconfig->address->local) {
                connman_dbus_dict_append_basic(iter, "Address",
                                DBUS_TYPE_STRING, &ipconfig->address->local);
                connman_dbus_dict_append_basic(iter, "PrefixLength",
@@ -1888,7 +1946,7 @@ void __connman_ipconfig_append_ipv6config(struct connman_ipconfig *ipconfig,
                                                &ipconfig->address->prefixlen);
        }
 
-       if (ipconfig->address->gateway != NULL)
+       if (ipconfig->address->gateway)
                connman_dbus_dict_append_basic(iter, "Gateway",
                                DBUS_TYPE_STRING, &ipconfig->address->gateway);
 
@@ -1905,7 +1963,7 @@ void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
        DBG("");
 
        str = __connman_ipconfig_method2string(ipconfig->method);
-       if (str == NULL)
+       if (!str)
                return;
 
        connman_dbus_dict_append_basic(iter, "Method", DBUS_TYPE_STRING, &str);
@@ -1921,10 +1979,10 @@ void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
                break;
        }
 
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
-       if (ipconfig->address->local != NULL) {
+       if (ipconfig->address->local) {
                in_addr_t addr;
                struct in_addr netmask;
                char *mask;
@@ -1939,7 +1997,7 @@ void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
                                                DBUS_TYPE_STRING, &mask);
        }
 
-       if (ipconfig->address->gateway != NULL)
+       if (ipconfig->address->gateway)
                connman_dbus_dict_append_basic(iter, "Gateway",
                                DBUS_TYPE_STRING, &ipconfig->address->gateway);
 }
@@ -1981,7 +2039,7 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
 
                type = dbus_message_iter_get_arg_type(&value);
 
-               if (g_str_equal(key, "Method") == TRUE) {
+               if (g_str_equal(key, "Method")) {
                        const char *str;
 
                        if (type != DBUS_TYPE_STRING)
@@ -1989,12 +2047,12 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
 
                        dbus_message_iter_get_basic(&value, &str);
                        method = __connman_ipconfig_string2method(str);
-               } else if (g_str_equal(key, "Address") == TRUE) {
+               } else if (g_str_equal(key, "Address")) {
                        if (type != DBUS_TYPE_STRING)
                                return -EINVAL;
 
                        dbus_message_iter_get_basic(&value, &address);
-               } else if (g_str_equal(key, "PrefixLength") == TRUE) {
+               } else if (g_str_equal(key, "PrefixLength")) {
                        if (type != DBUS_TYPE_BYTE)
                                return -EINVAL;
 
@@ -2002,17 +2060,17 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
 
                        if (prefix_length < 0 || prefix_length > 128)
                                return -EINVAL;
-               } else if (g_str_equal(key, "Netmask") == TRUE) {
+               } else if (g_str_equal(key, "Netmask")) {
                        if (type != DBUS_TYPE_STRING)
                                return -EINVAL;
 
                        dbus_message_iter_get_basic(&value, &netmask);
-               } else if (g_str_equal(key, "Gateway") == TRUE) {
+               } else if (g_str_equal(key, "Gateway")) {
                        if (type != DBUS_TYPE_STRING)
                                return -EINVAL;
 
                        dbus_message_iter_get_basic(&value, &gateway);
-               } else if (g_str_equal(key, "Privacy") == TRUE) {
+               } else if (g_str_equal(key, "Privacy")) {
                        if (type != DBUS_TYPE_STRING)
                                return -EINVAL;
 
@@ -2044,7 +2102,7 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
                        return -EOPNOTSUPP;
 
                ipconfig->method = method;
-               if (privacy_string != NULL)
+               if (privacy_string)
                        ipconfig->ipv6_privacy_config = privacy;
                enable_ipv6(ipconfig);
                break;
@@ -2062,12 +2120,12 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
                        break;
                }
 
-               if ((address != NULL && connman_inet_check_ipaddress(address)
+               if ((address && connman_inet_check_ipaddress(address)
                                                != type) ||
-                               (netmask != NULL &&
+                               (netmask &&
                                connman_inet_check_ipaddress(netmask)
                                                != type) ||
-                               (gateway != NULL &&
+                               (gateway &&
                                connman_inet_check_ipaddress(gateway)
                                                != type))
                        return -EINVAL;
@@ -2105,14 +2163,17 @@ void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig,
 
        ipdevice = g_hash_table_lookup(ipdevice_hash,
                                        GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
-       if (ipdevice->ifname != NULL)
+       if (ipconfig->index >= 0) {
+               char *ifname = connman_inet_ifname(ipconfig->index);
                connman_dbus_dict_append_basic(iter, "Interface",
-                                       DBUS_TYPE_STRING, &ipdevice->ifname);
+                                       DBUS_TYPE_STRING, &ifname);
+               g_free(ifname);
+       }
 
-       if (ipdevice->address != NULL)
+       if (ipdevice->address)
                connman_dbus_dict_append_basic(iter, "Address",
                                        DBUS_TYPE_STRING, &ipdevice->address);
 
@@ -2132,7 +2193,7 @@ int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
 
        key = g_strdup_printf("%smethod", prefix);
        method = g_key_file_get_string(keyfile, identifier, key, NULL);
-       if (method == NULL) {
+       if (!method) {
                switch (ipconfig->type) {
                case CONNMAN_IPCONFIG_TYPE_IPV4:
                        ipconfig->method = CONNMAN_IPCONFIG_METHOD_DHCP;
@@ -2151,16 +2212,30 @@ int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
                ipconfig->method = CONNMAN_IPCONFIG_METHOD_OFF;
 
        if (ipconfig->type == CONNMAN_IPCONFIG_TYPE_IPV6) {
+               gsize length;
+               char *pprefix;
+
                if (ipconfig->method == CONNMAN_IPCONFIG_METHOD_AUTO ||
                        ipconfig->method == CONNMAN_IPCONFIG_METHOD_MANUAL) {
                        char *privacy;
-                       char *pprefix = g_strdup_printf("%sprivacy", prefix);
+
+                       pprefix = g_strdup_printf("%sprivacy", prefix);
                        privacy = g_key_file_get_string(keyfile, identifier,
                                                        pprefix, NULL);
                        ipconfig->ipv6_privacy_config = string2privacy(privacy);
                        g_free(pprefix);
                        g_free(privacy);
                }
+
+               pprefix = g_strdup_printf("%sDHCP.LastPrefixes", prefix);
+               ipconfig->last_dhcpv6_prefixes =
+                       g_key_file_get_string_list(keyfile, identifier, pprefix,
+                                               &length, NULL);
+               if (ipconfig->last_dhcpv6_prefixes && length == 0) {
+                       g_free(ipconfig->last_dhcpv6_prefixes);
+                       ipconfig->last_dhcpv6_prefixes = NULL;
+               }
+               g_free(pprefix);
        }
 
        g_free(method);
@@ -2172,28 +2247,32 @@ int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
        g_free(key);
 
        key = g_strdup_printf("%slocal_address", prefix);
+       g_free(ipconfig->address->local);
        ipconfig->address->local = g_key_file_get_string(
                        keyfile, identifier, key, NULL);
        g_free(key);
 
        key = g_strdup_printf("%speer_address", prefix);
+       g_free(ipconfig->address->peer);
        ipconfig->address->peer = g_key_file_get_string(
                                keyfile, identifier, key, NULL);
        g_free(key);
 
        key = g_strdup_printf("%sbroadcast_address", prefix);
+       g_free(ipconfig->address->broadcast);
        ipconfig->address->broadcast = g_key_file_get_string(
                                keyfile, identifier, key, NULL);
        g_free(key);
 
        key = g_strdup_printf("%sgateway", prefix);
+       g_free(ipconfig->address->gateway);
        ipconfig->address->gateway = g_key_file_get_string(
                                keyfile, identifier, key, NULL);
        g_free(key);
 
        key = g_strdup_printf("%sDHCP.LastAddress", prefix);
        str = g_key_file_get_string(keyfile, identifier, key, NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(ipconfig->last_dhcp_address);
                ipconfig->last_dhcp_address = str;
        }
@@ -2208,13 +2287,15 @@ int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
        const char *method;
        char *key;
 
-       DBG("ipconfig %p identifier %s", ipconfig, identifier);
-
        method = __connman_ipconfig_method2string(ipconfig->method);
 
-       key = g_strdup_printf("%smethod", prefix);
-       g_key_file_set_string(keyfile, identifier, key, method);
-       g_free(key);
+       DBG("ipconfig %p identifier %s method %s", ipconfig, identifier,
+                                                               method);
+       if (method) {
+               key = g_strdup_printf("%smethod", prefix);
+               g_key_file_set_string(keyfile, identifier, key, method);
+               g_free(key);
+       }
 
        if (ipconfig->type == CONNMAN_IPCONFIG_TYPE_IPV6) {
                const char *privacy;
@@ -2224,13 +2305,26 @@ int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
                g_free(key);
 
                key = g_strdup_printf("%sDHCP.LastAddress", prefix);
-               if (ipconfig->last_dhcp_address != NULL &&
+               if (ipconfig->last_dhcp_address &&
                                strlen(ipconfig->last_dhcp_address) > 0)
                        g_key_file_set_string(keyfile, identifier, key,
                                        ipconfig->last_dhcp_address);
                else
                        g_key_file_remove_key(keyfile, identifier, key, NULL);
                g_free(key);
+
+               key = g_strdup_printf("%sDHCP.LastPrefixes", prefix);
+               if (ipconfig->last_dhcpv6_prefixes &&
+                               ipconfig->last_dhcpv6_prefixes[0]) {
+                       guint len =
+                               g_strv_length(ipconfig->last_dhcpv6_prefixes);
+
+                       g_key_file_set_string_list(keyfile, identifier, key,
+                               (const gchar **)ipconfig->last_dhcpv6_prefixes,
+                                               len);
+               } else
+                       g_key_file_remove_key(keyfile, identifier, key, NULL);
+               g_free(key);
        }
 
        switch (ipconfig->method) {
@@ -2239,7 +2333,7 @@ int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
                break;
        case CONNMAN_IPCONFIG_METHOD_DHCP:
                key = g_strdup_printf("%sDHCP.LastAddress", prefix);
-               if (ipconfig->last_dhcp_address != NULL &&
+               if (ipconfig->last_dhcp_address &&
                                strlen(ipconfig->last_dhcp_address) > 0)
                        g_key_file_set_string(keyfile, identifier, key,
                                        ipconfig->last_dhcp_address);
@@ -2260,25 +2354,25 @@ int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
        g_free(key);
 
        key = g_strdup_printf("%slocal_address", prefix);
-       if (ipconfig->address->local != NULL)
+       if (ipconfig->address->local)
                g_key_file_set_string(keyfile, identifier,
                                key, ipconfig->address->local);
        g_free(key);
 
        key = g_strdup_printf("%speer_address", prefix);
-       if (ipconfig->address->peer != NULL)
+       if (ipconfig->address->peer)
                g_key_file_set_string(keyfile, identifier,
                                key, ipconfig->address->peer);
        g_free(key);
 
        key = g_strdup_printf("%sbroadcast_address", prefix);
-       if (ipconfig->address->broadcast != NULL)
+       if (ipconfig->address->broadcast)
                g_key_file_set_string(keyfile, identifier,
                        key, ipconfig->address->broadcast);
        g_free(key);
 
        key = g_strdup_printf("%sgateway", prefix);
-       if (ipconfig->address->gateway != NULL)
+       if (ipconfig->address->gateway)
                g_key_file_set_string(keyfile, identifier,
                        key, ipconfig->address->gateway);
        g_free(key);
index ba613fb..558e966 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
- *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  BMW Car IT GmbH. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -24,7 +24,6 @@
 #include <config.h>
 #endif
 
-#include <getopt.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -82,7 +81,7 @@ __connman_ippool_ref_debug(struct connman_ippool *pool,
 void __connman_ippool_unref_debug(struct connman_ippool *pool,
                                const char *file, int line, const char *caller)
 {
-       if (pool == NULL)
+       if (!pool)
                return;
 
        DBG("%p ref %d by %s:%d:%s()", pool, pool->refcount - 1,
@@ -170,7 +169,7 @@ static uint32_t get_free_block(unsigned int size)
        struct address_info *info;
        uint32_t block;
        GSList *list;
-       connman_bool_t collision;
+       bool collision;
 
        /*
         * Instead starting always from the 16 bit block, we start
@@ -188,17 +187,17 @@ static uint32_t get_free_block(unsigned int size)
                block = next_block(last_block);
 
        do {
-               collision = FALSE;
-               for (list = allocated_blocks; list != NULL; list = list->next) {
+               collision = false;
+               for (list = allocated_blocks; list; list = list->next) {
                        info = list->data;
 
                        if (info->start <= block && block <= info->end) {
-                               collision = TRUE;
+                               collision = true;
                                break;
                        }
                }
 
-               if (collision == FALSE)
+               if (!collision)
                        return block;
 
                block = next_block(block);
@@ -211,7 +210,7 @@ static struct address_info *lookup_info(int index, uint32_t start)
 {
        GSList *list;
 
-       for (list = allocated_blocks; list != NULL; list = list->next) {
+       for (list = allocated_blocks; list; list = list->next) {
                struct address_info *info = list->data;
 
                if (info->index == index && info->start == start)
@@ -221,7 +220,7 @@ static struct address_info *lookup_info(int index, uint32_t start)
        return NULL;
 }
 
-static connman_bool_t is_private_address(uint32_t address)
+static bool is_private_address(uint32_t address)
 {
        unsigned int a, b;
 
@@ -230,9 +229,9 @@ static connman_bool_t is_private_address(uint32_t address)
 
        if (a == 10 || (a == 192 && b == 168) ||
                                        (a == 172 && (b >= 16 && b <= 31)))
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 void __connman_ippool_newaddr(int index, const char *address,
@@ -247,7 +246,7 @@ void __connman_ippool_newaddr(int index, const char *address,
                return;
 
        start = ntohl(inp.s_addr);
-       if (is_private_address(start) == FALSE)
+       if (!is_private_address(start))
                return;
 
        if (prefixlen >= 32)
@@ -259,11 +258,11 @@ void __connman_ippool_newaddr(int index, const char *address,
        end = start | ~mask;
 
        info = lookup_info(index, start);
-       if (info != NULL)
+       if (info)
                goto update;
 
        info = g_try_new0(struct address_info, 1);
-       if (info == NULL)
+       if (!info)
                return;
 
        info->index = index;
@@ -275,7 +274,7 @@ void __connman_ippool_newaddr(int index, const char *address,
 update:
        info->use_count = info->use_count + 1;
 
-       if (info->use_count > 1 || info->pool != NULL) {
+       if (info->use_count > 1 || info->pool) {
                /*
                 * We need only to check for the first IP in a block for
                 * collisions.
@@ -283,16 +282,16 @@ update:
                return;
        }
 
-       for (list = allocated_blocks; list != NULL; list = list->next) {
+       for (list = allocated_blocks; list; list = list->next) {
                it = list->data;
 
                if (it == info)
                        continue;
 
-               if (!(it->start <= info->start || info->start <= it->end))
+               if (!(info->start >= it->start && info->start <= it->end))
                        continue;
 
-               if (it->pool != NULL && it->pool->collision_cb != NULL)
+               if (it->pool && it->pool->collision_cb)
                        it->pool->collision_cb(it->pool, it->pool->user_data);
 
                return;
@@ -310,27 +309,28 @@ void __connman_ippool_deladdr(int index, const char *address,
                return;
 
        start = ntohl(inp.s_addr);
-       if (is_private_address(start) == FALSE)
+       if (!is_private_address(start))
                return;
 
        mask = ~(0xffffffff >> prefixlen);
        start = start & mask;
 
        info = lookup_info(index, start);
-       if (info == NULL) {
+       if (!info) {
                /* In theory this should never happen */
                connman_error("Inconsistent IP pool management (start not found)");
                return;
        }
 
        info->use_count = info->use_count - 1;
-       if (info->pool != NULL)
+       if (info->pool)
                return;
 
        if (info->use_count > 0)
                return;
 
        allocated_blocks = g_slist_remove(allocated_blocks, info);
+       g_free(info);
 }
 
 struct connman_ippool *__connman_ippool_create(int index,
@@ -361,11 +361,11 @@ struct connman_ippool *__connman_ippool_create(int index,
        }
 
        pool = g_try_new0(struct connman_ippool, 1);
-       if (pool == NULL)
+       if (!pool)
                return NULL;
 
        info = g_try_new0(struct address_info, 1);
-       if (info == NULL) {
+       if (!info) {
                g_free(pool);
                return NULL;
        }
@@ -427,7 +427,7 @@ static void pool_free(gpointer data)
 {
        struct connman_ippool *pool = data;
 
-       if (pool->info != NULL) {
+       if (pool->info) {
                allocated_blocks = g_slist_remove(allocated_blocks, pool->info);
                g_free(pool->info);
        }
@@ -463,7 +463,7 @@ void __connman_ippool_cleanup(void)
        g_hash_table_destroy(pool_hash);
        pool_hash = NULL;
 
-       g_slist_free(allocated_blocks);
+       g_slist_free_full(allocated_blocks, g_free);
        last_block = 0;
        allocated_blocks = NULL;
 }
index 9584e12..8d583ea 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -35,6 +35,7 @@
 #include <linux/netfilter_ipv4/ip_tables.h>
 
 #include "connman.h"
+#include "src/shared/util.h"
 
 /*
  * Some comments on how the iptables API works (some of them from the
@@ -175,10 +176,10 @@ struct connman_iptables {
 };
 
 static GHashTable *table_hash = NULL;
-static gboolean debug_enabled = FALSE;
+static bool debug_enabled = false;
 
 typedef int (*iterate_entries_cb_t)(struct ipt_entry *entry, int builtin,
-                                       unsigned int hook,size_t size,
+                                       unsigned int hook, size_t size,
                                        unsigned int offset, void *user_data);
 
 static unsigned int next_hook_entry_index(unsigned int *valid_hooks)
@@ -233,9 +234,8 @@ static int iterate_entries(struct ipt_entry *entries,
                if (h == NF_INET_NUMHOOKS)
                        hook = h;
 
-               if (h < NF_INET_NUMHOOKS && underflow[h] <= offset) {
+               if (h < NF_INET_NUMHOOKS && underflow[h] <= offset)
                        h = next_hook_entry_index(&valid_hooks);
-               }
 
                err = cb(entry, builtin, hook, size, offset, user_data);
                if (err < 0)
@@ -274,18 +274,18 @@ static int target_to_verdict(const char *target_name)
        return 0;
 }
 
-static gboolean is_builtin_target(const char *target_name)
+static bool is_builtin_target(const char *target_name)
 {
        if (!g_strcmp0(target_name, LABEL_ACCEPT) ||
                !g_strcmp0(target_name, LABEL_DROP) ||
                !g_strcmp0(target_name, LABEL_QUEUE) ||
                !g_strcmp0(target_name, LABEL_RETURN))
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
-static gboolean is_jump(struct connman_iptables_entry *e)
+static bool is_jump(struct connman_iptables_entry *e)
 {
        struct xt_entry_target *target;
 
@@ -312,7 +312,7 @@ static gboolean is_jump(struct connman_iptables_entry *e)
        return false;
 }
 
-static gboolean is_fallthrough(struct connman_iptables_entry *e)
+static bool is_fallthrough(struct connman_iptables_entry *e)
 {
        struct xt_entry_target *target;
 
@@ -327,7 +327,7 @@ static gboolean is_fallthrough(struct connman_iptables_entry *e)
        return false;
 }
 
-static gboolean is_chain(struct connman_iptables *table,
+static bool is_chain(struct connman_iptables *table,
                                struct connman_iptables_entry *e)
 {
        struct ipt_entry *entry;
@@ -335,13 +335,13 @@ static gboolean is_chain(struct connman_iptables *table,
 
        entry = e->entry;
        if (e->builtin >= 0)
-               return TRUE;
+               return true;
 
        target = ipt_get_target(entry);
        if (!g_strcmp0(target->u.user.name, IPT_ERROR_TARGET))
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static GList *find_chain_head(struct connman_iptables *table,
@@ -379,7 +379,7 @@ static GList *find_chain_tail(struct connman_iptables *table,
        GList *chain_head, *list;
 
        chain_head = find_chain_head(table, chain_name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return NULL;
 
        /* Then we look for the next chain */
@@ -420,7 +420,7 @@ static void update_offsets(struct connman_iptables *table)
 static void update_targets_reference(struct connman_iptables *table,
                                struct connman_iptables_entry *entry_before,
                                struct connman_iptables_entry *modified_entry,
-                               gboolean is_removing)
+                               bool is_removing)
 {
        struct connman_iptables_entry *tmp;
        struct xt_standard_target *t;
@@ -437,7 +437,7 @@ static void update_targets_reference(struct connman_iptables *table,
 
                t = (struct xt_standard_target *)ipt_get_target(tmp->entry);
 
-               if (is_removing == TRUE) {
+               if (is_removing) {
                        if (t->verdict >= entry_before->offset)
                                t->verdict -= offset;
                } else {
@@ -447,7 +447,8 @@ static void update_targets_reference(struct connman_iptables *table,
        }
 
        if (is_fallthrough(modified_entry)) {
-               t = (struct xt_standard_target *) ipt_get_target(modified_entry->entry);
+               t = (struct xt_standard_target *)
+                       ipt_get_target(modified_entry->entry);
 
                t->verdict = entry_before->offset +
                        modified_entry->entry->target_offset +
@@ -463,11 +464,11 @@ static int iptables_add_entry(struct connman_iptables *table,
 {
        struct connman_iptables_entry *e, *entry_before;
 
-       if (table == NULL)
+       if (!table)
                return -1;
 
        e = g_try_malloc0(sizeof(struct connman_iptables_entry));
-       if (e == NULL)
+       if (!e)
                return -1;
 
        e->entry = entry;
@@ -477,7 +478,7 @@ static int iptables_add_entry(struct connman_iptables *table,
        table->num_entries++;
        table->size += entry->next_offset;
 
-       if (before == NULL) {
+       if (!before) {
                e->offset = table->size - entry->next_offset;
 
                return 0;
@@ -489,7 +490,7 @@ static int iptables_add_entry(struct connman_iptables *table,
         * We've just appended/insterted a new entry. All references
         * should be bumped accordingly.
         */
-       update_targets_reference(table, entry_before, e, FALSE);
+       update_targets_reference(table, entry_before, e, false);
 
        update_offsets(table);
 
@@ -546,11 +547,11 @@ static int iptables_flush_chain(struct connman_iptables *table,
        DBG("table %s chain %s", table->name, name);
 
        chain_head = find_chain_head(table, name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return -EINVAL;
 
        chain_tail = find_chain_tail(table, name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return -EINVAL;
 
        entry = chain_head->data;
@@ -605,13 +606,13 @@ static int iptables_add_chain(struct connman_iptables *table,
         */
 
        /* head entry */
-       entry_head_size = sizeof(struct ipt_entry) +
-                               sizeof(struct error_target);
+       entry_head_size = ALIGN(sizeof(struct ipt_entry)) +
+                       ALIGN(sizeof(struct error_target));
        entry_head = g_try_malloc0(entry_head_size);
-       if (entry_head == NULL)
+       if (!entry_head)
                goto err_head;
 
-       entry_head->target_offset = sizeof(struct ipt_entry);
+       entry_head->target_offset = ALIGN(sizeof(struct ipt_entry));
        entry_head->next_offset = entry_head_size;
 
        error = (struct error_target *) entry_head->elems;
@@ -623,13 +624,13 @@ static int iptables_add_chain(struct connman_iptables *table,
                goto err_head;
 
        /* tail entry */
-       entry_return_size = sizeof(struct ipt_entry) +
-                               sizeof(struct ipt_standard_target);
+       entry_return_size = ALIGN(sizeof(struct ipt_entry))+
+                       ALIGN(sizeof(struct ipt_standard_target));
        entry_return = g_try_malloc0(entry_return_size);
-       if (entry_return == NULL)
+       if (!entry_return)
                goto err;
 
-       entry_return->target_offset = sizeof(struct ipt_entry);
+       entry_return->target_offset = ALIGN(sizeof(struct ipt_entry));
        entry_return->next_offset = entry_return_size;
 
        standard = (struct ipt_standard_target *) entry_return->elems;
@@ -659,7 +660,7 @@ static int iptables_delete_chain(struct connman_iptables *table,
        DBG("table %s chain %s", table->name, name);
 
        chain_head = find_chain_head(table, name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return -EINVAL;
 
        entry = chain_head->data;
@@ -669,7 +670,7 @@ static int iptables_delete_chain(struct connman_iptables *table,
                return -EINVAL;
 
        chain_tail = find_chain_tail(table, name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return -EINVAL;
 
        /* Chain must be flushed */
@@ -695,27 +696,28 @@ static struct ipt_entry *new_rule(struct ipt_ip *ip,
        size_t match_size, target_size;
 
        match_size = 0;
-       for (tmp_xt_rm = xt_rm; tmp_xt_rm != NULL; tmp_xt_rm = tmp_xt_rm->next)
+       for (tmp_xt_rm = xt_rm; tmp_xt_rm; tmp_xt_rm = tmp_xt_rm->next)
                match_size += tmp_xt_rm->match->m->u.match_size;
 
        if (xt_t)
-               target_size = ALIGN(xt_t->t->u.target_size);
+               target_size = xt_t->t->u.target_size;
        else
                target_size = ALIGN(sizeof(struct xt_standard_target));
 
-       new_entry = g_try_malloc0(sizeof(struct ipt_entry) + target_size +
-                                                               match_size);
-       if (new_entry == NULL)
+       new_entry = g_try_malloc0(ALIGN(sizeof(struct ipt_entry)) +
+                               target_size + match_size);
+       if (!new_entry)
                return NULL;
 
        memcpy(&new_entry->ip, ip, sizeof(struct ipt_ip));
 
-       new_entry->target_offset = sizeof(struct ipt_entry) + match_size;
-       new_entry->next_offset = sizeof(struct ipt_entry) + target_size +
-                                                               match_size;
+       new_entry->target_offset = ALIGN(sizeof(struct ipt_entry)) +
+                                                       match_size;
+       new_entry->next_offset = ALIGN(sizeof(struct ipt_entry)) +
+                                       target_size + match_size;
 
        match_size = 0;
-       for (tmp_xt_rm = xt_rm; tmp_xt_rm != NULL;
+       for (tmp_xt_rm = xt_rm; tmp_xt_rm;
                                tmp_xt_rm = tmp_xt_rm->next) {
                memcpy(new_entry->elems + match_size, tmp_xt_rm->match->m,
                                        tmp_xt_rm->match->m->u.match_size);
@@ -739,7 +741,7 @@ static void update_hooks(struct connman_iptables *table, GList *chain_head,
        struct connman_iptables_entry *head, *e;
        int builtin;
 
-       if (chain_head == NULL)
+       if (!chain_head)
                return;
 
        head = chain_head->data;
@@ -767,22 +769,22 @@ static struct ipt_entry *prepare_rule_inclusion(struct connman_iptables *table,
                                const char *target_name,
                                struct xtables_target *xt_t,
                                int *builtin, struct xtables_rule_match *xt_rm,
-                               connman_bool_t insert)
+                               bool insert)
 {
        GList *chain_tail, *chain_head;
        struct ipt_entry *new_entry;
        struct connman_iptables_entry *head;
 
        chain_head = find_chain_head(table, chain_name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return NULL;
 
        chain_tail = find_chain_tail(table, chain_name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return NULL;
 
        new_entry = new_rule(ip, target_name, xt_t, xt_rm);
-       if (new_entry == NULL)
+       if (!new_entry)
                return NULL;
 
        update_hooks(table, chain_head, new_entry);
@@ -795,7 +797,7 @@ static struct ipt_entry *prepare_rule_inclusion(struct connman_iptables *table,
        head = chain_head->data;
        if (head->builtin < 0)
                *builtin = -1;
-       else if (insert == TRUE || chain_head == chain_tail->prev) {
+       else if (insert || chain_head == chain_tail->prev) {
                *builtin = head->builtin;
                head->builtin = -1;
        }
@@ -816,12 +818,12 @@ static int iptables_append_rule(struct connman_iptables *table,
        DBG("table %s chain %s", table->name, chain_name);
 
        chain_tail = find_chain_tail(table, chain_name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return -EINVAL;
 
        new_entry = prepare_rule_inclusion(table, ip, chain_name,
-                               target_name, xt_t, &builtin, xt_rm, FALSE);
-       if (new_entry == NULL)
+                               target_name, xt_t, &builtin, xt_rm, false);
+       if (!new_entry)
                return -EINVAL;
 
        ret = iptables_add_entry(table, new_entry, chain_tail->prev, builtin);
@@ -844,12 +846,12 @@ static int iptables_insert_rule(struct connman_iptables *table,
        DBG("table %s chain %s", table->name, chain_name);
 
        chain_head = find_chain_head(table, chain_name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return -EINVAL;
 
        new_entry = prepare_rule_inclusion(table, ip, chain_name,
-                               target_name, xt_t, &builtin, xt_rm, TRUE);
-       if (new_entry == NULL)
+                               target_name, xt_t, &builtin, xt_rm, true);
+       if (!new_entry)
                return -EINVAL;
 
        if (builtin == -1)
@@ -862,33 +864,33 @@ static int iptables_insert_rule(struct connman_iptables *table,
        return ret;
 }
 
-static gboolean is_same_ipt_entry(struct ipt_entry *i_e1,
+static bool is_same_ipt_entry(struct ipt_entry *i_e1,
                                        struct ipt_entry *i_e2)
 {
        if (memcmp(&i_e1->ip, &i_e2->ip, sizeof(struct ipt_ip)) != 0)
-               return FALSE;
+               return false;
 
        if (i_e1->target_offset != i_e2->target_offset)
-               return FALSE;
+               return false;
 
        if (i_e1->next_offset != i_e2->next_offset)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
-static gboolean is_same_target(struct xt_entry_target *xt_e_t1,
+static bool is_same_target(struct xt_entry_target *xt_e_t1,
                                        struct xt_entry_target *xt_e_t2)
 {
        unsigned int i;
 
-       if (xt_e_t1 == NULL || xt_e_t2 == NULL)
-               return FALSE;
+       if (!xt_e_t1 || !xt_e_t2)
+               return false;
 
        if (g_strcmp0(xt_e_t1->u.user.name, "") == 0 &&
                        g_strcmp0(xt_e_t2->u.user.name, "") == 0) {
                /* fallthrough */
-               return TRUE;
+               return true;
        } else if (g_strcmp0(xt_e_t1->u.user.name, IPT_STANDARD_TARGET) == 0) {
                struct xt_standard_target *xt_s_t1;
                struct xt_standard_target *xt_s_t2;
@@ -897,48 +899,48 @@ static gboolean is_same_target(struct xt_entry_target *xt_e_t1,
                xt_s_t2 = (struct xt_standard_target *) xt_e_t2;
 
                if (xt_s_t1->verdict != xt_s_t2->verdict)
-                       return FALSE;
+                       return false;
        } else {
                if (xt_e_t1->u.target_size != xt_e_t2->u.target_size)
-                       return FALSE;
+                       return false;
 
                if (g_strcmp0(xt_e_t1->u.user.name, xt_e_t2->u.user.name) != 0)
-                       return FALSE;
+                       return false;
 
                for (i = 0; i < xt_e_t1->u.target_size -
                                sizeof(struct xt_standard_target); i++) {
                        if ((xt_e_t1->data[i] ^ xt_e_t2->data[i]) != 0)
-                               return FALSE;
+                               return false;
                }
        }
 
-       return TRUE;
+       return true;
 }
 
-static gboolean is_same_match(struct xt_entry_match *xt_e_m1,
+static bool is_same_match(struct xt_entry_match *xt_e_m1,
                                struct xt_entry_match *xt_e_m2)
 {
        unsigned int i;
 
-       if (xt_e_m1 == NULL || xt_e_m2 == NULL)
-               return FALSE;
+       if (!xt_e_m1 || !xt_e_m2)
+               return false;
 
        if (xt_e_m1->u.match_size != xt_e_m2->u.match_size)
-               return FALSE;
+               return false;
 
        if (xt_e_m1->u.user.revision != xt_e_m2->u.user.revision)
-               return FALSE;
+               return false;
 
        if (g_strcmp0(xt_e_m1->u.user.name, xt_e_m2->u.user.name) != 0)
-               return FALSE;
+               return false;
 
        for (i = 0; i < xt_e_m1->u.match_size - sizeof(struct xt_entry_match);
                        i++) {
                if ((xt_e_m1->data[i] ^ xt_e_m2->data[i]) != 0)
-                       return FALSE;
+                       return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static GList *find_existing_rule(struct connman_iptables *table,
@@ -956,23 +958,23 @@ static GList *find_existing_rule(struct connman_iptables *table,
        int builtin;
 
        chain_head = find_chain_head(table, chain_name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return NULL;
 
        chain_tail = find_chain_tail(table, chain_name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return NULL;
 
        if (!xt_t && !matches)
                return NULL;
 
        entry_test = new_rule(ip, target_name, xt_t, xt_rm);
-       if (entry_test == NULL)
+       if (!entry_test)
                return NULL;
 
-       if (xt_t != NULL)
+       if (xt_t)
                xt_e_t = ipt_get_target(entry_test);
-       if (matches != NULL)
+       if (matches)
                xt_e_m = (struct xt_entry_match *)entry_test->elems;
 
        entry = chain_head->data;
@@ -990,10 +992,10 @@ static GList *find_existing_rule(struct connman_iptables *table,
                tmp = list->data;
                tmp_e = tmp->entry;
 
-               if (is_same_ipt_entry(entry_test, tmp_e) == FALSE)
+               if (!is_same_ipt_entry(entry_test, tmp_e))
                        continue;
 
-               if (xt_t != NULL) {
+               if (xt_t) {
                        struct xt_entry_target *tmp_xt_e_t;
 
                        tmp_xt_e_t = ipt_get_target(tmp_e);
@@ -1002,7 +1004,7 @@ static GList *find_existing_rule(struct connman_iptables *table,
                                continue;
                }
 
-               if (matches != NULL) {
+               if (matches) {
                        struct xt_entry_match *tmp_xt_e_m;
 
                        tmp_xt_e_m = (struct xt_entry_match *)tmp_e->elems;
@@ -1039,16 +1041,16 @@ static int iptables_delete_rule(struct connman_iptables *table,
        removed = 0;
 
        chain_head = find_chain_head(table, chain_name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return -EINVAL;
 
        chain_tail = find_chain_tail(table, chain_name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return -EINVAL;
 
        list = find_existing_rule(table, ip, chain_name, target_name,
                                                        xt_t, matches, xt_rm);
-       if (list == NULL)
+       if (!list)
                return -EINVAL;
 
        entry = chain_head->data;
@@ -1071,14 +1073,14 @@ static int iptables_delete_rule(struct connman_iptables *table,
        }
 
        entry = list->data;
-       if (entry == NULL)
+       if (!entry)
                return -EINVAL;
 
        /* We have deleted a rule,
         * all references should be bumped accordingly */
-       if (list->next != NULL)
+       if (list->next)
                update_targets_reference(table, list->next->data,
-                                               list->data, TRUE);
+                                               list->data, true);
 
        removed += remove_table_entry(table, entry);
 
@@ -1111,7 +1113,7 @@ static int iptables_change_policy(struct connman_iptables *table,
        }
 
        chain_head = find_chain_head(table, chain_name);
-       if (chain_head == NULL)
+       if (!chain_head)
                return -EINVAL;
 
        entry = chain_head->data;
@@ -1119,7 +1121,7 @@ static int iptables_change_policy(struct connman_iptables *table,
                return -EINVAL;
 
        chain_tail = find_chain_tail(table, chain_name);
-       if (chain_tail == NULL)
+       if (!chain_tail)
                return -EINVAL;
 
        entry = chain_tail->prev->data;
@@ -1139,14 +1141,14 @@ static struct ipt_replace *iptables_blob(struct connman_iptables *table)
        unsigned char *entry_index;
 
        r = g_try_malloc0(sizeof(struct ipt_replace) + table->size);
-       if (r == NULL)
+       if (!r)
                return NULL;
 
        memset(r, 0, sizeof(*r) + table->size);
 
        r->counters = g_try_malloc0(sizeof(struct xt_counters)
                                * table->old_entries);
-       if (r->counters == NULL) {
+       if (!r->counters) {
                g_free(r);
                return NULL;
        }
@@ -1184,14 +1186,14 @@ static void dump_ip(struct ipt_entry *entry)
        if (strlen(ip->outiface))
                DBG("\tout %s", ip->outiface);
 
-       if (inet_ntop(AF_INET, &ip->src, ip_string, INET6_ADDRSTRLEN) != NULL &&
-                       inet_ntop(AF_INET, &ip->smsk,
-                                       ip_mask, INET6_ADDRSTRLEN) != NULL)
+       if (inet_ntop(AF_INET, &ip->src, ip_string, INET6_ADDRSTRLEN) &&
+                       inet_ntop(AF_INET, &ip->smsk, ip_mask,
+                               INET6_ADDRSTRLEN))
                DBG("\tsrc %s/%s", ip_string, ip_mask);
 
-       if (inet_ntop(AF_INET, &ip->dst, ip_string, INET6_ADDRSTRLEN) != NULL &&
-                       inet_ntop(AF_INET, &ip->dmsk,
-                                       ip_mask, INET6_ADDRSTRLEN) != NULL)
+       if (inet_ntop(AF_INET, &ip->dst, ip_string, INET6_ADDRSTRLEN) &&
+                       inet_ntop(AF_INET, &ip->dmsk, ip_mask,
+                               INET6_ADDRSTRLEN))
                DBG("\tdst %s/%s", ip_string, ip_mask);
 }
 
@@ -1237,16 +1239,16 @@ static void dump_target(struct ipt_entry *entry)
                xt_t = xtables_find_target(IPT_STANDARD_TARGET,
                                                XTF_LOAD_MUST_SUCCEED);
 
-               if(xt_t->print != NULL)
+               if (xt_t->print)
                        xt_t->print(NULL, target, 1);
        } else {
                xt_t = xtables_find_target(target->u.user.name, XTF_TRY_LOAD);
-               if (xt_t == NULL) {
+               if (!xt_t) {
                        DBG("\ttarget %s", target->u.user.name);
                        return;
                }
 
-               if(xt_t->print != NULL) {
+               if (xt_t->print) {
                        DBG("\ttarget ");
                        xt_t->print(NULL, target, 1);
                }
@@ -1270,10 +1272,10 @@ static void dump_match(struct ipt_entry *entry)
                return;
 
        xt_m = xtables_find_match(match->u.user.name, XTF_TRY_LOAD, NULL);
-       if (xt_m == NULL)
+       if (!xt_m)
                goto out;
 
-       if(xt_m->print != NULL) {
+       if (xt_m->print) {
                DBG("\tmatch ");
                xt_m->print(NULL, match, 1);
 
@@ -1378,18 +1380,29 @@ static void dump_ipt_replace(struct ipt_replace *repl)
 static int iptables_get_entries(struct connman_iptables *table)
 {
        socklen_t entry_size;
+       int err;
 
        entry_size = sizeof(struct ipt_get_entries) + table->info->size;
 
-       return getsockopt(table->ipt_sock, IPPROTO_IP, IPT_SO_GET_ENTRIES,
+       err = getsockopt(table->ipt_sock, IPPROTO_IP, IPT_SO_GET_ENTRIES,
                                table->blob_entries, &entry_size);
+       if (err < 0)
+               return -errno;
+
+       return 0;
 }
 
 static int iptables_replace(struct connman_iptables *table,
                                        struct ipt_replace *r)
 {
-       return setsockopt(table->ipt_sock, IPPROTO_IP, IPT_SO_SET_REPLACE, r,
-                        sizeof(*r) + r->size);
+       int err;
+
+       err = setsockopt(table->ipt_sock, IPPROTO_IP, IPT_SO_SET_REPLACE, r,
+                       sizeof(*r) + r->size);
+       if (err < 0)
+               return -errno;
+
+       return 0;
 }
 
 static int add_entry(struct ipt_entry *entry, int builtin, unsigned int hook,
@@ -1399,7 +1412,7 @@ static int add_entry(struct ipt_entry *entry, int builtin, unsigned int hook,
        struct ipt_entry *new_entry;
 
        new_entry = g_try_malloc0(entry->next_offset);
-       if (new_entry == NULL)
+       if (!new_entry)
                return -ENOMEM;
 
        memcpy(new_entry, entry, entry->next_offset);
@@ -1412,7 +1425,7 @@ static void table_cleanup(struct connman_iptables *table)
        GList *list;
        struct connman_iptables_entry *entry;
 
-       if (table == NULL)
+       if (!table)
                return;
 
        if (table->ipt_sock >= 0)
@@ -1444,7 +1457,7 @@ static struct connman_iptables *iptables_init(const char *table_name)
                DBG("ip_tables module loading gives error but trying anyway");
 
        module = g_strconcat("iptable_", table_name, NULL);
-       if (module == NULL)
+       if (!module)
                return NULL;
 
        if (xtables_insmod(module, NULL, TRUE) != 0)
@@ -1453,11 +1466,11 @@ static struct connman_iptables *iptables_init(const char *table_name)
        g_free(module);
 
        table = g_try_new0(struct connman_iptables, 1);
-       if (table == NULL)
+       if (!table)
                return NULL;
 
        table->info = g_try_new0(struct ipt_getinfo, 1);
-       if (table->info == NULL)
+       if (!table->info)
                goto err;
 
        table->ipt_sock = socket(AF_INET, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_RAW);
@@ -1475,7 +1488,7 @@ static struct connman_iptables *iptables_init(const char *table_name)
 
        table->blob_entries = g_try_malloc0(sizeof(struct ipt_get_entries) +
                                                table->info->size);
-       if (table->blob_entries == NULL)
+       if (!table->blob_entries)
                goto err;
 
        g_stpcpy(table->blob_entries->name, table_name);
@@ -1498,7 +1511,7 @@ static struct connman_iptables *iptables_init(const char *table_name)
                        table->info->underflow, table->blob_entries->size,
                        add_entry, table);
 
-       if (debug_enabled == TRUE)
+       if (debug_enabled)
                dump_table(table);
 
        return table;
@@ -1539,19 +1552,19 @@ static struct xtables_target *prepare_target(struct connman_iptables *table,
                                                        const char *target_name)
 {
        struct xtables_target *xt_t = NULL;
-       gboolean is_builtin, is_user_defined;
+       bool is_builtin, is_user_defined;
        GList *chain_head = NULL;
        size_t target_size;
 
-       is_builtin = FALSE;
-       is_user_defined = FALSE;
+       is_builtin = false;
+       is_user_defined = false;
 
        if (is_builtin_target(target_name))
-               is_builtin = TRUE;
+               is_builtin = true;
        else {
                chain_head = find_chain_head(table, target_name);
-               if (chain_head != NULL && chain_head->next != NULL)
-                       is_user_defined = TRUE;
+               if (chain_head && chain_head->next)
+                       is_user_defined = true;
        }
 
        if (is_builtin || is_user_defined)
@@ -1560,13 +1573,13 @@ static struct xtables_target *prepare_target(struct connman_iptables *table,
        else
                xt_t = xtables_find_target(target_name, XTF_TRY_LOAD);
 
-       if (xt_t == NULL)
+       if (!xt_t)
                return NULL;
 
        target_size = ALIGN(sizeof(struct ipt_entry_target)) + xt_t->size;
 
        xt_t->t = g_try_malloc0(target_size);
-       if (xt_t->t == NULL)
+       if (!xt_t->t)
                return NULL;
 
        xt_t->t->u.target_size = target_size;
@@ -1577,27 +1590,22 @@ static struct xtables_target *prepare_target(struct connman_iptables *table,
                target = (struct xt_standard_target *)(xt_t->t);
                g_stpcpy(target->target.u.user.name, IPT_STANDARD_TARGET);
 
-               if (is_builtin == TRUE)
+               if (is_builtin)
                        target->verdict = target_to_verdict(target_name);
-               else if (is_user_defined == TRUE) {
+               else if (is_user_defined) {
                        struct connman_iptables_entry *target_rule;
 
-                       if (chain_head == NULL) {
-                               g_free(xt_t->t);
-                               return NULL;
-                       }
-
                        target_rule = chain_head->next->data;
                        target->verdict = target_rule->offset;
                }
        } else {
                g_stpcpy(xt_t->t->u.user.name, target_name);
                xt_t->t->u.user.revision = xt_t->revision;
-               if (xt_t->init != NULL)
+               if (xt_t->init)
                        xt_t->init(xt_t->t);
        }
 
-       if (xt_t->x6_options != NULL)
+       if (xt_t->x6_options)
                iptables_globals.opts =
                        xtables_options_xfrm(
                                iptables_globals.orig_opts,
@@ -1612,7 +1620,7 @@ static struct xtables_target *prepare_target(struct connman_iptables *table,
                                xt_t->extra_opts,
                                &xt_t->option_offset);
 
-       if (iptables_globals.opts == NULL) {
+       if (!iptables_globals.opts) {
                g_free(xt_t->t);
                xt_t = NULL;
        }
@@ -1627,24 +1635,24 @@ static struct xtables_match *prepare_matches(struct connman_iptables *table,
        struct xtables_match *xt_m;
        size_t match_size;
 
-       if (match_name == NULL)
+       if (!match_name)
                return NULL;
 
        xt_m = xtables_find_match(match_name, XTF_LOAD_MUST_SUCCEED, xt_rm);
        match_size = ALIGN(sizeof(struct ipt_entry_match)) + xt_m->size;
 
        xt_m->m = g_try_malloc0(match_size);
-       if (xt_m->m == NULL)
+       if (!xt_m->m)
                return NULL;
 
        xt_m->m->u.match_size = match_size;
        g_stpcpy(xt_m->m->u.user.name, xt_m->name);
        xt_m->m->u.user.revision = xt_m->revision;
 
-       if (xt_m->init != NULL)
+       if (xt_m->init)
                xt_m->init(xt_m->m);
 
-       if (xt_m->x6_options != NULL)
+       if (xt_m->x6_options)
                iptables_globals.opts =
                        xtables_options_xfrm(
                                iptables_globals.orig_opts,
@@ -1659,7 +1667,7 @@ static struct xtables_match *prepare_matches(struct connman_iptables *table,
                                xt_m->extra_opts,
                                &xt_m->option_offset);
 
-       if (iptables_globals.opts == NULL) {
+       if (!iptables_globals.opts) {
                g_free(xt_m->m);
 
                if (xt_m == xt_m->next)
@@ -1671,7 +1679,8 @@ static struct xtables_match *prepare_matches(struct connman_iptables *table,
        return xt_m;
 }
 
-static int parse_ip_and_mask(const char *str, struct in_addr *ip, struct in_addr *mask)
+static int parse_ip_and_mask(const char *str, struct in_addr *ip,
+                               struct in_addr *mask)
 {
        char **tokens;
        uint32_t prefixlength;
@@ -1679,7 +1688,7 @@ static int parse_ip_and_mask(const char *str, struct in_addr *ip, struct in_addr
        int err;
 
        tokens = g_strsplit(str, "/", 2);
-       if (tokens == NULL)
+       if (!tokens)
                return -1;
 
        if (!inet_pton(AF_INET, tokens[0], ip)) {
@@ -1687,7 +1696,7 @@ static int parse_ip_and_mask(const char *str, struct in_addr *ip, struct in_addr
                goto out;
        }
 
-       if (tokens[1] != NULL) {
+       if (tokens[1]) {
                prefixlength = strtol(tokens[1], NULL, 10);
                if (prefixlength > 31) {
                        err = -1;
@@ -1712,15 +1721,15 @@ static struct connman_iptables *get_table(const char *table_name)
 {
        struct connman_iptables *table;
 
-       if (table_name == NULL)
+       if (!table_name)
                table_name = "filter";
 
        table = g_hash_table_lookup(table_hash, table_name);
-       if (table != NULL)
+       if (table)
                return table;
 
        table = iptables_init(table_name);
-       if (table == NULL)
+       if (!table)
                return NULL;
 
        table->name = g_strdup(table_name);
@@ -1752,7 +1761,7 @@ static int prepare_getopt_args(const char *str, struct parse_context *ctx)
 
        /* Don't forget the last NULL entry */
        ctx->argv = g_try_malloc0((ctx->argc + 1) * sizeof(char *));
-       if (ctx->argv == NULL) {
+       if (!ctx->argv) {
                g_strfreev(tokens);
                return -ENOMEM;
        }
@@ -1770,19 +1779,19 @@ static int prepare_getopt_args(const char *str, struct parse_context *ctx)
        return 0;
 }
 
-static int parse_xt_modules(int c, connman_bool_t invert,
+static int parse_xt_modules(int c, bool invert,
                                struct parse_context *ctx)
 {
        struct xtables_match *m;
        struct xtables_rule_match *rm;
 
-       for (rm = ctx->xt_rm; rm != NULL; rm = rm->next) {
+       for (rm = ctx->xt_rm; rm; rm = rm->next) {
                if (rm->completed != 0)
                        continue;
 
                m = rm->match;
 
-               if (m->x6_parse == NULL && m->parse == NULL)
+               if (!m->x6_parse && !m->parse)
                        continue;
 
                if (c < (int) m->option_offset ||
@@ -1793,10 +1802,10 @@ static int parse_xt_modules(int c, connman_bool_t invert,
                xtables_option_mpcall(c, ctx->argv, invert, m, NULL);
        }
 
-       if (ctx->xt_t == NULL)
+       if (!ctx->xt_t)
                return 0;
 
-       if (ctx->xt_t->x6_parse == NULL && ctx->xt_t->parse == NULL)
+       if (!ctx->xt_t->x6_parse && !ctx->xt_t->parse)
                return 0;
 
        if (c < (int) ctx->xt_t->option_offset ||
@@ -1813,10 +1822,10 @@ static int final_check_xt_modules(struct parse_context *ctx)
 {
        struct xtables_rule_match *rm;
 
-       for (rm = ctx->xt_rm; rm != NULL; rm = rm->next)
+       for (rm = ctx->xt_rm; rm; rm = rm->next)
                xtables_option_mfcall(rm->match);
 
-       if (ctx->xt_t != NULL)
+       if (ctx->xt_t)
                xtables_option_tfcall(ctx->xt_t);
 
        return 0;
@@ -1902,11 +1911,11 @@ static int parse_rule_spec(struct connman_iptables *table,
         *    of libxtables is found.
         */
        struct xtables_match *xt_m;
-       connman_bool_t invert = FALSE;
+       bool invert = false;
        int len, c, err;
 
        ctx->ip = g_try_new0(struct ipt_ip, 1);
-       if (ctx->ip == NULL)
+       if (!ctx->ip)
                return -ENOMEM;
 
        /*
@@ -1972,7 +1981,7 @@ static int parse_rule_spec(struct connman_iptables *table,
                case 'm':
                        /* Matches */
                        xt_m = prepare_matches(table, &ctx->xt_rm, optarg);
-                       if (xt_m == NULL) {
+                       if (!xt_m) {
                                err = -EINVAL;
                                goto out;
                        }
@@ -1982,7 +1991,7 @@ static int parse_rule_spec(struct connman_iptables *table,
                case 'j':
                        /* Target */
                        ctx->xt_t = prepare_target(table, optarg);
-                       if (ctx->xt_t == NULL) {
+                       if (!ctx->xt_t) {
                                err = -EINVAL;
                                goto out;
                        }
@@ -1990,7 +1999,7 @@ static int parse_rule_spec(struct connman_iptables *table,
                        break;
                case 1:
                        if (optarg[0] == '!' && optarg[1] == '\0') {
-                               invert = TRUE;
+                               invert = true;
 
                                /* Remove the '!' from the optarg */
                                optarg[0] = '\0';
@@ -2011,7 +2020,7 @@ static int parse_rule_spec(struct connman_iptables *table,
                        break;
                }
 
-               invert = FALSE;
+               invert = false;
        }
 
        err = final_check_xt_modules(ctx);
@@ -2033,10 +2042,10 @@ static void reset_xtables(void)
         * Clear all flags because the flags are only valid
         * for one rule.
         */
-       for (xt_m = xtables_matches; xt_m != NULL; xt_m = xt_m->next)
+       for (xt_m = xtables_matches; xt_m; xt_m = xt_m->next)
                xt_m->mflags = 0;
 
-       for (xt_t = xtables_targets; xt_t != NULL; xt_t = xt_t->next) {
+       for (xt_t = xtables_targets; xt_t; xt_t = xt_t->next) {
                xt_t->tflags = 0;
                xt_t->used = 0;
        }
@@ -2060,12 +2069,12 @@ static void cleanup_parse_context(struct parse_context *ctx)
 
        g_strfreev(ctx->argv);
        g_free(ctx->ip);
-       if (ctx->xt_t != NULL) {
+       if (ctx->xt_t) {
                g_free(ctx->xt_t->t);
                ctx->xt_t->t = NULL;
        }
 
-       for (list = ctx->xt_m; list != NULL; list = list->next) {
+       for (list = ctx->xt_m; list; list = list->next) {
                struct xtables_match *xt_m = list->data;
 
                g_free(xt_m->m);
@@ -2077,8 +2086,8 @@ static void cleanup_parse_context(struct parse_context *ctx)
        }
        g_list_free(ctx->xt_m);
 
-       for (tmp = NULL, rm = ctx->xt_rm; rm != NULL; rm = rm->next) {
-               if (tmp != NULL)
+       for (tmp = NULL, rm = ctx->xt_rm; rm; rm = rm->next) {
+               if (tmp)
                        g_free(tmp);
                tmp = rm;
        }
@@ -2094,7 +2103,7 @@ int __connman_iptables_dump(const char *table_name)
        DBG("-t %s -L", table_name);
 
        table = get_table(table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        dump_table(table);
@@ -2110,7 +2119,7 @@ int __connman_iptables_new_chain(const char *table_name,
        DBG("-t %s -N %s", table_name, chain);
 
        table = get_table(table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        return iptables_add_chain(table, chain);
@@ -2124,7 +2133,7 @@ int __connman_iptables_delete_chain(const char *table_name,
        DBG("-t %s -X %s", table_name, chain);
 
        table = get_table(table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        return iptables_delete_chain(table, chain);
@@ -2138,7 +2147,7 @@ int __connman_iptables_flush_chain(const char *table_name,
        DBG("-t %s -F %s", table_name, chain);
 
        table = get_table(table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        return iptables_flush_chain(table, chain);
@@ -2153,7 +2162,7 @@ int __connman_iptables_change_policy(const char *table_name,
        DBG("-t %s -F %s", table_name, chain);
 
        table = get_table(table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        return iptables_change_policy(table, chain, policy);
@@ -2169,7 +2178,7 @@ int __connman_iptables_append(const char *table_name,
        int err;
 
        ctx = g_try_new0(struct parse_context, 1);
-       if (ctx == NULL)
+       if (!ctx)
                return -ENOMEM;
 
        DBG("-t %s -A %s %s", table_name, chain, rule_spec);
@@ -2179,7 +2188,7 @@ int __connman_iptables_append(const char *table_name,
                goto out;
 
        table = get_table(table_name);
-       if (table == NULL) {
+       if (!table) {
                err = -EINVAL;
                goto out;
        }
@@ -2188,7 +2197,7 @@ int __connman_iptables_append(const char *table_name,
        if (err < 0)
                goto out;
 
-       if (ctx->xt_t == NULL)
+       if (!ctx->xt_t)
                target_name = NULL;
        else
                target_name = ctx->xt_t->name;
@@ -2212,7 +2221,7 @@ int __connman_iptables_insert(const char *table_name,
        int err;
 
        ctx = g_try_new0(struct parse_context, 1);
-       if (ctx == NULL)
+       if (!ctx)
                return -ENOMEM;
 
        DBG("-t %s -I %s %s", table_name, chain, rule_spec);
@@ -2222,7 +2231,7 @@ int __connman_iptables_insert(const char *table_name,
                goto out;
 
        table = get_table(table_name);
-       if (table == NULL) {
+       if (!table) {
                err = -EINVAL;
                goto out;
        }
@@ -2231,7 +2240,7 @@ int __connman_iptables_insert(const char *table_name,
        if (err < 0)
                goto out;
 
-       if (ctx->xt_t == NULL)
+       if (!ctx->xt_t)
                target_name = NULL;
        else
                target_name = ctx->xt_t->name;
@@ -2255,7 +2264,7 @@ int __connman_iptables_delete(const char *table_name,
        int err;
 
        ctx = g_try_new0(struct parse_context, 1);
-       if (ctx == NULL)
+       if (!ctx)
                return -ENOMEM;
 
        DBG("-t %s -D %s %s", table_name, chain, rule_spec);
@@ -2265,7 +2274,7 @@ int __connman_iptables_delete(const char *table_name,
                goto out;
 
        table = get_table(table_name);
-       if (table == NULL) {
+       if (!table) {
                err = -EINVAL;
                goto out;
        }
@@ -2274,7 +2283,7 @@ int __connman_iptables_delete(const char *table_name,
        if (err < 0)
                goto out;
 
-       if (ctx->xt_t == NULL)
+       if (!ctx->xt_t)
                target_name = NULL;
        else
                target_name = ctx->xt_t->name;
@@ -2298,12 +2307,12 @@ int __connman_iptables_commit(const char *table_name)
        DBG("%s", table_name);
 
        table = g_hash_table_lookup(table_hash, table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        repl = iptables_blob(table);
 
-       if (debug_enabled == TRUE)
+       if (debug_enabled)
                dump_ipt_replace(repl);
 
        err = iptables_replace(table, repl);
@@ -2312,7 +2321,7 @@ int __connman_iptables_commit(const char *table_name)
        g_free(repl);
 
        if (err < 0)
-           return err;
+               return err;
 
        g_hash_table_remove(table_hash, table_name);
 
@@ -2340,7 +2349,7 @@ static int iterate_chains_cb(struct ipt_entry *entry, int builtin,
        target = ipt_get_target(entry);
 
        if (!g_strcmp0(target->u.user.name, IPT_ERROR_TARGET))
-               (*cb)((const char*)target->data, cbd->user_data);
+               (*cb)((const char *)target->data, cbd->user_data);
        else if (builtin >= 0)
                (*cb)(hooknames[builtin], cbd->user_data);
 
@@ -2355,7 +2364,7 @@ int __connman_iptables_iterate_chains(const char *table_name,
        struct connman_iptables *table;
 
        table = get_table(table_name);
-       if (table == NULL)
+       if (!table)
                return -EINVAL;
 
        iterate_entries(table->blob_entries->entrytable,
@@ -2375,7 +2384,7 @@ int __connman_iptables_init(void)
        DBG("");
 
        if (getenv("CONNMAN_IPTABLES_DEBUG"))
-               debug_enabled = TRUE;
+               debug_enabled = true;
 
        table_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                NULL, remove_table);
diff --git a/src/ipv6pd.c b/src/ipv6pd.c
new file mode 100644 (file)
index 0000000..5ecda38
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2013  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include "connman.h"
+
+#include <gdhcp/gdhcp.h>
+
+#define DEFAULT_ROUTER_LIFETIME 180  /* secs */
+#define DEFAULT_RA_INTERVAL 120  /* secs */
+
+static int bridge_index = -1;
+static guint timer_uplink;
+static guint timer_ra;
+static char *default_interface;
+static GSList *prefixes;
+static GHashTable *timer_hash;
+static void *rs_context;
+
+static int setup_prefix_delegation(struct connman_service *service);
+static void dhcpv6_callback(struct connman_network *network,
+                       enum __connman_dhcpv6_status status, gpointer data);
+
+static int enable_ipv6_forward(bool enable)
+{
+       FILE *f;
+
+       f = fopen("/proc/sys/net/ipv6/ip_forward", "r+");
+       if (!f)
+               return -errno;
+
+       if (enable)
+               fprintf(f, "1");
+       else
+               fprintf(f, "0");
+
+       fclose(f);
+
+       return 0;
+}
+
+static gboolean send_ra(gpointer data)
+{
+       __connman_inet_ipv6_send_ra(bridge_index, NULL, prefixes,
+                                       DEFAULT_ROUTER_LIFETIME);
+
+       return TRUE;
+}
+
+static void start_ra(int ifindex, GSList *prefix)
+{
+       if (prefixes)
+               g_slist_free_full(prefixes, g_free);
+
+       prefixes = g_dhcpv6_copy_prefixes(prefix);
+
+       enable_ipv6_forward(true);
+
+       if (timer_ra > 0)
+               g_source_remove(timer_ra);
+
+       send_ra(NULL);
+
+       timer_ra = g_timeout_add_seconds(DEFAULT_RA_INTERVAL, send_ra, NULL);
+}
+
+static void stop_ra(int ifindex)
+{
+       __connman_inet_ipv6_send_ra(ifindex, NULL, prefixes, 0);
+
+       if (timer_ra > 0) {
+               g_source_remove(timer_ra);
+               timer_ra = 0;
+       }
+
+       enable_ipv6_forward(false);
+
+       if (prefixes) {
+               g_slist_free_full(prefixes, g_free);
+               prefixes = NULL;
+       }
+}
+
+static void rs_received(struct nd_router_solicit *reply,
+                       unsigned int length, void *user_data)
+{
+       GDHCPIAPrefix *prefix;
+       GSList *list;
+
+       if (!prefixes)
+               return;
+
+       DBG("");
+
+       for (list = prefixes; list; list = list->next) {
+               prefix = list->data;
+
+               prefix->valid -= time(NULL) - prefix->expire;
+               prefix->preferred -= time(NULL) - prefix->expire;
+       }
+
+       __connman_inet_ipv6_send_ra(bridge_index, NULL, prefixes,
+                                       DEFAULT_ROUTER_LIFETIME);
+}
+
+static gboolean do_setup(gpointer data)
+{
+       int ret;
+
+       timer_uplink = 0;
+
+       if (!default_interface)
+               DBG("No uplink connection, retrying prefix delegation");
+
+       ret = setup_prefix_delegation(__connman_service_get_default());
+       if (ret < 0 && ret != -EINPROGRESS)
+               return TRUE; /* delegation error, try again */
+
+       return FALSE;
+}
+
+static void dhcpv6_renew_callback(struct connman_network *network,
+                               enum __connman_dhcpv6_status status,
+                               gpointer data)
+{
+       DBG("network %p status %d data %p", network, status, data);
+
+       if (status == CONNMAN_DHCPV6_STATUS_SUCCEED)
+               dhcpv6_callback(network, status, data);
+       else
+               setup_prefix_delegation(__connman_service_get_default());
+}
+
+static void cleanup(void)
+{
+       if (timer_uplink != 0) {
+               g_source_remove(timer_uplink);
+               timer_uplink = 0;
+       }
+
+       g_hash_table_destroy(timer_hash);
+       timer_hash = NULL;
+
+       if (prefixes) {
+               g_slist_free_full(prefixes, g_free);
+               prefixes = NULL;
+       }
+}
+
+static void dhcpv6_callback(struct connman_network *network,
+                       enum __connman_dhcpv6_status status, gpointer data)
+{
+       GSList *prefix_list = data;
+
+       DBG("network %p status %d data %p", network, status, data);
+
+       if (status == CONNMAN_DHCPV6_STATUS_FAIL) {
+               DBG("Prefix delegation request failed");
+               cleanup();
+               return;
+       }
+
+       if (!prefix_list) {
+               DBG("No prefixes, retrying");
+               if (timer_uplink == 0)
+                       timer_uplink = g_timeout_add_seconds(10, do_setup,
+                                                                       NULL);
+               return;
+       }
+
+       /*
+        * After we have got a list of prefixes, we can start to send router
+        * advertisements (RA) to tethering interface.
+        */
+       start_ra(bridge_index, prefix_list);
+
+       if (__connman_dhcpv6_start_pd_renew(network,
+                                       dhcpv6_renew_callback) == -ETIMEDOUT)
+               dhcpv6_renew_callback(network, CONNMAN_DHCPV6_STATUS_FAIL,
+                                                                       NULL);
+}
+
+static int setup_prefix_delegation(struct connman_service *service)
+{
+       struct connman_ipconfig *ipconfig;
+       char *interface;
+       int err = 0, ifindex;
+
+       if (!service) {
+               /*
+                * We do not have uplink connection. We just wait until
+                * default interface is updated.
+                */
+               return -EINPROGRESS;
+       }
+
+       interface = connman_service_get_interface(service);
+
+       DBG("interface %s bridge_index %d", interface, bridge_index);
+
+       if (default_interface) {
+               stop_ra(bridge_index);
+
+               ifindex = connman_inet_ifindex(default_interface);
+               __connman_dhcpv6_stop_pd(ifindex);
+       }
+
+       g_free(default_interface);
+
+       ipconfig = __connman_service_get_ip6config(service);
+       if (!__connman_ipconfig_ipv6_is_enabled(ipconfig)) {
+               g_free(interface);
+               default_interface = NULL;
+               return -EPFNOSUPPORT;
+       }
+
+       default_interface = interface;
+
+       if (default_interface) {
+               ifindex = connman_inet_ifindex(default_interface);
+
+               /*
+                * Try to get a IPv6 prefix so we can start to advertise it.
+                */
+               err = __connman_dhcpv6_start_pd(ifindex, prefixes,
+                                               dhcpv6_callback);
+               if (err < 0)
+                       DBG("prefix delegation %d/%s", err, strerror(-err));
+       }
+
+       return err;
+}
+
+static void cleanup_timer(gpointer user_data)
+{
+       guint timer = GPOINTER_TO_UINT(user_data);
+
+       g_source_remove(timer);
+}
+
+static void update_default_interface(struct connman_service *service)
+{
+       setup_prefix_delegation(service);
+}
+
+static void update_ipconfig(struct connman_service *service,
+                               struct connman_ipconfig *ipconfig)
+{
+       if (!service || service != __connman_service_get_default())
+               return;
+
+       if (ipconfig != __connman_service_get_ip6config(service))
+               return;
+
+       if (!__connman_ipconfig_ipv6_is_enabled(ipconfig)) {
+               if (default_interface) {
+                       int ifindex;
+
+                       ifindex = connman_inet_ifindex(default_interface);
+                       __connman_dhcpv6_stop_pd(ifindex);
+
+                       g_free(default_interface);
+                       default_interface = NULL;
+               }
+
+               DBG("No IPv6 support for interface index %d",
+                       __connman_ipconfig_get_index(ipconfig));
+               return;
+       }
+
+       /*
+        * Did we had PD activated already? If not, then start it.
+        */
+       if (!default_interface) {
+               DBG("IPv6 ipconfig %p changed for interface index %d", ipconfig,
+                       __connman_ipconfig_get_index(ipconfig));
+
+               setup_prefix_delegation(service);
+       }
+}
+
+static struct connman_notifier pd_notifier = {
+       .name                   = "IPv6 prefix delegation",
+       .default_changed        = update_default_interface,
+       .ipconfig_changed       = update_ipconfig,
+};
+
+int __connman_ipv6pd_setup(const char *bridge)
+{
+       struct connman_service *service;
+       int err;
+
+       if (!connman_inet_is_ipv6_supported())
+               return -EPFNOSUPPORT;
+
+       if (bridge_index >= 0) {
+               DBG("Prefix delegation already running");
+               return -EALREADY;
+       }
+
+       err = connman_notifier_register(&pd_notifier);
+       if (err < 0)
+               return err;
+
+       bridge_index = connman_inet_ifindex(bridge);
+
+       timer_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+                                               NULL, cleanup_timer);
+
+       err = __connman_inet_ipv6_start_recv_rs(bridge_index, rs_received,
+                                               NULL, &rs_context);
+       if (err < 0)
+               DBG("Cannot receive router solicitation %d/%s",
+                       err, strerror(-err));
+
+       service = __connman_service_get_default();
+       if (service) {
+               /*
+                * We have an uplink connection already, try to use it.
+                */
+               return setup_prefix_delegation(service);
+       }
+
+       /*
+        * The prefix delegation is started after have got the uplink
+        * connection up i.e., when the default service is setup in which
+        * case the update_default_interface() will be called.
+        */
+       return -EINPROGRESS;
+}
+
+void __connman_ipv6pd_cleanup(void)
+{
+       int ifindex;
+
+       if (!connman_inet_is_ipv6_supported())
+               return;
+
+       connman_notifier_unregister(&pd_notifier);
+
+       __connman_inet_ipv6_stop_recv_rs(rs_context);
+       rs_context = NULL;
+
+       cleanup();
+
+       stop_ra(bridge_index);
+
+       if (default_interface) {
+               ifindex = connman_inet_ifindex(default_interface);
+               __connman_dhcpv6_stop_pd(ifindex);
+               g_free(default_interface);
+               default_interface = NULL;
+       }
+
+       bridge_index = -1;
+}
index 4e305a9..a693bd0 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -119,7 +119,7 @@ static void print_backtrace(unsigned int offset)
        int pathlen;
        pid_t pid;
 
-       if (program_exec == NULL)
+       if (!program_exec)
                return;
 
        pathlen = strlen(program_path);
@@ -179,7 +179,7 @@ static void print_backtrace(unsigned int offset)
                if (written < 0)
                        break;
 
-               len = read(infd[0], buf, sizeof(buf));
+               len = read(infd[0], buf, sizeof(buf) - 1);
                if (len < 0)
                        break;
 
@@ -243,23 +243,23 @@ extern struct connman_debug_desc __stop___debug[];
 
 static gchar **enabled = NULL;
 
-static connman_bool_t is_enabled(struct connman_debug_desc *desc)
+static bool is_enabled(struct connman_debug_desc *desc)
 {
        int i;
 
-       if (enabled == NULL)
-               return FALSE;
+       if (!enabled)
+               return false;
 
-       for (i = 0; enabled[i] != NULL; i++) {
-               if (desc->name != NULL && g_pattern_match_simple(enabled[i],
-                                                       desc->name) == TRUE)
-                       return TRUE;
-               if (desc->file != NULL && g_pattern_match_simple(enabled[i],
-                                                       desc->file) == TRUE)
-                       return TRUE;
+       for (i = 0; enabled[i]; i++) {
+               if (desc->name && g_pattern_match_simple(enabled[i],
+                                                       desc->name))
+                       return true;
+               if (desc->file && g_pattern_match_simple(enabled[i],
+                                                       desc->file))
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 void __connman_log_enable(struct connman_debug_desc *start,
@@ -268,7 +268,7 @@ void __connman_log_enable(struct connman_debug_desc *start,
        struct connman_debug_desc *desc;
        const char *name = NULL, *file = NULL;
 
-       if (start == NULL || stop == NULL)
+       if (!start || !stop)
                return;
 
        for (desc = start; desc < stop; desc++) {
@@ -278,21 +278,21 @@ void __connman_log_enable(struct connman_debug_desc *start,
                        continue;
                }
 
-               if (file != NULL || name != NULL) {
+               if (file || name) {
                        if (g_strcmp0(desc->file, file) == 0) {
-                               if (desc->name == NULL)
+                               if (!desc->name)
                                        desc->name = name;
                        } else
                                file = NULL;
                }
 
-               if (is_enabled(desc) == TRUE)
+               if (is_enabled(desc))
                        desc->flags |= CONNMAN_DEBUG_FLAG_PRINT;
        }
 }
 
 int __connman_log_init(const char *program, const char *debug,
-               connman_bool_t detach, connman_bool_t backtrace,
+               gboolean detach, gboolean backtrace,
                const char *program_name, const char *program_version)
 {
        static char path[PATH_MAX];
@@ -301,15 +301,15 @@ int __connman_log_init(const char *program, const char *debug,
        program_exec = program;
        program_path = getcwd(path, sizeof(path));
 
-       if (debug != NULL)
+       if (debug)
                enabled = g_strsplit_set(debug, ":, ", 0);
 
        __connman_log_enable(__start___debug, __stop___debug);
 
-       if (detach == FALSE)
+       if (!detach)
                option |= LOG_PERROR;
 
-       if (backtrace == TRUE)
+       if (backtrace)
                signal_setup(signal_handler);
 
        openlog(basename(program), option, LOG_DAEMON);
@@ -319,13 +319,13 @@ int __connman_log_init(const char *program, const char *debug,
        return 0;
 }
 
-void __connman_log_cleanup(connman_bool_t backtrace)
+void __connman_log_cleanup(gboolean backtrace)
 {
        syslog(LOG_INFO, "Exit");
 
        closelog();
 
-       if (backtrace == TRUE)
+       if (backtrace)
                signal_setup(SIG_DFL);
 
        g_strfreev(enabled);
index c257ca0..4f635de 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -39,8 +39,8 @@
 
 #include "connman.h"
 
-#define DEFAULT_INPUT_REQUEST_TIMEOUT 120 * 1000
-#define DEFAULT_BROWSER_LAUNCH_TIMEOUT 300 * 1000
+#define DEFAULT_INPUT_REQUEST_TIMEOUT (120 * 1000)
+#define DEFAULT_BROWSER_LAUNCH_TIMEOUT (300 * 1000)
 
 #define MAINFILE "main.conf"
 #define CONFIGMAINFILE CONFIGDIR "/" MAINFILE
@@ -56,11 +56,12 @@ static char *default_blacklist[] = {
        "vmnet",
        "vboxnet",
        "virbr",
+       "ifb",
        NULL
 };
 
 static struct {
-       connman_bool_t bg_scan;
+       bool bg_scan;
        char **pref_timeservers;
        unsigned int *auto_connect;
        unsigned int *preferred_techs;
@@ -68,12 +69,12 @@ static struct {
        unsigned int timeout_inputreq;
        unsigned int timeout_browserlaunch;
        char **blacklisted_interfaces;
-       connman_bool_t allow_hostname_updates;
-       connman_bool_t single_tech;
+       bool allow_hostname_updates;
+       bool single_tech;
        char **tethering_technologies;
-       connman_bool_t persistent_tethering_mode;
+       bool persistent_tethering_mode;
 } connman_settings  = {
-       .bg_scan = TRUE,
+       .bg_scan = true,
        .pref_timeservers = NULL,
        .auto_connect = NULL,
        .preferred_techs = NULL,
@@ -81,10 +82,10 @@ static struct {
        .timeout_inputreq = DEFAULT_INPUT_REQUEST_TIMEOUT,
        .timeout_browserlaunch = DEFAULT_BROWSER_LAUNCH_TIMEOUT,
        .blacklisted_interfaces = NULL,
-       .allow_hostname_updates = TRUE,
-       .single_tech = FALSE,
+       .allow_hostname_updates = true,
+       .single_tech = false,
        .tethering_technologies = NULL,
-       .persistent_tethering_mode = FALSE,
+       .persistent_tethering_mode = false,
 };
 
 #define CONF_BG_SCAN                    "BackgroundScanning"
@@ -146,13 +147,12 @@ static uint *parse_service_types(char **str_list, gsize len)
        enum connman_service_type type;
 
        type_list = g_try_new0(unsigned int, len + 1);
-       if (type_list == NULL)
+       if (!type_list)
                return NULL;
 
        i = 0;
        j = 0;
-       while (str_list[i] != NULL)
-       {
+       while (str_list[i]) {
                type = __connman_service_string2type(str_list[i]);
 
                if (type != CONNMAN_SERVICE_TYPE_UNKNOWN) {
@@ -162,6 +162,8 @@ static uint *parse_service_types(char **str_list, gsize len)
                i += 1;
        }
 
+       type_list[j] = CONNMAN_SERVICE_TYPE_UNKNOWN;
+
        return type_list;
 }
 
@@ -171,12 +173,12 @@ static char **parse_fallback_nameservers(char **nameservers, gsize len)
        int i, j;
 
        servers = g_try_new0(char *, len + 1);
-       if (servers == NULL)
+       if (!servers)
                return NULL;
 
        i = 0;
        j = 0;
-       while (nameservers[i] != NULL) {
+       while (nameservers[i]) {
                if (connman_inet_check_ipaddress(nameservers[i]) > 0) {
                        servers[j] = g_strdup(nameservers[i]);
                        j += 1;
@@ -192,12 +194,12 @@ static void check_config(GKeyFile *config)
        char **keys;
        int j;
 
-       if (config == NULL)
+       if (!config)
                return;
 
        keys = g_key_file_get_groups(config, NULL);
 
-       for (j = 0; keys != NULL && keys[j] != NULL; j++) {
+       for (j = 0; keys && keys[j]; j++) {
                if (g_strcmp0(keys[j], "General") != 0)
                        connman_warn("Unknown group %s in %s",
                                                keys[j], MAINFILE);
@@ -207,18 +209,18 @@ static void check_config(GKeyFile *config)
 
        keys = g_key_file_get_keys(config, "General", NULL, NULL);
 
-       for (j = 0; keys != NULL && keys[j] != NULL; j++) {
-               connman_bool_t found;
+       for (j = 0; keys && keys[j]; j++) {
+               bool found;
                int i;
 
-               found = FALSE;
-               for (i = 0; supported_options[i] != NULL; i++) {
+               found = false;
+               for (i = 0; supported_options[i]; i++) {
                        if (g_strcmp0(keys[j], supported_options[i]) == 0) {
-                               found = TRUE;
+                               found = true;
                                break;
                        }
                }
-               if (found == FALSE && supported_options[i] == NULL)
+               if (!found && !supported_options[i])
                        connman_warn("Unknown option %s in %s",
                                                keys[j], MAINFILE);
        }
@@ -229,7 +231,7 @@ static void check_config(GKeyFile *config)
 static void parse_config(GKeyFile *config)
 {
        GError *error = NULL;
-       gboolean boolean;
+       bool boolean;
        char **timeservers;
        char **interfaces;
        char **str_list;
@@ -237,7 +239,7 @@ static void parse_config(GKeyFile *config)
        gsize len;
        int timeout;
 
-       if (config == NULL) {
+       if (!config) {
                connman_settings.auto_connect =
                        parse_service_types(default_auto_connect, 3);
                connman_settings.blacklisted_interfaces =
@@ -249,22 +251,22 @@ static void parse_config(GKeyFile *config)
 
        boolean = g_key_file_get_boolean(config, "General",
                                                CONF_BG_SCAN, &error);
-       if (error == NULL)
+       if (!error)
                connman_settings.bg_scan = boolean;
 
        g_clear_error(&error);
 
-       timeservers = g_key_file_get_string_list(config, "General",
+       timeservers = __connman_config_get_string_list(config, "General",
                                        CONF_PREF_TIMESERVERS, NULL, &error);
-       if (error == NULL)
+       if (!error)
                connman_settings.pref_timeservers = timeservers;
 
        g_clear_error(&error);
 
-       str_list = g_key_file_get_string_list(config, "General",
+       str_list = __connman_config_get_string_list(config, "General",
                        CONF_AUTO_CONNECT, &len, &error);
 
-       if (error == NULL)
+       if (!error)
                connman_settings.auto_connect =
                        parse_service_types(str_list, len);
        else
@@ -275,10 +277,10 @@ static void parse_config(GKeyFile *config)
 
        g_clear_error(&error);
 
-       str_list = g_key_file_get_string_list(config, "General",
+       str_list = __connman_config_get_string_list(config, "General",
                        CONF_PREFERRED_TECHS, &len, &error);
 
-       if (error == NULL)
+       if (!error)
                connman_settings.preferred_techs =
                        parse_service_types(str_list, len);
 
@@ -286,10 +288,10 @@ static void parse_config(GKeyFile *config)
 
        g_clear_error(&error);
 
-       str_list = g_key_file_get_string_list(config, "General",
+       str_list = __connman_config_get_string_list(config, "General",
                        CONF_FALLBACK_NAMESERVERS, &len, &error);
 
-       if (error == NULL)
+       if (!error)
                connman_settings.fallback_nameservers =
                        parse_fallback_nameservers(str_list, len);
 
@@ -299,22 +301,22 @@ static void parse_config(GKeyFile *config)
 
        timeout = g_key_file_get_integer(config, "General",
                        CONF_TIMEOUT_INPUTREQ, &error);
-       if (error == NULL && timeout >= 0)
+       if (!error && timeout >= 0)
                connman_settings.timeout_inputreq = timeout * 1000;
 
        g_clear_error(&error);
 
        timeout = g_key_file_get_integer(config, "General",
                        CONF_TIMEOUT_BROWSERLAUNCH, &error);
-       if (error == NULL && timeout >= 0)
+       if (!error && timeout >= 0)
                connman_settings.timeout_browserlaunch = timeout * 1000;
 
        g_clear_error(&error);
 
-       interfaces = g_key_file_get_string_list(config, "General",
+       interfaces = __connman_config_get_string_list(config, "General",
                        CONF_BLACKLISTED_INTERFACES, &len, &error);
 
-       if (error == NULL)
+       if (!error)
                connman_settings.blacklisted_interfaces = interfaces;
        else
                connman_settings.blacklisted_interfaces =
@@ -322,33 +324,33 @@ static void parse_config(GKeyFile *config)
 
        g_clear_error(&error);
 
-       boolean = g_key_file_get_boolean(config, "General",
+       boolean = __connman_config_get_bool(config, "General",
                                        CONF_ALLOW_HOSTNAME_UPDATES,
                                        &error);
-       if (error == NULL)
+       if (!error)
                connman_settings.allow_hostname_updates = boolean;
 
        g_clear_error(&error);
 
-       boolean = g_key_file_get_boolean(config, "General",
+       boolean = __connman_config_get_bool(config, "General",
                        CONF_SINGLE_TECH, &error);
-       if (error == NULL)
+       if (!error)
                connman_settings.single_tech = boolean;
 
        g_clear_error(&error);
 
-       tethering = g_key_file_get_string_list(config, "General",
+       tethering = __connman_config_get_string_list(config, "General",
                        CONF_TETHERING_TECHNOLOGIES, &len, &error);
 
-       if (error == NULL)
+       if (!error)
                connman_settings.tethering_technologies = tethering;
 
        g_clear_error(&error);
 
-       boolean = g_key_file_get_boolean(config, "General",
+       boolean = __connman_config_get_bool(config, "General",
                                        CONF_PERSISTENT_TETHERING_MODE,
                                        &error);
-       if (error == NULL)
+       if (!error)
                connman_settings.persistent_tethering_mode = boolean;
 
        g_clear_error(&error);
@@ -361,7 +363,7 @@ static int config_init(const char *file)
        config = load_config(file);
        check_config(config);
        parse_config(config);
-       if (config != NULL)
+       if (config)
                g_key_file_free(config);
 
        return 0;
@@ -458,7 +460,7 @@ static gboolean option_dnsproxy = TRUE;
 static gboolean option_backtrace = TRUE;
 static gboolean option_version = FALSE;
 
-static gboolean parse_debug(const char *key, const char *value,
+static bool parse_debug(const char *key, const char *value,
                                        gpointer user_data, GError **error)
 {
        if (value)
@@ -466,7 +468,7 @@ static gboolean parse_debug(const char *key, const char *value,
        else
                option_debug = g_strdup("*");
 
-       return TRUE;
+       return true;
 }
 
 static GOptionEntry options[] = {
@@ -503,7 +505,7 @@ static GOptionEntry options[] = {
 const char *connman_option_get_string(const char *key)
 {
        if (g_strcmp0(key, "wifi") == 0) {
-               if (option_wifi == NULL)
+               if (!option_wifi)
                        return "nl80211,wext";
                else
                        return option_wifi;
@@ -512,35 +514,35 @@ const char *connman_option_get_string(const char *key)
        return NULL;
 }
 
-connman_bool_t connman_setting_get_bool(const char *key)
+bool connman_setting_get_bool(const char *key)
 {
-       if (g_str_equal(key, CONF_BG_SCAN) == TRUE)
+       if (g_str_equal(key, CONF_BG_SCAN))
                return connman_settings.bg_scan;
 
-       if (g_str_equal(key, CONF_ALLOW_HOSTNAME_UPDATES) == TRUE)
+       if (g_str_equal(key, CONF_ALLOW_HOSTNAME_UPDATES))
                return connman_settings.allow_hostname_updates;
 
-       if (g_str_equal(key, CONF_SINGLE_TECH) == TRUE)
+       if (g_str_equal(key, CONF_SINGLE_TECH))
                return connman_settings.single_tech;
 
-       if (g_str_equal(key, CONF_PERSISTENT_TETHERING_MODE) == TRUE)
+       if (g_str_equal(key, CONF_PERSISTENT_TETHERING_MODE))
                return connman_settings.persistent_tethering_mode;
 
-       return FALSE;
+       return false;
 }
 
 char **connman_setting_get_string_list(const char *key)
 {
-       if (g_str_equal(key, CONF_PREF_TIMESERVERS) == TRUE)
+       if (g_str_equal(key, CONF_PREF_TIMESERVERS))
                return connman_settings.pref_timeservers;
 
-       if (g_str_equal(key, CONF_FALLBACK_NAMESERVERS) == TRUE)
+       if (g_str_equal(key, CONF_FALLBACK_NAMESERVERS))
                return connman_settings.fallback_nameservers;
 
-       if (g_str_equal(key, CONF_BLACKLISTED_INTERFACES) == TRUE)
+       if (g_str_equal(key, CONF_BLACKLISTED_INTERFACES))
                return connman_settings.blacklisted_interfaces;
 
-       if (g_str_equal(key, CONF_TETHERING_TECHNOLOGIES) == TRUE)
+       if (g_str_equal(key, CONF_TETHERING_TECHNOLOGIES))
                return connman_settings.tethering_technologies;
 
        return NULL;
@@ -548,20 +550,22 @@ char **connman_setting_get_string_list(const char *key)
 
 unsigned int *connman_setting_get_uint_list(const char *key)
 {
-       if (g_str_equal(key, CONF_AUTO_CONNECT) == TRUE)
+       if (g_str_equal(key, CONF_AUTO_CONNECT))
                return connman_settings.auto_connect;
 
-       if (g_str_equal(key, CONF_PREFERRED_TECHS) == TRUE)
+       if (g_str_equal(key, CONF_PREFERRED_TECHS))
                return connman_settings.preferred_techs;
 
        return NULL;
 }
 
-unsigned int connman_timeout_input_request(void) {
+unsigned int connman_timeout_input_request(void)
+{
        return connman_settings.timeout_inputreq;
 }
 
-unsigned int connman_timeout_browser_launch(void) {
+unsigned int connman_timeout_browser_launch(void)
+{
        return connman_settings.timeout_browserlaunch;
 }
 
@@ -573,16 +577,11 @@ int main(int argc, char *argv[])
        DBusError err;
        guint signal;
 
-#ifdef NEED_THREADS
-       if (g_thread_supported() == FALSE)
-               g_thread_init(NULL);
-#endif
-
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -592,24 +591,18 @@ int main(int argc, char *argv[])
 
        g_option_context_free(context);
 
-       if (option_version == TRUE) {
+       if (option_version) {
                printf("%s\n", VERSION);
                exit(0);
        }
 
-       if (option_detach == TRUE) {
+       if (option_detach) {
                if (daemon(0, 0)) {
                        perror("Can't start daemon");
                        exit(1);
                }
        }
 
-       if (mkdir(STATEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
-                               S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
-               if (errno != EEXIST)
-                       perror("Failed to create state directory");
-       }
-
        if (mkdir(STORAGEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
                                S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
                if (errno != EEXIST)
@@ -620,20 +613,13 @@ int main(int argc, char *argv[])
 
        main_loop = g_main_loop_new(NULL, FALSE);
 
-#ifdef NEED_THREADS
-       if (dbus_threads_init_default() == FALSE) {
-               fprintf(stderr, "Can't init usage of threads\n");
-               exit(1);
-       }
-#endif
-
        signal = setup_signalfd();
 
        dbus_error_init(&err);
 
        conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, CONNMAN_SERVICE, &err);
-       if (conn == NULL) {
-               if (dbus_error_is_set(&err) == TRUE) {
+       if (!conn) {
+               if (dbus_error_is_set(&err)) {
                        fprintf(stderr, "%s\n", err.message);
                        dbus_error_free(&err);
                } else
@@ -648,7 +634,7 @@ int main(int argc, char *argv[])
 
        __connman_dbus_init(conn);
 
-       if (option_config == NULL)
+       if (!option_config)
                config_init(CONFIGMAINFILE);
        else
                config_init(option_config);
@@ -658,8 +644,10 @@ int main(int argc, char *argv[])
        __connman_notifier_init();
        __connman_agent_init();
        __connman_service_init();
+       __connman_peer_init();
        __connman_provider_init();
        __connman_network_init();
+       __connman_config_init();
        __connman_device_init(option_device, option_nodevice);
 
        __connman_ippool_init();
@@ -669,7 +657,6 @@ int main(int argc, char *argv[])
        __connman_tethering_init();
        __connman_counter_init();
        __connman_manager_init();
-       __connman_config_init();
        __connman_stats_init();
        __connman_clock_init();
 
@@ -706,7 +693,6 @@ int main(int argc, char *argv[])
        __connman_wispr_cleanup();
        __connman_wpad_cleanup();
        __connman_dhcpv6_cleanup();
-       __connman_dhcp_cleanup();
        __connman_session_cleanup();
        __connman_plugin_cleanup();
        __connman_provider_cleanup();
@@ -730,7 +716,9 @@ int main(int argc, char *argv[])
        __connman_ippool_cleanup();
        __connman_device_cleanup();
        __connman_network_cleanup();
+       __connman_dhcp_cleanup();
        __connman_service_cleanup();
+       __connman_peer_cleanup();
        __connman_agent_cleanup();
        __connman_ipconfig_cleanup();
        __connman_notifier_cleanup();
@@ -745,7 +733,7 @@ int main(int argc, char *argv[])
 
        g_main_loop_unref(main_loop);
 
-       if (connman_settings.pref_timeservers != NULL)
+       if (connman_settings.pref_timeservers)
                g_strfreev(connman_settings.pref_timeservers);
 
        g_free(connman_settings.auto_connect);
index b8b3239..93c7a50 100644 (file)
@@ -27,8 +27,8 @@
 # domain names, IPv4 and IPv6 addresses.
 # FallbackTimeservers =
 
-# List of fallback nameservers separated by "," appended
-# to the list of nameservers given by the service. The
+# List of fallback nameservers separated by "," used if no
+# nameservers are otherwise provided by the service. The
 # nameserver entries must be in numeric format, host
 # names are ignored.
 # FallbackNameservers =
@@ -57,8 +57,8 @@
 # Found interfaces will be compared to the list and will
 # not be handled by connman, if their first characters
 # match any of the list entries. Default value is
-# vmnet,vboxnet,virbr.
-# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr
+# vmnet,vboxnet,virbr,ifb.
+# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb
 
 # Allow connman to change the system hostname. This can
 # happen for example if we receive DHCP hostname option.
index e56f2e1..b31ab4c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
 
 #include "connman.h"
 
-static connman_bool_t connman_state_idle;
-static DBusMessage *session_mode_pending = NULL;
+static bool connman_state_idle;
+static dbus_bool_t sessionmode;
 
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
        DBusMessage *reply;
        DBusMessageIter array, dict;
-       connman_bool_t offlinemode, sessionmode;
+       dbus_bool_t offlinemode;
        const char *str;
 
        DBG("conn %p", conn);
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_iter_init_append(reply, &array);
@@ -60,7 +60,6 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_append_basic(&dict, "OfflineMode",
                                        DBUS_TYPE_BOOLEAN, &offlinemode);
 
-       sessionmode = __connman_session_mode();
        connman_dbus_dict_append_basic(&dict, "SessionMode",
                                        DBUS_TYPE_BOOLEAN,
                                        &sessionmode);
@@ -79,7 +78,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -95,8 +94,8 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        type = dbus_message_iter_get_arg_type(&value);
 
-       if (g_str_equal(name, "OfflineMode") == TRUE) {
-               connman_bool_t offlinemode;
+       if (g_str_equal(name, "OfflineMode")) {
+               dbus_bool_t offlinemode;
 
                if (type != DBUS_TYPE_BOOLEAN)
                        return __connman_error_invalid_arguments(msg);
@@ -104,24 +103,13 @@ static DBusMessage *set_property(DBusConnection *conn,
                dbus_message_iter_get_basic(&value, &offlinemode);
 
                __connman_technology_set_offlinemode(offlinemode);
-       } else if (g_str_equal(name, "SessionMode") == TRUE) {
-               connman_bool_t sessionmode;
+       } else if (g_str_equal(name, "SessionMode")) {
 
                if (type != DBUS_TYPE_BOOLEAN)
                        return __connman_error_invalid_arguments(msg);
 
                dbus_message_iter_get_basic(&value, &sessionmode);
 
-               if (session_mode_pending != NULL)
-                       return __connman_error_in_progress(msg);
-
-               __connman_session_set_mode(sessionmode);
-
-               if (sessionmode == TRUE && connman_state_idle == FALSE) {
-                       session_mode_pending = dbus_message_ref(msg);
-                       return NULL;
-               }
-
        } else
                return __connman_error_invalid_property(msg);
 
@@ -141,7 +129,7 @@ static DBusMessage *get_technologies(DBusConnection *conn,
        DBG("");
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        __connman_dbus_append_objpath_dict_array(reply,
@@ -170,28 +158,15 @@ static DBusMessage *remove_provider(DBusConnection *conn,
 
 static DBusConnection *connection = NULL;
 
-static void session_mode_notify(void)
-{
-       DBusMessage *reply;
-
-       reply = g_dbus_create_reply(session_mode_pending, DBUS_TYPE_INVALID);
-       g_dbus_send_message(connection, reply);
-
-       dbus_message_unref(session_mode_pending);
-       session_mode_pending = NULL;
-}
-
-static void idle_state(connman_bool_t idle)
+static void idle_state(bool idle)
 {
 
        DBG("idle %d", idle);
 
        connman_state_idle = idle;
 
-       if (connman_state_idle == FALSE || session_mode_pending == NULL)
+       if (!connman_state_idle)
                return;
-
-       session_mode_notify();
 }
 
 static struct connman_notifier technology_notifier = {
@@ -211,7 +186,7 @@ static DBusMessage *get_services(DBusConnection *conn,
        DBusMessage *reply;
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        __connman_dbus_append_objpath_dict_array(reply,
@@ -220,6 +195,25 @@ static DBusMessage *get_services(DBusConnection *conn,
        return reply;
 }
 
+static void append_peer_structs(DBusMessageIter *iter, void *user_data)
+{
+       __connman_peer_list_struct(iter);
+}
+
+static DBusMessage *get_peers(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       DBusMessage *reply;
+
+       reply = dbus_message_new_method_return(msg);
+       if (!reply)
+               return NULL;
+
+       __connman_dbus_append_objpath_dict_array(reply,
+                                       append_peer_structs, NULL);
+       return reply;
+}
+
 static DBusMessage *connect_provider(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
@@ -227,13 +221,6 @@ static DBusMessage *connect_provider(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
-       if (__connman_session_mode() == TRUE) {
-               connman_info("Session mode enabled: "
-                               "direct provider connect disabled");
-
-               return __connman_error_failed(msg, EINVAL);
-       }
-
        err = __connman_provider_create_and_connect(msg);
        if (err < 0)
                return __connman_error_failed(msg, -err);
@@ -409,6 +396,9 @@ static const GDBusMethodTable manager_methods[] = {
        { GDBUS_METHOD("GetServices",
                        NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }),
                        get_services) },
+       { GDBUS_METHOD("GetPeers",
+                       NULL, GDBUS_ARGS({ "peers", "a(oa{sv})" }),
+                       get_peers) },
        { GDBUS_DEPRECATED_ASYNC_METHOD("ConnectProvider",
                              GDBUS_ARGS({ "provider", "a{sv}" }),
                              GDBUS_ARGS({ "path", "o" }),
@@ -456,6 +446,9 @@ static const GDBusSignalTable manager_signals[] = {
        { GDBUS_SIGNAL("ServicesChanged",
                        GDBUS_ARGS({ "changed", "a(oa{sv})" },
                                        { "removed", "ao" })) },
+       { GDBUS_SIGNAL("PeersChanged",
+                       GDBUS_ARGS({ "changed", "a(oa{sv})" },
+                                       { "removed", "ao" })) },
        { },
 };
 
@@ -464,7 +457,7 @@ int __connman_manager_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        if (connman_notifier_register(&technology_notifier) < 0)
@@ -475,7 +468,7 @@ int __connman_manager_init(void)
                                        manager_methods,
                                        manager_signals, NULL, NULL, NULL);
 
-       connman_state_idle = TRUE;
+       connman_state_idle = true;
 
        return 0;
 }
@@ -484,12 +477,9 @@ void __connman_manager_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
-       if (session_mode_pending != NULL)
-               dbus_message_unref(session_mode_pending);
-
        connman_notifier_unregister(&technology_notifier);
 
        g_dbus_unregister_interface(connection, CONNMAN_MANAGER_PATH,
index 5447eb7..4d23550 100644 (file)
--- a/src/nat.c
+++ b/src/nat.c
@@ -35,19 +35,20 @@ static GHashTable *nat_hash;
 struct connman_nat {
        char *address;
        unsigned char prefixlen;
+       struct firewall_context *fw;
 
        char *interface;
 };
 
-static int enable_ip_forward(connman_bool_t enable)
+static int enable_ip_forward(bool enable)
 {
        FILE *f;
 
        f = fopen("/proc/sys/net/ipv4/ip_forward", "r+");
-       if (f == NULL)
+       if (!f)
                return -errno;
 
-       if (enable == TRUE)
+       if (enable)
                fprintf(f, "1");
        else
                fprintf(f, "0");
@@ -65,7 +66,7 @@ static int enable_nat(struct connman_nat *nat)
        g_free(nat->interface);
        nat->interface = g_strdup(default_interface);
 
-       if (nat->interface == NULL)
+       if (!nat->interface)
                return 0;
 
        /* Enable masquerading */
@@ -73,33 +74,23 @@ static int enable_nat(struct connman_nat *nat)
                                        nat->address,
                                        nat->prefixlen,
                                        nat->interface);
-       err = __connman_iptables_append("nat", "POSTROUTING", cmd);
+
+       err = __connman_firewall_add_rule(nat->fw, "nat",
+                               "POSTROUTING", cmd);
        g_free(cmd);
        if (err < 0)
                return err;
 
-       return __connman_iptables_commit("nat");
+       return __connman_firewall_enable(nat->fw);
 }
 
 static void disable_nat(struct connman_nat *nat)
 {
-       char *cmd;
-       int err;
-
-       if (nat->interface == NULL)
+       if (!nat->interface)
                return;
 
        /* Disable masquerading */
-       cmd = g_strdup_printf("-s %s/%d -o %s -j MASQUERADE",
-                                       nat->address,
-                                       nat->prefixlen,
-                                       nat->interface);
-       err = __connman_iptables_delete("nat", "POSTROUTING", cmd);
-       g_free(cmd);
-       if (err < 0)
-               return;
-
-       __connman_iptables_commit("nat");
+       __connman_firewall_disable(nat->fw);
 }
 
 int __connman_nat_enable(const char *name, const char *address,
@@ -109,18 +100,18 @@ int __connman_nat_enable(const char *name, const char *address,
        int err;
 
        if (g_hash_table_size(nat_hash) == 0) {
-               err = enable_ip_forward(TRUE);
+               err = enable_ip_forward(true);
                if (err < 0)
                        return err;
        }
 
        nat = g_try_new0(struct connman_nat, 1);
-       if (nat == NULL) {
-               if (g_hash_table_size(nat_hash) == 0)
-                       enable_ip_forward(FALSE);
+       if (!nat)
+               goto err;
 
-               return -ENOMEM;
-       }
+       nat->fw = __connman_firewall_create();
+       if (!nat->fw)
+               goto err;
 
        nat->address = g_strdup(address);
        nat->prefixlen = prefixlen;
@@ -128,6 +119,18 @@ int __connman_nat_enable(const char *name, const char *address,
        g_hash_table_replace(nat_hash, g_strdup(name), nat);
 
        return enable_nat(nat);
+
+err:
+       if (nat) {
+               if (nat->fw)
+                       __connman_firewall_destroy(nat->fw);
+               g_free(nat);
+       }
+
+       if (g_hash_table_size(nat_hash) == 0)
+               enable_ip_forward(false);
+
+       return -ENOMEM;
 }
 
 void __connman_nat_disable(const char *name)
@@ -135,7 +138,7 @@ void __connman_nat_disable(const char *name)
        struct connman_nat *nat;
 
        nat = g_hash_table_lookup(nat_hash, name);
-       if (nat == NULL)
+       if (!nat)
                return;
 
        disable_nat(nat);
@@ -143,7 +146,7 @@ void __connman_nat_disable(const char *name)
        g_hash_table_remove(nat_hash, name);
 
        if (g_hash_table_size(nat_hash) == 0)
-               enable_ip_forward(FALSE);
+               enable_ip_forward(false);
 }
 
 static void update_default_interface(struct connman_service *service)
@@ -162,7 +165,7 @@ static void update_default_interface(struct connman_service *service)
 
        g_hash_table_iter_init(&iter, nat_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                const char *name = key;
                struct connman_nat *nat = value;
 
@@ -184,6 +187,7 @@ static void cleanup_nat(gpointer data)
 {
        struct connman_nat *nat = data;
 
+       __connman_firewall_destroy(nat->fw);
        g_free(nat->address);
        g_free(nat->interface);
        g_free(nat);
diff --git a/src/net.connman.service.in b/src/net.connman.service.in
new file mode 100644 (file)
index 0000000..0bb1e8b
--- /dev/null
@@ -0,0 +1,5 @@
+[D-BUS Service]
+Name=net.connman
+Exec=@prefix@/sbin/connman -n
+User=root
+SystemdService=connman.service
index 6a926cb..160bd06 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -47,9 +47,9 @@ static GSList *driver_list = NULL;
 struct connman_network {
        int refcount;
        enum connman_network_type type;
-       connman_bool_t available;
-       connman_bool_t connected;
-       connman_bool_t roaming;
+       bool available;
+       bool connected;
+       bool roaming;
        uint8_t strength;
        uint16_t frequency;
        char *identifier;
@@ -64,8 +64,8 @@ struct connman_network {
        struct connman_network_driver *driver;
        void *driver_data;
 
-       connman_bool_t connecting;
-       connman_bool_t associating;
+       bool connecting;
+       bool associating;
 
        struct connman_device *device;
 
@@ -76,7 +76,6 @@ struct connman_network {
                unsigned short channel;
                char *security;
                char *passphrase;
-               char *agent_passphrase;
                char *eap;
                char *identity;
                char *agent_identity;
@@ -85,8 +84,8 @@ struct connman_network {
                char *private_key_path;
                char *private_key_passphrase;
                char *phase2_auth;
-               connman_bool_t wps;
-               connman_bool_t use_wps;
+               bool wps;
+               bool use_wps;
                char *pin_wps;
        } wifi;
 
@@ -100,6 +99,8 @@ static const char *type2string(enum connman_network_type type)
                break;
        case CONNMAN_NETWORK_TYPE_ETHERNET:
                return "ethernet";
+       case CONNMAN_NETWORK_TYPE_GADGET:
+               return "gadget";
        case CONNMAN_NETWORK_TYPE_WIFI:
                return "wifi";
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
@@ -112,14 +113,14 @@ static const char *type2string(enum connman_network_type type)
        return NULL;
 }
 
-static gboolean match_driver(struct connman_network *network,
+static bool match_driver(struct connman_network *network,
                                        struct connman_network_driver *driver)
 {
        if (network->type == driver->type ||
                        driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static void set_configuration(struct connman_network *network,
@@ -129,12 +130,12 @@ static void set_configuration(struct connman_network *network,
 
        DBG("network %p", network);
 
-       if (network->device == NULL)
+       if (!network->device)
                return;
 
        __connman_device_set_network(network->device, network);
 
-       connman_device_set_disconnected(network->device, FALSE);
+       connman_device_set_disconnected(network->device, false);
 
        service = connman_service_lookup_from_network(network);
        __connman_service_ipconfig_indicate_state(service,
@@ -149,14 +150,20 @@ static void dhcp_success(struct connman_network *network)
        int err;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                goto err;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
        ipconfig_ipv4 = __connman_service_get_ip4config(service);
+
+       DBG("lease acquired for ipconfig %p", ipconfig_ipv4);
+
+       if (!ipconfig_ipv4)
+               return;
+
        err = __connman_ipconfig_address_add(ipconfig_ipv4);
        if (err < 0)
                goto err;
@@ -175,22 +182,30 @@ err:
 static void dhcp_failure(struct connman_network *network)
 {
        struct connman_service *service;
+       struct connman_ipconfig *ipconfig_ipv4;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return;
 
-       __connman_service_ipconfig_indicate_state(service,
-                                       CONNMAN_SERVICE_STATE_IDLE,
-                                       CONNMAN_IPCONFIG_TYPE_IPV4);
+       connman_network_set_associating(network, false);
+       network->connecting = false;
+
+       ipconfig_ipv4 = __connman_service_get_ip4config(service);
+
+       DBG("lease lost for ipconfig %p", ipconfig_ipv4);
+
+       if (!ipconfig_ipv4)
+               return;
+
+       __connman_ipconfig_address_remove(ipconfig_ipv4);
+       __connman_ipconfig_gateway_remove(ipconfig_ipv4);
 }
 
 static void dhcp_callback(struct connman_network *network,
-                       connman_bool_t success)
+                       bool success, gpointer data)
 {
-       DBG("success %d", success);
-
-       if (success == TRUE)
+       if (success)
                dhcp_success(network);
        else
                dhcp_failure(network);
@@ -210,9 +225,9 @@ static int set_connected_fixed(struct connman_network *network)
 
        set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 
        err = __connman_ipconfig_address_add(ipconfig_ipv4);
        if (err < 0)
@@ -243,7 +258,7 @@ static void set_connected_manual(struct connman_network *network)
 
        ipconfig = __connman_service_get_ip4config(service);
 
-       if (__connman_ipconfig_get_local(ipconfig) == NULL)
+       if (!__connman_ipconfig_get_local(ipconfig))
                __connman_service_read_ip4config(service);
 
        set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
@@ -256,9 +271,9 @@ static void set_connected_manual(struct connman_network *network)
        if (err < 0)
                goto err;
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 
        return;
 
@@ -294,10 +309,10 @@ static int manual_ipv6_set(struct connman_network *network,
        DBG("network %p ipv6 %p", network, ipconfig_ipv6);
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
-       if (__connman_ipconfig_get_local(ipconfig_ipv6) == NULL)
+       if (!__connman_ipconfig_get_local(ipconfig_ipv6))
                __connman_service_read_ip6config(service);
 
        __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
@@ -318,9 +333,9 @@ static int manual_ipv6_set(struct connman_network *network,
 
        __connman_device_set_network(network->device, network);
 
-       connman_device_set_disconnected(network->device, FALSE);
+       connman_device_set_disconnected(network->device, false);
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
        return 0;
 }
@@ -331,9 +346,10 @@ static void stop_dhcpv6(struct connman_network *network)
 }
 
 static void dhcpv6_release_callback(struct connman_network *network,
-                               connman_bool_t success)
+                               enum __connman_dhcpv6_status status,
+                               gpointer data)
 {
-       DBG("success %d", success);
+       DBG("status %d", status);
 
        stop_dhcpv6(network);
 }
@@ -345,26 +361,27 @@ static void release_dhcpv6(struct connman_network *network)
 }
 
 static void dhcpv6_info_callback(struct connman_network *network,
-                               connman_bool_t success)
+                               enum __connman_dhcpv6_status status,
+                               gpointer data)
 {
-       DBG("success %d", success);
+       DBG("status %d", status);
 
        stop_dhcpv6(network);
 }
 
-static gboolean dhcpv6_set_addresses(struct connman_network *network)
+static int dhcpv6_set_addresses(struct connman_network *network)
 {
        struct connman_service *service;
        struct connman_ipconfig *ipconfig_ipv6;
        int err = -EINVAL;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                goto err;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
        ipconfig_ipv6 = __connman_service_get_ip6config(service);
        err = __connman_ipconfig_address_add(ipconfig_ipv6);
@@ -385,7 +402,7 @@ err:
 
 static void autoconf_ipv6_set(struct connman_network *network);
 static void dhcpv6_callback(struct connman_network *network,
-                       connman_bool_t success);
+                       enum __connman_dhcpv6_status status, gpointer data);
 
 /*
  * Have a separate callback for renew so that we do not do autoconf
@@ -393,25 +410,30 @@ static void dhcpv6_callback(struct connman_network *network,
  * DHCPv6 solicitation.
  */
 static void dhcpv6_renew_callback(struct connman_network *network,
-                                       connman_bool_t success)
+                               enum __connman_dhcpv6_status status,
+                               gpointer data)
 {
-       if (success == TRUE)
-               dhcpv6_callback(network, success);
-       else {
+       switch (status) {
+       case CONNMAN_DHCPV6_STATUS_SUCCEED:
+               dhcpv6_callback(network, status, data);
+               break;
+       case CONNMAN_DHCPV6_STATUS_FAIL:
+       case CONNMAN_DHCPV6_STATUS_RESTART:
                stop_dhcpv6(network);
 
                /* restart and do solicit again. */
                autoconf_ipv6_set(network);
+               break;
        }
 }
 
 static void dhcpv6_callback(struct connman_network *network,
-                                       connman_bool_t success)
+                       enum __connman_dhcpv6_status status, gpointer data)
 {
-       DBG("success %d", success);
+       DBG("status %d", status);
 
        /* Start the renew process if necessary */
-       if (success == TRUE) {
+       if (status == CONNMAN_DHCPV6_STATUS_SUCCEED) {
 
                if (dhcpv6_set_addresses(network) < 0) {
                        stop_dhcpv6(network);
@@ -420,7 +442,13 @@ static void dhcpv6_callback(struct connman_network *network,
 
                if (__connman_dhcpv6_start_renew(network,
                                        dhcpv6_renew_callback) == -ETIMEDOUT)
-                       dhcpv6_renew_callback(network, FALSE);
+                       dhcpv6_renew_callback(network,
+                                               CONNMAN_DHCPV6_STATUS_FAIL,
+                                               data);
+
+       } else if (status == CONNMAN_DHCPV6_STATUS_RESTART) {
+               stop_dhcpv6(network);
+               autoconf_ipv6_set(network);
        } else
                stop_dhcpv6(network);
 }
@@ -433,7 +461,7 @@ static void check_dhcpv6(struct nd_router_advert *reply,
 
        DBG("reply %p", reply);
 
-       if (reply == NULL) {
+       if (!reply) {
                /*
                 * Router solicitation message seem to get lost easily so
                 * try to send it again.
@@ -456,7 +484,7 @@ static void check_dhcpv6(struct nd_router_advert *reply,
         * If we were disconnected while waiting router advertisement,
         * we just quit and do not start DHCPv6
         */
-       if (network->connected == FALSE) {
+       if (!network->connected) {
                connman_network_unref(network);
                return;
        }
@@ -481,7 +509,7 @@ static void receive_refresh_rs_reply(struct nd_router_advert *reply,
 
        DBG("reply %p", reply);
 
-       if (reply == NULL) {
+       if (!reply) {
                /*
                 * Router solicitation message seem to get lost easily so
                 * try to send it again.
@@ -505,7 +533,8 @@ static void receive_refresh_rs_reply(struct nd_router_advert *reply,
        return;
 }
 
-int __connman_refresh_rs_ipv6(struct connman_network *network, int index)
+int __connman_network_refresh_rs_ipv6(struct connman_network *network,
+                                       int index)
 {
        int ret = 0;
 
@@ -546,16 +575,16 @@ static void autoconf_ipv6_set(struct connman_network *network)
 
        __connman_device_set_network(network->device, network);
 
-       connman_device_set_disconnected(network->device, FALSE);
+       connman_device_set_disconnected(network->device, false);
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return;
 
        ipconfig = __connman_service_get_ip6config(service);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        index = __connman_ipconfig_get_index(ipconfig);
@@ -574,10 +603,10 @@ static void set_connected(struct connman_network *network)
        struct connman_service *service;
        int ret;
 
-       if (network->connected == TRUE)
+       if (network->connected)
                return;
 
-       network->connected = TRUE;
+       network->connected = true;
 
        service = connman_service_lookup_from_network(network);
 
@@ -634,9 +663,9 @@ static void set_connected(struct connman_network *network)
                }
        }
 
-       network->connecting = FALSE;
+       network->connecting = false;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 }
 
 static void set_disconnected(struct connman_network *network)
@@ -646,11 +675,6 @@ static void set_disconnected(struct connman_network *network)
        enum connman_service_state state;
        struct connman_service *service;
 
-       if (network->connected == FALSE)
-               return;
-
-       network->connected = FALSE;
-
        service = connman_service_lookup_from_network(network);
 
        ipconfig_ipv4 = __connman_service_get_ip4config(service);
@@ -672,28 +696,30 @@ static void set_disconnected(struct connman_network *network)
 
        __connman_device_set_network(network->device, NULL);
 
-       switch (ipv6_method) {
-       case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
-       case CONNMAN_IPCONFIG_METHOD_OFF:
-       case CONNMAN_IPCONFIG_METHOD_FIXED:
-       case CONNMAN_IPCONFIG_METHOD_MANUAL:
-               break;
-       case CONNMAN_IPCONFIG_METHOD_DHCP:
-       case CONNMAN_IPCONFIG_METHOD_AUTO:
-               release_dhcpv6(network);
-               break;
-       }
+       if (network->connected) {
+               switch (ipv6_method) {
+               case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+               case CONNMAN_IPCONFIG_METHOD_OFF:
+               case CONNMAN_IPCONFIG_METHOD_FIXED:
+               case CONNMAN_IPCONFIG_METHOD_MANUAL:
+                       break;
+               case CONNMAN_IPCONFIG_METHOD_DHCP:
+               case CONNMAN_IPCONFIG_METHOD_AUTO:
+                       release_dhcpv6(network);
+                       break;
+               }
 
-       switch (ipv4_method) {
-       case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
-       case CONNMAN_IPCONFIG_METHOD_OFF:
-       case CONNMAN_IPCONFIG_METHOD_AUTO:
-       case CONNMAN_IPCONFIG_METHOD_FIXED:
-       case CONNMAN_IPCONFIG_METHOD_MANUAL:
-               break;
-       case CONNMAN_IPCONFIG_METHOD_DHCP:
-               __connman_dhcp_stop(network);
-               break;
+               switch (ipv4_method) {
+               case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+               case CONNMAN_IPCONFIG_METHOD_OFF:
+               case CONNMAN_IPCONFIG_METHOD_AUTO:
+               case CONNMAN_IPCONFIG_METHOD_FIXED:
+               case CONNMAN_IPCONFIG_METHOD_MANUAL:
+                       break;
+               case CONNMAN_IPCONFIG_METHOD_DHCP:
+                       __connman_dhcp_stop(network);
+                       break;
+               }
        }
 
        /*
@@ -717,21 +743,23 @@ static void set_disconnected(struct connman_network *network)
                                        CONNMAN_SERVICE_STATE_DISCONNECT,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);
 
-       __connman_connection_gateway_remove(service,
-                                       CONNMAN_IPCONFIG_TYPE_ALL);
+       if (network->connected) {
+               __connman_connection_gateway_remove(service,
+                                               CONNMAN_IPCONFIG_TYPE_ALL);
 
-       __connman_ipconfig_address_unset(ipconfig_ipv4);
-       __connman_ipconfig_address_unset(ipconfig_ipv6);
+               __connman_ipconfig_address_unset(ipconfig_ipv4);
+               __connman_ipconfig_address_unset(ipconfig_ipv6);
 
-       /*
-        * Special handling for IPv6 autoconfigured address.
-        * The simplest way to remove autoconfigured routes is to
-        * disable IPv6 temporarily so that kernel will do the cleanup
-        * automagically.
-        */
-       if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
-               __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
-               __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
+               /*
+                * Special handling for IPv6 autoconfigured address.
+                * The simplest way to remove autoconfigured routes is to
+                * disable IPv6 temporarily so that kernel will do the cleanup
+                * automagically.
+                */
+               if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
+                       __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
+                       __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
+               }
        }
 
        __connman_service_ipconfig_indicate_state(service,
@@ -742,9 +770,10 @@ static void set_disconnected(struct connman_network *network)
                                                CONNMAN_SERVICE_STATE_IDLE,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
 
-       network->connecting = FALSE;
+       network->connecting = false;
+       network->connected = false;
 
-       connman_network_set_associating(network, FALSE);
+       connman_network_set_associating(network, false);
 }
 
 
@@ -756,13 +785,13 @@ static int network_probe(struct connman_network *network)
 
        DBG("network %p name %s", network, network->name);
 
-       if (network->driver != NULL)
+       if (network->driver)
                return -EALREADY;
 
        for (list = driver_list; list; list = list->next) {
                driver = list->data;
 
-               if (match_driver(network, driver) == FALSE) {
+               if (!match_driver(network, driver)) {
                        driver = NULL;
                        continue;
                }
@@ -775,10 +804,10 @@ static int network_probe(struct connman_network *network)
                driver = NULL;
        }
 
-       if (driver == NULL)
+       if (!driver)
                return -ENODEV;
 
-       if (network->group == NULL)
+       if (!network->group)
                return -EINVAL;
 
        switch (network->type) {
@@ -786,12 +815,13 @@ static int network_probe(struct connman_network *network)
        case CONNMAN_NETWORK_TYPE_VENDOR:
                return 0;
        case CONNMAN_NETWORK_TYPE_ETHERNET:
+       case CONNMAN_NETWORK_TYPE_GADGET:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
        case CONNMAN_NETWORK_TYPE_CELLULAR:
        case CONNMAN_NETWORK_TYPE_WIFI:
                network->driver = driver;
-               if (__connman_service_create_from_network(network) == NULL) {
+               if (!__connman_service_create_from_network(network)) {
                        network->driver = NULL;
                        return -EINVAL;
                }
@@ -804,10 +834,10 @@ static void network_remove(struct connman_network *network)
 {
        DBG("network %p name %s", network, network->name);
 
-       if (network->driver == NULL)
+       if (!network->driver)
                return;
 
-       if (network->connected == TRUE)
+       if (network->connected)
                set_disconnected(network);
 
        switch (network->type) {
@@ -815,11 +845,12 @@ static void network_remove(struct connman_network *network)
        case CONNMAN_NETWORK_TYPE_VENDOR:
                break;
        case CONNMAN_NETWORK_TYPE_ETHERNET:
+       case CONNMAN_NETWORK_TYPE_GADGET:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
        case CONNMAN_NETWORK_TYPE_CELLULAR:
        case CONNMAN_NETWORK_TYPE_WIFI:
-               if (network->group != NULL) {
+               if (network->group) {
                        __connman_service_remove_from_network(network);
 
                        g_free(network->group);
@@ -838,17 +869,17 @@ static void network_change(struct connman_network *network)
 {
        DBG("network %p name %s", network, network->name);
 
-       if (network->connected == FALSE)
+       if (!network->connected)
                return;
 
-       connman_device_set_disconnected(network->device, TRUE);
+       connman_device_set_disconnected(network->device, true);
 
        if (network->driver && network->driver->disconnect) {
                network->driver->disconnect(network);
                return;
        }
 
-       network->connected = FALSE;
+       network->connected = false;
 }
 
 static void probe_driver(struct connman_network_driver *driver)
@@ -857,10 +888,10 @@ static void probe_driver(struct connman_network_driver *driver)
 
        DBG("driver %p name %s", driver, driver->name);
 
-       for (list = network_list; list != NULL; list = list->next) {
+       for (list = network_list; list; list = list->next) {
                struct connman_network *network = list->data;
 
-               if (network->driver != NULL)
+               if (network->driver)
                        continue;
 
                if (driver->type != network->type)
@@ -879,7 +910,7 @@ static void remove_driver(struct connman_network_driver *driver)
 
        DBG("driver %p name %s", driver, driver->name);
 
-       for (list = network_list; list != NULL; list = list->next) {
+       for (list = network_list; list; list = list->next) {
                struct connman_network *network = list->data;
 
                if (network->driver == driver)
@@ -938,7 +969,6 @@ static void network_destruct(struct connman_network *network)
        g_free(network->wifi.mode);
        g_free(network->wifi.security);
        g_free(network->wifi.passphrase);
-       g_free(network->wifi.agent_passphrase);
        g_free(network->wifi.eap);
        g_free(network->wifi.identity);
        g_free(network->wifi.agent_identity);
@@ -977,7 +1007,7 @@ struct connman_network *connman_network_create(const char *identifier,
        DBG("identifier %s type %d", identifier, type);
 
        network = g_try_new0(struct connman_network, 1);
-       if (network == NULL)
+       if (!network)
                return NULL;
 
        DBG("network %p", network);
@@ -986,7 +1016,7 @@ struct connman_network *connman_network_create(const char *identifier,
 
        ident = g_strdup(identifier);
 
-       if (ident == NULL) {
+       if (!ident) {
                g_free(network);
                return NULL;
        }
@@ -1048,7 +1078,8 @@ const char *__connman_network_get_type(struct connman_network *network)
  *
  * Get type of network
  */
-enum connman_network_type connman_network_get_type(struct connman_network *network)
+enum connman_network_type connman_network_get_type(
+                               struct connman_network *network)
 {
        return network->type;
 }
@@ -1077,11 +1108,11 @@ void connman_network_set_index(struct connman_network *network, int index)
        struct connman_ipconfig *ipconfig;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                goto done;
 
        ipconfig = __connman_service_get_ip4config(service);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                goto done;
 
        /* If index changed, the index of ipconfig must be reset. */
@@ -1119,6 +1150,7 @@ void connman_network_set_group(struct connman_network *network,
        case CONNMAN_NETWORK_TYPE_VENDOR:
                return;
        case CONNMAN_NETWORK_TYPE_ETHERNET:
+       case CONNMAN_NETWORK_TYPE_GADGET:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
        case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -1127,12 +1159,12 @@ void connman_network_set_group(struct connman_network *network,
        }
 
        if (g_strcmp0(network->group, group) == 0) {
-               if (group != NULL)
+               if (group)
                        __connman_service_update_from_network(network);
                return;
        }
 
-       if (network->group != NULL) {
+       if (network->group) {
                __connman_service_remove_from_network(network);
 
                g_free(network->group);
@@ -1140,7 +1172,7 @@ void connman_network_set_group(struct connman_network *network,
 
        network->group = g_strdup(group);
 
-       if (network->group != NULL)
+       if (network->group)
                network_probe(network);
 }
 
@@ -1157,34 +1189,33 @@ const char *connman_network_get_group(struct connman_network *network)
 
 const char *__connman_network_get_ident(struct connman_network *network)
 {
-       if (network->device == NULL)
+       if (!network->device)
                return NULL;
 
        return connman_device_get_ident(network->device);
 }
 
-connman_bool_t __connman_network_get_weakness(struct connman_network *network)
+bool __connman_network_get_weakness(struct connman_network *network)
 {
        switch (network->type) {
        case CONNMAN_NETWORK_TYPE_UNKNOWN:
        case CONNMAN_NETWORK_TYPE_VENDOR:
        case CONNMAN_NETWORK_TYPE_ETHERNET:
+       case CONNMAN_NETWORK_TYPE_GADGET:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
        case CONNMAN_NETWORK_TYPE_CELLULAR:
                break;
        case CONNMAN_NETWORK_TYPE_WIFI:
-               if (g_strcmp0(network->wifi.mode, "adhoc") == 0)
-                       return TRUE;
                if (network->strength > 0 && network->strength < 20)
-                       return TRUE;
+                       return true;
                break;
        }
 
-       return FALSE;
+       return false;
 }
 
-connman_bool_t connman_network_get_connecting(struct connman_network *network)
+bool connman_network_get_connecting(struct connman_network *network)
 {
        return network->connecting;
 }
@@ -1197,7 +1228,7 @@ connman_bool_t connman_network_get_connecting(struct connman_network *network)
  * Change availability state of network (in range)
  */
 int connman_network_set_available(struct connman_network *network,
-                                               connman_bool_t available)
+                                               bool available)
 {
        DBG("network %p available %d", network, available);
 
@@ -1215,7 +1246,7 @@ int connman_network_set_available(struct connman_network *network,
  *
  * Get network available setting
  */
-connman_bool_t connman_network_get_available(struct connman_network *network)
+bool connman_network_get_available(struct connman_network *network)
 {
        return network->available;
 }
@@ -1228,7 +1259,7 @@ connman_bool_t connman_network_get_available(struct connman_network *network)
  * Change associating state of network
  */
 int connman_network_set_associating(struct connman_network *network,
-                                               connman_bool_t associating)
+                                               bool associating)
 {
        DBG("network %p associating %d", network, associating);
 
@@ -1237,7 +1268,7 @@ int connman_network_set_associating(struct connman_network *network,
 
        network->associating = associating;
 
-       if (associating == TRUE) {
+       if (associating) {
                struct connman_service *service;
 
                service = connman_service_lookup_from_network(network);
@@ -1299,11 +1330,11 @@ void connman_network_set_ipv4_method(struct connman_network *network,
        struct connman_ipconfig *ipconfig;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return;
 
        ipconfig = __connman_service_get_ip4config(service);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        __connman_ipconfig_set_method(ipconfig, method);
@@ -1316,11 +1347,11 @@ void connman_network_set_ipv6_method(struct connman_network *network,
        struct connman_ipconfig *ipconfig;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return;
 
        ipconfig = __connman_service_get_ip6config(service);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        __connman_ipconfig_set_method(ipconfig, method);
@@ -1331,8 +1362,8 @@ void connman_network_set_error(struct connman_network *network,
 {
        DBG("network %p error %d", network, error);
 
-       network->connecting = FALSE;
-       network->associating = FALSE;
+       network->connecting = false;
+       network->associating = false;
 
        switch (error) {
        case CONNMAN_NETWORK_ERROR_UNKNOWN:
@@ -1360,10 +1391,10 @@ void connman_network_clear_error(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (network == NULL)
+       if (!network)
                return;
 
-       if (network->connecting == TRUE || network->associating == TRUE)
+       if (network->connecting || network->associating)
                return;
 
        service = connman_service_lookup_from_network(network);
@@ -1378,14 +1409,14 @@ void connman_network_clear_error(struct connman_network *network)
  * Change connected state of network
  */
 int connman_network_set_connected(struct connman_network *network,
-                                               connman_bool_t connected)
+                                               bool connected)
 {
        DBG("network %p connected %d/%d connecting %d associating %d",
                network, network->connected, connected, network->connecting,
                network->associating);
 
-       if ((network->connecting == TRUE || network->associating == TRUE) &&
-                                                       connected == FALSE) {
+       if ((network->connecting || network->associating) &&
+                                                       !connected) {
                connman_network_set_error(network,
                                        CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
                if (__connman_network_disconnect(network) == 0)
@@ -1395,7 +1426,7 @@ int connman_network_set_connected(struct connman_network *network,
        if (network->connected == connected)
                return -EALREADY;
 
-       if (connected == FALSE)
+       if (!connected)
                set_disconnected(network);
        else
                set_connected(network);
@@ -1409,7 +1440,7 @@ int connman_network_set_connected(struct connman_network *network,
  *
  * Get network connection status
  */
-connman_bool_t connman_network_get_connected(struct connman_network *network)
+bool connman_network_get_connected(struct connman_network *network)
 {
        return network->connected;
 }
@@ -1420,14 +1451,14 @@ connman_bool_t connman_network_get_connected(struct connman_network *network)
  *
  * Get network associating status
  */
-connman_bool_t connman_network_get_associating(struct connman_network *network)
+bool connman_network_get_associating(struct connman_network *network)
 {
        return network->associating;
 }
 
 void connman_network_clear_hidden(void *user_data)
 {
-       if (user_data == NULL)
+       if (!user_data)
                return;
 
        DBG("user_data %p", user_data);
@@ -1442,7 +1473,7 @@ void connman_network_clear_hidden(void *user_data)
 }
 
 int connman_network_connect_hidden(struct connman_network *network,
-                       char *identity, charpassphrase, void *user_data)
+                       char *identity, char *passphrase, void *user_data)
 {
        int err = 0;
        struct connman_service *service;
@@ -1451,15 +1482,13 @@ int connman_network_connect_hidden(struct connman_network *network,
 
        DBG("network %p service %p user_data %p", network, service, user_data);
 
-       if (service == NULL) {
-               err = -EINVAL;
-               goto out;
-       }
+       if (!service)
+               return -EINVAL;
 
-       if (identity != NULL)
+       if (identity)
                __connman_service_set_agent_identity(service, identity);
 
-       if (passphrase != NULL)
+       if (passphrase)
                err = __connman_service_add_passphrase(service, passphrase);
 
        if (err == -ENOKEY) {
@@ -1468,9 +1497,9 @@ int connman_network_connect_hidden(struct connman_network *network,
                goto out;
        } else {
                __connman_service_set_hidden(service);
-               __connman_service_set_userconnect(service, TRUE);
                __connman_service_set_hidden_data(service, user_data);
-               return __connman_service_connect(service);
+               return __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER);
        }
 
 out:
@@ -1490,32 +1519,31 @@ int __connman_network_connect(struct connman_network *network)
 
        DBG("network %p", network);
 
-       if (network->connected == TRUE)
+       if (network->connected)
                return -EISCONN;
 
-       if (network->connecting == TRUE || network->associating == TRUE)
+       if (network->connecting || network->associating)
                return -EALREADY;
 
-       if (network->driver == NULL)
+       if (!network->driver)
                return -EUNATCH;
 
-       if (network->driver->connect == NULL)
+       if (!network->driver->connect)
                return -ENOSYS;
 
-       if (network->device == NULL)
+       if (!network->device)
                return -ENODEV;
 
-       network->connecting = TRUE;
+       network->connecting = true;
 
        __connman_device_disconnect(network->device);
 
        err = network->driver->connect(network);
        if (err < 0) {
                if (err == -EINPROGRESS)
-                       connman_network_set_associating(network, TRUE);
-               else {
-                       network->connecting = FALSE;
-               }
+                       connman_network_set_associating(network, true);
+               else
+                       network->connecting = false;
 
                return err;
        }
@@ -1533,24 +1561,23 @@ int __connman_network_connect(struct connman_network *network)
  */
 int __connman_network_disconnect(struct connman_network *network)
 {
-       int err;
+       int err = 0;
 
        DBG("network %p", network);
 
-       if (network->connected == FALSE && network->connecting == FALSE &&
-                                               network->associating == FALSE)
+       if (!network->connected && !network->connecting &&
+                                               !network->associating)
                return -ENOTCONN;
 
-       if (network->driver == NULL)
+       if (!network->driver)
                return -EUNATCH;
 
-       if (network->driver->disconnect == NULL)
-               return -ENOSYS;
+       network->connecting = false;
 
-       network->connecting = FALSE;
+       if (network->driver->disconnect)
+               err = network->driver->disconnect(network);
 
-       err = network->driver->disconnect(network);
-       if (err == 0)
+       if (err != -EINPROGRESS)
                set_disconnected(network);
 
        return err;
@@ -1563,7 +1590,7 @@ static int manual_ipv4_set(struct connman_network *network,
        int err;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        err = __connman_ipconfig_address_add(ipconfig);
@@ -1584,7 +1611,7 @@ int __connman_network_clear_ipconfig(struct connman_network *network,
        enum connman_ipconfig_type type;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        method = __connman_ipconfig_get_method(ipconfig);
@@ -1625,7 +1652,7 @@ int __connman_network_set_ipconfig(struct connman_network *network,
        enum connman_ipconfig_method method;
        int ret;
 
-       if (network == NULL)
+       if (!network)
                return -EINVAL;
 
        if (ipconfig_ipv6) {
@@ -1680,11 +1707,11 @@ int connman_network_set_ipaddress(struct connman_network *network,
        DBG("network %p", network);
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -EINVAL;
 
        __connman_ipconfig_set_local(ipconfig, ipaddress->local);
@@ -1706,19 +1733,19 @@ int connman_network_set_nameservers(struct connman_network *network,
        DBG("network %p nameservers %s", network, nameservers);
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        __connman_service_nameserver_clear(service);
 
-       if (nameservers == NULL)
+       if (!nameservers)
                return 0;
 
        nameservers_array = g_strsplit(nameservers, " ", 0);
 
-       for (i = 0; nameservers_array[i] != NULL; i++) {
+       for (i = 0; nameservers_array[i]; i++) {
                __connman_service_nameserver_append(service,
-                                               nameservers_array[i], FALSE);
+                                               nameservers_array[i], false);
        }
 
        g_strfreev(nameservers_array);
@@ -1734,7 +1761,7 @@ int connman_network_set_domain(struct connman_network *network,
        DBG("network %p domain %s", network, domain);
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        __connman_service_set_domainname(service, domain);
@@ -1829,49 +1856,46 @@ int connman_network_set_string(struct connman_network *network,
        if (g_strcmp0(key, "Name") == 0)
                return connman_network_set_name(network, value);
 
-       if (g_str_equal(key, "Path") == TRUE) {
+       if (g_str_equal(key, "Path")) {
                g_free(network->path);
                network->path = g_strdup(value);
-       } else if (g_str_equal(key, "Node") == TRUE) {
+       } else if (g_str_equal(key, "Node")) {
                g_free(network->node);
                network->node = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.Mode") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.Mode")) {
                g_free(network->wifi.mode);
                network->wifi.mode = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.Security") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.Security")) {
                g_free(network->wifi.security);
                network->wifi.security = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.Passphrase") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.Passphrase")) {
                g_free(network->wifi.passphrase);
                network->wifi.passphrase = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE) {
-               g_free(network->wifi.agent_passphrase);
-               network->wifi.agent_passphrase = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.EAP") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.EAP")) {
                g_free(network->wifi.eap);
                network->wifi.eap = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.Identity") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.Identity")) {
                g_free(network->wifi.identity);
                network->wifi.identity = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.AgentIdentity")) {
                g_free(network->wifi.agent_identity);
                network->wifi.agent_identity = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.CACertFile") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.CACertFile")) {
                g_free(network->wifi.ca_cert_path);
                network->wifi.ca_cert_path = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.ClientCertFile")) {
                g_free(network->wifi.client_cert_path);
                network->wifi.client_cert_path = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.PrivateKeyFile")) {
                g_free(network->wifi.private_key_path);
                network->wifi.private_key_path = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase")) {
                g_free(network->wifi.private_key_passphrase);
                network->wifi.private_key_passphrase = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.Phase2") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.Phase2")) {
                g_free(network->wifi.phase2_auth);
                network->wifi.phase2_auth = g_strdup(value);
-       } else if (g_str_equal(key, "WiFi.PinWPS") == TRUE) {
+       } else if (g_str_equal(key, "WiFi.PinWPS")) {
                g_free(network->wifi.pin_wps);
                network->wifi.pin_wps = g_strdup(value);
        } else {
@@ -1893,37 +1917,35 @@ const char *connman_network_get_string(struct connman_network *network,
 {
        DBG("network %p key %s", network, key);
 
-       if (g_str_equal(key, "Path") == TRUE)
+       if (g_str_equal(key, "Path"))
                return network->path;
-       else if (g_str_equal(key, "Name") == TRUE)
+       else if (g_str_equal(key, "Name"))
                return network->name;
-       else if (g_str_equal(key, "Node") == TRUE)
+       else if (g_str_equal(key, "Node"))
                return network->node;
-       else if (g_str_equal(key, "WiFi.Mode") == TRUE)
+       else if (g_str_equal(key, "WiFi.Mode"))
                return network->wifi.mode;
-       else if (g_str_equal(key, "WiFi.Security") == TRUE)
+       else if (g_str_equal(key, "WiFi.Security"))
                return network->wifi.security;
-       else if (g_str_equal(key, "WiFi.Passphrase") == TRUE)
+       else if (g_str_equal(key, "WiFi.Passphrase"))
                return network->wifi.passphrase;
-       else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE)
-               return network->wifi.agent_passphrase;
-       else if (g_str_equal(key, "WiFi.EAP") == TRUE)
+       else if (g_str_equal(key, "WiFi.EAP"))
                return network->wifi.eap;
-       else if (g_str_equal(key, "WiFi.Identity") == TRUE)
+       else if (g_str_equal(key, "WiFi.Identity"))
                return network->wifi.identity;
-       else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE)
+       else if (g_str_equal(key, "WiFi.AgentIdentity"))
                return network->wifi.agent_identity;
-       else if (g_str_equal(key, "WiFi.CACertFile") == TRUE)
+       else if (g_str_equal(key, "WiFi.CACertFile"))
                return network->wifi.ca_cert_path;
-       else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE)
+       else if (g_str_equal(key, "WiFi.ClientCertFile"))
                return network->wifi.client_cert_path;
-       else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE)
+       else if (g_str_equal(key, "WiFi.PrivateKeyFile"))
                return network->wifi.private_key_path;
-       else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE)
+       else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase"))
                return network->wifi.private_key_passphrase;
-       else if (g_str_equal(key, "WiFi.Phase2") == TRUE)
+       else if (g_str_equal(key, "WiFi.Phase2"))
                return network->wifi.phase2_auth;
-       else if (g_str_equal(key, "WiFi.PinWPS") == TRUE)
+       else if (g_str_equal(key, "WiFi.PinWPS"))
                return network->wifi.pin_wps;
 
        return NULL;
@@ -1938,7 +1960,7 @@ const char *connman_network_get_string(struct connman_network *network,
  * Set boolean value for specific key
  */
 int connman_network_set_bool(struct connman_network *network,
-                                       const char *key, connman_bool_t value)
+                                       const char *key, bool value)
 {
        DBG("network %p key %s value %d", network, key, value);
 
@@ -1959,19 +1981,19 @@ int connman_network_set_bool(struct connman_network *network,
  *
  * Get boolean value for specific key
  */
-connman_bool_t connman_network_get_bool(struct connman_network *network,
+bool connman_network_get_bool(struct connman_network *network,
                                                        const char *key)
 {
        DBG("network %p key %s", network, key);
 
-       if (g_str_equal(key, "Roaming") == TRUE)
+       if (g_str_equal(key, "Roaming"))
                return network->roaming;
-       else if (g_str_equal(key, "WiFi.WPS") == TRUE)
+       else if (g_str_equal(key, "WiFi.WPS"))
                return network->wifi.wps;
-       else if (g_str_equal(key, "WiFi.UseWPS") == TRUE)
+       else if (g_str_equal(key, "WiFi.UseWPS"))
                return network->wifi.use_wps;
 
-       return FALSE;
+       return false;
 }
 
 /**
@@ -1988,10 +2010,10 @@ int connman_network_set_blob(struct connman_network *network,
 {
        DBG("network %p key %s size %d", network, key, size);
 
-       if (g_str_equal(key, "WiFi.SSID") == TRUE) {
+       if (g_str_equal(key, "WiFi.SSID")) {
                g_free(network->wifi.ssid);
                network->wifi.ssid = g_try_malloc(size);
-               if (network->wifi.ssid != NULL) {
+               if (network->wifi.ssid) {
                        memcpy(network->wifi.ssid, data, size);
                        network->wifi.ssid_len = size;
                } else
@@ -2016,8 +2038,8 @@ const void *connman_network_get_blob(struct connman_network *network,
 {
        DBG("network %p key %s", network, key);
 
-       if (g_str_equal(key, "WiFi.SSID") == TRUE) {
-               if (size != NULL)
+       if (g_str_equal(key, "WiFi.SSID")) {
+               if (size)
                        *size = network->wifi.ssid_len;
                return network->wifi.ssid;
        }
@@ -2031,12 +2053,12 @@ void __connman_network_set_device(struct connman_network *network,
        if (network->device == device)
                return;
 
-       if (network->device != NULL)
+       if (network->device)
                network_remove(network);
 
        network->device = device;
 
-       if (network->device != NULL)
+       if (network->device)
                network_probe(network);
 }
 
@@ -2081,6 +2103,7 @@ void connman_network_update(struct connman_network *network)
        case CONNMAN_NETWORK_TYPE_VENDOR:
                return;
        case CONNMAN_NETWORK_TYPE_ETHERNET:
+       case CONNMAN_NETWORK_TYPE_GADGET:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
        case CONNMAN_NETWORK_TYPE_CELLULAR:
@@ -2088,7 +2111,7 @@ void connman_network_update(struct connman_network *network)
                break;
        }
 
-       if (network->group != NULL)
+       if (network->group)
                __connman_service_update_from_network(network);
 }
 
index 623b970..5ba5324 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -73,46 +73,44 @@ void connman_notifier_unregister(struct connman_notifier *notifier)
        notifier_list = g_slist_remove(notifier_list, notifier);
 }
 
-#define MAX_TECHNOLOGIES 10
+static int connected[MAX_CONNMAN_SERVICE_TYPES];
+static int online[MAX_CONNMAN_SERVICE_TYPES];
 
-static int connected[MAX_TECHNOLOGIES];
-static int online[MAX_TECHNOLOGIES];
-
-static connman_bool_t notifier_is_online(void)
+static bool notifier_is_online(void)
 {
        unsigned int i;
 
        __sync_synchronize();
-       for (i = 0; i < MAX_TECHNOLOGIES; i++) {
+       for (i = 0; i < MAX_CONNMAN_SERVICE_TYPES; i++) {
                if (online[i] > 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
-connman_bool_t __connman_notifier_is_connected(void)
+bool __connman_notifier_is_connected(void)
 {
        unsigned int i;
 
        __sync_synchronize();
-       for (i = 0; i < MAX_TECHNOLOGIES; i++) {
+       for (i = 0; i < MAX_CONNMAN_SERVICE_TYPES; i++) {
                if (connected[i] > 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 static const char *evaluate_notifier_state(void)
 {
-       if (notifier_is_online() == TRUE)
+       if (notifier_is_online())
                return "online";
 
-       if (__connman_notifier_is_connected() == TRUE)
+       if (__connman_notifier_is_connected())
                return "ready";
 
-       if ( __connman_technology_get_offlinemode() == TRUE)
+       if (__connman_technology_get_offlinemode())
                return "offline";
 
        return "idle";
@@ -148,17 +146,18 @@ void __connman_notifier_connect(enum connman_service_type type)
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
                return;
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_GADGET:
        case CONNMAN_SERVICE_TYPE_WIFI:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        }
 
        if (__sync_fetch_and_add(&connected[type], 1) == 0) {
-               __connman_technology_set_connected(type, TRUE);
+               __connman_technology_set_connected(type, true);
                state_changed();
        }
 }
@@ -194,19 +193,20 @@ void __connman_notifier_disconnect(enum connman_service_type type)
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
                return;
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_GADGET:
        case CONNMAN_SERVICE_TYPE_WIFI:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        }
 
        if (__sync_fetch_and_sub(&connected[type], 1) != 1)
                return;
 
-       __connman_technology_set_connected(type, FALSE);
+       __connman_technology_set_connected(type, false);
        state_changed();
 }
 
@@ -239,7 +239,7 @@ void __connman_notifier_service_remove(struct connman_service *service)
 {
        GSList *list;
 
-       if (g_hash_table_lookup(service_hash, service) != NULL) {
+       if (g_hash_table_lookup(service_hash, service)) {
                /*
                 * This is a tempory check for consistency. It can be
                 * removed when there are no reports for the following
@@ -279,7 +279,7 @@ static void offlinemode_changed(dbus_bool_t enabled)
                                                DBUS_TYPE_BOOLEAN, &enabled);
 }
 
-void __connman_notifier_offlinemode(connman_bool_t enabled)
+void __connman_notifier_offlinemode(bool enabled)
 {
        GSList *list;
 
@@ -296,7 +296,7 @@ void __connman_notifier_offlinemode(connman_bool_t enabled)
        }
 }
 
-static void notify_idle_state(connman_bool_t idle)
+static void notify_idle_state(bool idle)
 {
        GSList *list;
 
@@ -315,7 +315,7 @@ void __connman_notifier_service_state_changed(struct connman_service *service,
 {
        GSList *list;
        unsigned int old_size;
-       connman_bool_t found;
+       bool found;
 
        for (list = notifier_list; list; list = list->next) {
                struct connman_notifier *notifier = list->data;
@@ -325,31 +325,31 @@ void __connman_notifier_service_state_changed(struct connman_service *service,
        }
 
        old_size = g_hash_table_size(service_hash);
-       found = g_hash_table_lookup(service_hash, service) != NULL;
+       found = g_hash_table_lookup(service_hash, service);
 
        switch (state) {
        case CONNMAN_SERVICE_STATE_UNKNOWN:
        case CONNMAN_SERVICE_STATE_FAILURE:
        case CONNMAN_SERVICE_STATE_DISCONNECT:
        case CONNMAN_SERVICE_STATE_IDLE:
-               if (found == FALSE)
+               if (!found)
                        break;
 
                g_hash_table_remove(service_hash, service);
                if (old_size == 1)
-                       notify_idle_state(TRUE);
+                       notify_idle_state(true);
 
                break;
        case CONNMAN_SERVICE_STATE_ASSOCIATION:
        case CONNMAN_SERVICE_STATE_CONFIGURATION:
        case CONNMAN_SERVICE_STATE_READY:
        case CONNMAN_SERVICE_STATE_ONLINE:
-               if (found == TRUE)
+               if (found)
                        break;
 
                g_hash_table_insert(service_hash, service, service);
                if (old_size == 0)
-                       notify_idle_state(FALSE);
+                       notify_idle_state(false);
 
                break;
        }
index b588c99..b4fe63a 100644 (file)
--- a/src/ntp.c
+++ b/src/ntp.c
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -93,6 +93,9 @@ struct ntp_msg {
 #define NTP_FLAG_MD_CONTROL    6
 #define NTP_FLAG_MD_PRIVATE    7
 
+#define NTP_FLAG_VN_VER3       3
+#define NTP_FLAG_VN_VER4       4
+
 #define NTP_FLAGS_ENCODE(li, vn, md)  ((uint8_t)( \
                       (((li) & NTP_FLAG_LI_MASK) << NTP_FLAG_LI_SHIFT) | \
                       (((vn) & NTP_FLAG_VN_MASK) << NTP_FLAG_VN_SHIFT) | \
@@ -114,15 +117,16 @@ static struct timespec mtx_time;
 static int transmit_fd = 0;
 
 static char *timeserver = NULL;
+static struct sockaddr_in timeserver_addr;
 static gint poll_id = 0;
 static gint timeout_id = 0;
 static guint retries = 0;
 
-static void send_packet(int fd, const char *server);
+static void send_packet(int fd, const char *server, uint32_t timeout);
 
 static void next_server(void)
 {
-       if (timeserver != NULL) {
+       if (timeserver) {
                g_free(timeserver);
                timeserver = NULL;
        }
@@ -132,17 +136,19 @@ static void next_server(void)
 
 static gboolean send_timeout(gpointer user_data)
 {
-       DBG("send timeout (retries %d)", retries);
+       uint32_t timeout = GPOINTER_TO_UINT(user_data);
+
+       DBG("send timeout %u (retries %d)", timeout, retries);
 
        if (retries++ == NTP_SEND_RETRIES)
                next_server();
        else
-               send_packet(transmit_fd, timeserver);
+               send_packet(transmit_fd, timeserver, timeout << 1);
 
        return FALSE;
 }
 
-static void send_packet(int fd, const char *server)
+static void send_packet(int fd, const char *server, uint32_t timeout)
 {
        struct ntp_msg msg;
        struct sockaddr_in addr;
@@ -156,7 +162,8 @@ static void send_packet(int fd, const char *server)
         *   msg.precision = (int)log2(ts.tv_sec + (ts.tv_nsec * 1.0e-9));
         */
        memset(&msg, 0, sizeof(msg));
-       msg.flags = NTP_FLAGS_ENCODE(NTP_FLAG_LI_NOTINSYNC, 4, NTP_FLAG_MD_CLIENT);
+       msg.flags = NTP_FLAGS_ENCODE(NTP_FLAG_LI_NOTINSYNC, NTP_FLAG_VN_VER4,
+           NTP_FLAG_MD_CLIENT);
        msg.poll = 4;   // min
        msg.poll = 10;  // max
        msg.precision = NTP_PRECISION_S;
@@ -190,28 +197,31 @@ static void send_packet(int fd, const char *server)
        }
 
        /*
-        * Add a retry timeout of two seconds to retry the existing
+        * Add an exponential retry timeout to retry the existing
         * request. After a set number of retries, we'll fallback to
         * trying another server.
         */
 
-       timeout_id = g_timeout_add_seconds(NTP_SEND_TIMEOUT, send_timeout, NULL);
+       timeout_id = g_timeout_add_seconds(timeout, send_timeout,
+                                       GUINT_TO_POINTER(timeout));
 }
 
 static gboolean next_poll(gpointer user_data)
 {
-       if (timeserver == NULL || transmit_fd == 0)
+       if (!timeserver || transmit_fd == 0)
                return FALSE;
 
-       send_packet(transmit_fd, timeserver);
+       send_packet(transmit_fd, timeserver, NTP_SEND_TIMEOUT);
 
        return FALSE;
 }
 
 static void reset_timeout(void)
 {
-       if (timeout_id > 0)
+       if (timeout_id > 0) {
                g_source_remove(timeout_id);
+               timeout_id = 0;
+       }
 
        retries = 0;
 }
@@ -229,7 +239,7 @@ static void decode_msg(void *base, size_t len, struct timeval *tv,
                return;
        }
 
-       if (tv == NULL) {
+       if (!tv) {
                connman_error("Invalid packet timestamp from time server");
                return;
        }
@@ -246,6 +256,17 @@ static void decode_msg(void *base, size_t len, struct timeval *tv,
                        msg->rootdisp.seconds, msg->rootdisp.fraction);
        DBG("reference  : 0x%04x", msg->refid);
 
+       if (!msg->stratum) {
+               /* RFC 4330 ch 8 Kiss-of-Death packet */
+               uint32_t code = ntohl(msg->refid);
+
+               connman_info("Skipping server %s KoD code %c%c%c%c",
+                       timeserver, code >> 24, code >> 16 & 0xff,
+                       code >> 8 & 0xff, code & 0xff);
+               next_server();
+               return;
+       }
+
        transmit_delay = LOGTOD(msg->poll);
 
        if (NTP_FLAGS_LI_DECODE(msg->flags) == NTP_FLAG_LI_NOTINSYNC) {
@@ -253,9 +274,15 @@ static void decode_msg(void *base, size_t len, struct timeval *tv,
                return;
        }
 
-       if (NTP_FLAGS_VN_DECODE(msg->flags) != 4) {
-               DBG("unsupported version %d", NTP_FLAGS_VN_DECODE(msg->flags));
-               return;
+
+       if (NTP_FLAGS_VN_DECODE(msg->flags) != NTP_FLAG_VN_VER4) {
+               if (NTP_FLAGS_VN_DECODE(msg->flags) == NTP_FLAG_VN_VER3) {
+                       DBG("requested version %d, accepting version %d",
+                               NTP_FLAG_VN_VER4, NTP_FLAGS_VN_DECODE(msg->flags));
+               } else {
+                       DBG("unsupported version %d", NTP_FLAGS_VN_DECODE(msg->flags));
+                       return;
+               }
        }
 
        if (NTP_FLAGS_MD_DECODE(msg->flags) != NTP_FLAG_MD_SERVER) {
@@ -335,6 +362,7 @@ static gboolean received_data(GIOChannel *channel, GIOCondition condition,
                                                        gpointer user_data)
 {
        unsigned char buf[128];
+       struct sockaddr_in sender_addr;
        struct msghdr msg;
        struct iovec iov;
        struct cmsghdr *cmsg;
@@ -360,11 +388,17 @@ static gboolean received_data(GIOChannel *channel, GIOCondition condition,
        msg.msg_iovlen = 1;
        msg.msg_control = aux;
        msg.msg_controllen = sizeof(aux);
+       msg.msg_name = &sender_addr;
+       msg.msg_namelen = sizeof(sender_addr);
 
        len = recvmsg(fd, &msg, MSG_DONTWAIT);
        if (len < 0)
                return TRUE;
 
+       if (timeserver_addr.sin_addr.s_addr != sender_addr.sin_addr.s_addr)
+               /* only accept messages from the timeserver */
+               return TRUE;
+
        tv = NULL;
        clock_gettime(CLOCK_MONOTONIC, &mrx_time);
 
@@ -390,7 +424,7 @@ static void start_ntp(char *server)
        struct sockaddr_in addr;
        int tos = IPTOS_LOWDELAY, timestamp = 1;
 
-       if (server == NULL)
+       if (!server)
                return;
 
        DBG("server %s", server);
@@ -427,7 +461,7 @@ static void start_ntp(char *server)
        }
 
        channel = g_io_channel_unix_new(transmit_fd);
-       if (channel == NULL) {
+       if (!channel) {
                close(transmit_fd);
                return;
        }
@@ -444,20 +478,21 @@ static void start_ntp(char *server)
        g_io_channel_unref(channel);
 
 send:
-       send_packet(transmit_fd, server);
+       send_packet(transmit_fd, server, NTP_SEND_TIMEOUT);
 }
 
 int __connman_ntp_start(char *server)
 {
        DBG("%s", server);
 
-       if (server == NULL)
+       if (!server)
                return -EINVAL;
 
-       if (timeserver != NULL)
+       if (timeserver)
                g_free(timeserver);
 
        timeserver = g_strdup(server);
+       timeserver_addr.sin_addr.s_addr = inet_addr(server);
 
        start_ntp(timeserver);
 
@@ -468,10 +503,12 @@ void __connman_ntp_stop()
 {
        DBG("");
 
-       if (poll_id > 0)
+       if (poll_id > 0) {
                g_source_remove(poll_id);
+               poll_id = 0;
+       }
 
-        reset_timeout();
+       reset_timeout();
 
        if (channel_watch > 0) {
                g_source_remove(channel_watch);
@@ -479,7 +516,7 @@ void __connman_ntp_stop()
                transmit_fd = 0;
        }
 
-       if (timeserver != NULL) {
+       if (timeserver) {
                g_free(timeserver);
                timeserver = NULL;
        }
diff --git a/src/peer.c b/src/peer.c
new file mode 100644 (file)
index 0000000..ce3b582
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2014  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <gdbus.h>
+
+#include "connman.h"
+
+static DBusConnection *connection = NULL;
+
+static GHashTable *peers_table = NULL;
+
+struct connman_peer {
+       char *identifier;
+       char *name;
+       char *path;
+};
+
+static void peer_free(gpointer data)
+{
+       struct connman_peer *peer = data;
+       connman_peer_destroy(peer);
+}
+
+static void append_properties(DBusMessageIter *iter, struct connman_peer *peer)
+{
+       const char *state = "disconnected";
+       DBusMessageIter dict;
+
+       connman_dbus_dict_open(iter, &dict);
+
+       connman_dbus_dict_append_basic(&dict, "State",
+                                       DBUS_TYPE_STRING, &state);
+       connman_dbus_dict_append_basic(&dict, "Name",
+                                       DBUS_TYPE_STRING, &peer->name);
+       connman_dbus_dict_append_dict(&dict, "IPv4", NULL, NULL);
+
+       connman_dbus_dict_close(iter, &dict);
+}
+
+static DBusMessage *get_peer_properties(DBusConnection *conn,
+                                               DBusMessage *msg, void *data)
+{
+       struct connman_peer *peer = data;
+       DBusMessageIter dict;
+       DBusMessage *reply;
+
+       reply = dbus_message_new_method_return(msg);
+       if (!reply)
+               return NULL;
+
+       dbus_message_iter_init_append(reply, &dict);
+       append_properties(&dict, peer);
+
+       return reply;
+}
+
+static void append_peer_struct(gpointer key, gpointer value,
+                                               gpointer user_data)
+{
+       DBusMessageIter *array = user_data;
+       struct connman_peer *peer = value;
+       DBusMessageIter entry;
+
+       dbus_message_iter_open_container(array, DBUS_TYPE_STRUCT,
+                                                       NULL, &entry);
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
+                                                       &peer->path);
+       append_properties(&entry, peer);
+       dbus_message_iter_close_container(array, &entry);
+}
+
+struct _peers_notify {
+       int id;
+       GHashTable *add;
+       GHashTable *remove;
+} *peers_notify;
+
+static void append_existing_and_new_peers(gpointer key,
+                                       gpointer value, gpointer user_data)
+{
+       struct connman_peer *peer = value;
+       DBusMessageIter *iter = user_data;
+       DBusMessageIter entry;
+
+       if (g_hash_table_lookup(peers_notify->add, peer->path)) {
+               DBG("new %s", peer->path);
+
+               append_peer_struct(key, value, user_data);
+               g_hash_table_remove(peers_notify->add, peer->path);
+       } else {
+               DBG("existing %s", peer->path);
+
+               dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT,
+                                                               NULL, &entry);
+               dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
+                                                               &peer->path);
+               dbus_message_iter_close_container(iter, &entry);
+       }
+}
+
+static void peer_append_all(DBusMessageIter *iter, void *user_data)
+{
+       g_hash_table_foreach(peers_table, append_existing_and_new_peers, iter);
+}
+
+static void append_removed(gpointer key, gpointer value, gpointer user_data)
+{
+       DBusMessageIter *iter = user_data;
+       char *objpath = key;
+
+       DBG("removed %s", objpath);
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &objpath);
+}
+
+static void peer_append_removed(DBusMessageIter *iter, void *user_data)
+{
+       g_hash_table_foreach(peers_notify->remove, append_removed, iter);
+}
+
+static gboolean peer_send_changed(gpointer data)
+{
+       DBusMessage *signal;
+
+       DBG("");
+
+       peers_notify->id = 0;
+
+       signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
+                               CONNMAN_MANAGER_INTERFACE, "PeersChanged");
+       if (!signal)
+               return FALSE;
+
+       __connman_dbus_append_objpath_dict_array(signal,
+                                               peer_append_all, NULL);
+       __connman_dbus_append_objpath_array(signal,
+                                               peer_append_removed, NULL);
+
+       dbus_connection_send(connection, signal, NULL);
+       dbus_message_unref(signal);
+
+       g_hash_table_remove_all(peers_notify->remove);
+       g_hash_table_remove_all(peers_notify->add);
+
+       return FALSE;
+}
+
+static void peer_schedule_changed(void)
+{
+       if (peers_notify->id != 0)
+               return;
+
+       peers_notify->id = g_timeout_add(100, peer_send_changed, NULL);
+}
+
+static void peer_added(struct connman_peer *peer)
+{
+       DBG("peer %p", peer);
+
+       g_hash_table_remove(peers_notify->remove, peer->path);
+       g_hash_table_replace(peers_notify->add, peer->path, peer);
+
+       peer_schedule_changed();
+}
+
+static void peer_removed(struct connman_peer *peer)
+{
+       DBG("peer %p", peer);
+
+       g_hash_table_remove(peers_notify->add, peer->path);
+       g_hash_table_replace(peers_notify->remove, g_strdup(peer->path), NULL);
+
+       peer_schedule_changed();
+}
+
+struct connman_peer *connman_peer_create(const char *identifier)
+{
+       struct connman_peer *peer;
+
+       peer = g_malloc0(sizeof(struct connman_peer));
+       peer->identifier = g_strdup_printf("peer_%s", identifier);
+
+       return peer;
+}
+
+void connman_peer_destroy(struct connman_peer *peer)
+{
+       if (!peer)
+               return;
+
+       if (peer->path) {
+               peer_removed(peer);
+               g_dbus_unregister_interface(connection, peer->path,
+                                               CONNMAN_PEER_INTERFACE);
+               g_free(peer->path);
+       }
+
+       g_free(peer->identifier);
+       g_free(peer->name);
+
+       g_free(peer);
+}
+
+void connman_peer_set_name(struct connman_peer *peer, const char *name)
+{
+       g_free(peer->name);
+       peer->name = g_strdup(name);
+}
+
+static const GDBusMethodTable peer_methods[] = {
+       { GDBUS_METHOD("GetProperties",
+                       NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
+                       get_peer_properties) },
+       { GDBUS_ASYNC_METHOD("Connect", NULL, NULL, NULL) },
+       { GDBUS_METHOD("Disconnect", NULL, NULL, NULL) },
+       { },
+};
+
+static const GDBusSignalTable peer_signals[] = {
+       { GDBUS_SIGNAL("PropertyChanged",
+                       GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
+       { },
+};
+
+int connman_peer_register(struct connman_peer *peer)
+{
+       DBG("peer %p", peer);
+
+       if (peer->path)
+               return -EALREADY;
+
+       peer->path = g_strdup_printf("%s/peer/%s", CONNMAN_PATH,
+                                               peer->identifier);
+       DBG("path %s", peer->path);
+
+       g_hash_table_insert(peers_table, peer->identifier, peer);
+
+       g_dbus_register_interface(connection, peer->path,
+                                       CONNMAN_PEER_INTERFACE,
+                                       peer_methods, peer_signals,
+                                       NULL, peer, NULL);
+       peer_added(peer);
+
+       return 0;
+}
+
+void connman_peer_unregister(struct connman_peer *peer)
+{
+       DBG("peer %p", peer);
+
+       if (peer->path)
+               g_hash_table_remove(peers_table, peer->identifier);
+       else
+               connman_peer_destroy(peer);
+}
+
+struct connman_peer *connman_peer_get(const char *identifier)
+{
+       char *ident = g_strdup_printf("peer_%s", identifier);
+       struct connman_peer *peer;
+
+       peer = g_hash_table_lookup(peers_table, ident);
+       g_free(ident);
+
+       return peer;
+}
+
+void __connman_peer_list_struct(DBusMessageIter *array)
+{
+       g_hash_table_foreach(peers_table, append_peer_struct, array);
+}
+
+int __connman_peer_init(void)
+{
+       DBG("");
+
+       connection = connman_dbus_get_connection();
+
+       peers_table = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                                       NULL, peer_free);
+
+       peers_notify = g_new0(struct _peers_notify, 1);
+       peers_notify->add = g_hash_table_new(g_str_hash, g_str_equal);
+       peers_notify->remove = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                                               g_free, NULL);
+       return 0;
+}
+
+void __connman_peer_cleanup(void)
+{
+       DBG("");
+
+       g_hash_table_destroy(peers_table);
+       dbus_connection_unref(connection);
+}
index adf8525..7d73058 100644 (file)
 
 #include "connman.h"
 
-/*
- * Plugins that are using libraries with threads and their own mainloop
- * will crash on exit. This is a bug inside these libraries, but there is
- * nothing much that can be done about it.
- */
-#ifdef NEED_THREADS
-#define PLUGINFLAG (RTLD_NOW | RTLD_NODELETE)
-#else
-#define PLUGINFLAG (RTLD_NOW)
-#endif
-
 static GSList *plugins = NULL;
 
 struct connman_plugin {
        void *handle;
-       gboolean active;
+       bool active;
        struct connman_plugin_desc *desc;
 };
 
@@ -60,35 +49,35 @@ static gint compare_priority(gconstpointer a, gconstpointer b)
        return plugin2->desc->priority - plugin1->desc->priority;
 }
 
-static gboolean add_plugin(void *handle, struct connman_plugin_desc *desc)
+static bool add_plugin(void *handle, struct connman_plugin_desc *desc)
 {
        struct connman_plugin *plugin;
 
-       if (desc->init == NULL)
-               return FALSE;
+       if (!desc->init)
+               return false;
 
-       if (g_str_equal(desc->version, CONNMAN_VERSION) == FALSE) {
+       if (!g_str_equal(desc->version, CONNMAN_VERSION)) {
                connman_error("Invalid version %s for %s", desc->version,
                                                        desc->description);
-               return FALSE;
+               return false;
        }
 
        plugin = g_try_new0(struct connman_plugin, 1);
-       if (plugin == NULL)
-               return FALSE;
+       if (!plugin)
+               return false;
 
        plugin->handle = handle;
-       plugin->active = FALSE;
+       plugin->active = false;
        plugin->desc = desc;
 
        __connman_log_enable(desc->debug_start, desc->debug_stop);
 
        plugins = g_slist_insert_sorted(plugins, plugin, compare_priority);
 
-       return TRUE;
+       return true;
 }
 
-static gboolean check_plugin(struct connman_plugin_desc *desc,
+static bool check_plugin(struct connman_plugin_desc *desc,
                                char **patterns, char **excludes)
 {
        if (excludes) {
@@ -97,7 +86,7 @@ static gboolean check_plugin(struct connman_plugin_desc *desc,
                                break;
                if (*excludes) {
                        connman_info("Excluding %s", desc->description);
-                       return FALSE;
+                       return false;
                }
        }
 
@@ -107,11 +96,11 @@ static gboolean check_plugin(struct connman_plugin_desc *desc,
                                break;
                if (!*patterns) {
                        connman_info("Ignoring %s", desc->description);
-                       return FALSE;
+                       return false;
                }
        }
 
-       return TRUE;
+       return true;
 }
 
 #include <builtin.h>
@@ -135,27 +124,26 @@ int __connman_plugin_init(const char *pattern, const char *exclude)
                excludes = g_strsplit_set(exclude, ":, ", -1);
 
        for (i = 0; __connman_builtin[i]; i++) {
-               if (check_plugin(__connman_builtin[i],
-                                               patterns, excludes) == FALSE)
+               if (!check_plugin(__connman_builtin[i], patterns, excludes))
                        continue;
 
                add_plugin(NULL, __connman_builtin[i]);
        }
 
        dir = g_dir_open(PLUGINDIR, 0, NULL);
-       if (dir != NULL) {
-               while ((file = g_dir_read_name(dir)) != NULL) {
+       if (dir) {
+               while ((file = g_dir_read_name(dir))) {
                        void *handle;
                        struct connman_plugin_desc *desc;
 
-                       if (g_str_has_prefix(file, "lib") == TRUE ||
-                                       g_str_has_suffix(file, ".so") == FALSE)
+                       if (g_str_has_prefix(file, "lib") ||
+                                       !g_str_has_suffix(file, ".so"))
                                continue;
 
                        filename = g_build_filename(PLUGINDIR, file, NULL);
 
-                       handle = dlopen(filename, PLUGINFLAG);
-                       if (handle == NULL) {
+                       handle = dlopen(filename, RTLD_NOW);
+                       if (!handle) {
                                connman_error("Can't load %s: %s",
                                                        filename, dlerror());
                                g_free(filename);
@@ -165,19 +153,19 @@ int __connman_plugin_init(const char *pattern, const char *exclude)
                        g_free(filename);
 
                        desc = dlsym(handle, "connman_plugin_desc");
-                       if (desc == NULL) {
+                       if (!desc) {
                                connman_error("Can't load symbol: %s",
                                                                dlerror());
                                dlclose(handle);
                                continue;
                        }
 
-                       if (check_plugin(desc, patterns, excludes) == FALSE) {
+                       if (!check_plugin(desc, patterns, excludes)) {
                                dlclose(handle);
                                continue;
                        }
 
-                       if (add_plugin(handle, desc) == FALSE)
+                       if (!add_plugin(handle, desc))
                                dlclose(handle);
                }
 
@@ -190,7 +178,7 @@ int __connman_plugin_init(const char *pattern, const char *exclude)
                if (plugin->desc->init() < 0)
                        continue;
 
-               plugin->active = TRUE;
+               plugin->active = true;
        }
 
        g_strfreev(patterns);
@@ -208,10 +196,10 @@ void __connman_plugin_cleanup(void)
        for (list = plugins; list; list = list->next) {
                struct connman_plugin *plugin = list->data;
 
-               if (plugin->active == TRUE && plugin->desc->exit)
+               if (plugin->active && plugin->desc->exit)
                        plugin->desc->exit();
 
-               if (plugin->handle != NULL)
+               if (plugin->handle)
                        dlclose(plugin->handle);
 
                g_free(plugin);
index 1c36017..693552e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -40,6 +40,7 @@ static GSList *driver_list = NULL;
 
 struct connman_provider {
        int refcount;
+       bool immutable;
        struct connman_service *vpn_service;
        int index;
        char *identifier;
@@ -53,22 +54,22 @@ void __connman_provider_append_properties(struct connman_provider *provider,
 {
        const char *host, *domain, *type;
 
-       if (provider->driver == NULL || provider->driver->get_property == NULL)
+       if (!provider->driver || !provider->driver->get_property)
                return;
 
        host = provider->driver->get_property(provider, "Host");
        domain = provider->driver->get_property(provider, "Domain");
        type = provider->driver->get_property(provider, "Type");
 
-       if (host != NULL)
+       if (host)
                connman_dbus_dict_append_basic(iter, "Host",
                                        DBUS_TYPE_STRING, &host);
 
-       if (domain != NULL)
+       if (domain)
                connman_dbus_dict_append_basic(iter, "Domain",
                                        DBUS_TYPE_STRING, &domain);
 
-       if (type != NULL)
+       if (type)
                connman_dbus_dict_append_basic(iter, "Type", DBUS_TYPE_STRING,
                                                 &type);
 }
@@ -87,7 +88,7 @@ connman_provider_ref_debug(struct connman_provider *provider,
 
 static void provider_remove(struct connman_provider *provider)
 {
-       if (provider->driver != NULL) {
+       if (provider->driver) {
                provider->driver->remove(provider);
                provider->driver = NULL;
        }
@@ -131,12 +132,12 @@ int connman_provider_disconnect(struct connman_provider *provider)
 
        DBG("provider %p", provider);
 
-       if (provider->driver != NULL && provider->driver->disconnect != NULL)
+       if (provider->driver && provider->driver->disconnect)
                err = provider->driver->disconnect(provider);
        else
                return -EOPNOTSUPP;
 
-       if (provider->vpn_service != NULL)
+       if (provider->vpn_service)
                provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_DISCONNECT);
 
@@ -169,9 +170,9 @@ int __connman_provider_connect(struct connman_provider *provider)
 
        DBG("provider %p", provider);
 
-       if (provider->driver != NULL && provider->driver->connect != NULL) {
+       if (provider->driver && provider->driver->connect)
                err = provider->driver->connect(provider);
-       else
+       else
                return -EOPNOTSUPP;
 
        if (err < 0) {
@@ -196,11 +197,11 @@ int __connman_provider_remove_by_path(const char *path)
        DBG("path %s", path);
 
        g_hash_table_iter_init(&iter, provider_hash);
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                const char *srv_path;
                provider = value;
 
-               if (provider->vpn_service == NULL)
+               if (!provider->vpn_service)
                        continue;
 
                srv_path = __connman_service_get_path(provider->vpn_service);
@@ -223,18 +224,18 @@ int __connman_provider_remove_by_path(const char *path)
 }
 
 static int set_connected(struct connman_provider *provider,
-                                       connman_bool_t connected)
+                                       bool connected)
 {
        struct connman_service *service = provider->vpn_service;
        struct connman_ipconfig *ipconfig;
 
-       if (service == NULL)
+       if (!service)
                return -ENODEV;
 
        ipconfig = __connman_service_get_ipconfig(service, provider->family);
 
-       if (connected == TRUE) {
-               if (ipconfig == NULL) {
+       if (connected) {
+               if (!ipconfig) {
                        provider_indicate_state(provider,
                                                CONNMAN_SERVICE_STATE_FAILURE);
                        return -EIO;
@@ -246,12 +247,12 @@ static int set_connected(struct connman_provider *provider,
                provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_READY);
 
-               if (provider->driver != NULL && provider->driver->set_routes)
+               if (provider->driver && provider->driver->set_routes)
                        provider->driver->set_routes(provider,
                                                CONNMAN_PROVIDER_ROUTE_ALL);
 
        } else {
-               if (ipconfig != NULL) {
+               if (ipconfig) {
                        provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_DISCONNECT);
                        __connman_ipconfig_gateway_remove(ipconfig);
@@ -267,19 +268,19 @@ static int set_connected(struct connman_provider *provider,
 int connman_provider_set_state(struct connman_provider *provider,
                                        enum connman_provider_state state)
 {
-       if (provider == NULL || provider->vpn_service == NULL)
+       if (!provider || !provider->vpn_service)
                return -EINVAL;
 
        switch (state) {
        case CONNMAN_PROVIDER_STATE_UNKNOWN:
                return -EINVAL;
        case CONNMAN_PROVIDER_STATE_IDLE:
-               return set_connected(provider, FALSE);
+               return set_connected(provider, false);
        case CONNMAN_PROVIDER_STATE_CONNECT:
                return provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_ASSOCIATION);
        case CONNMAN_PROVIDER_STATE_READY:
-               return set_connected(provider, TRUE);
+               return set_connected(provider, true);
        case CONNMAN_PROVIDER_STATE_DISCONNECT:
                return provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_DISCONNECT);
@@ -317,17 +318,17 @@ int connman_provider_indicate_error(struct connman_provider *provider,
 
 int connman_provider_create_service(struct connman_provider *provider)
 {
-       if (provider->vpn_service != NULL) {
-               connman_bool_t connected;
+       if (provider->vpn_service) {
+               bool connected;
 
                connected = __connman_service_is_connected_state(
                        provider->vpn_service, CONNMAN_IPCONFIG_TYPE_IPV4);
-               if (connected == TRUE)
+               if (connected)
                        return -EALREADY;
 
                connected = __connman_service_is_connected_state(
                        provider->vpn_service, CONNMAN_IPCONFIG_TYPE_IPV6);
-               if (connected == TRUE)
+               if (connected)
                        return -EALREADY;
 
                return 0;
@@ -336,7 +337,7 @@ int connman_provider_create_service(struct connman_provider *provider)
        provider->vpn_service =
                __connman_service_create_from_provider(provider);
 
-       if (provider->vpn_service == NULL) {
+       if (!provider->vpn_service) {
                connman_warn("service creation failed for provider %s",
                        provider->identifier);
 
@@ -347,17 +348,24 @@ int connman_provider_create_service(struct connman_provider *provider)
        return 0;
 }
 
+bool __connman_provider_is_immutable(struct connman_provider *provider)
+
+{
+       if (provider)
+               return provider->immutable;
+
+       return false;
+}
+
 int connman_provider_set_immutable(struct connman_provider *provider,
-                                               connman_bool_t immutable)
+                                               bool immutable)
 {
-       if (provider == NULL)
+       if (!provider)
                return -EINVAL;
 
-       if (provider->vpn_service == NULL)
-               return -ESRCH;
+       provider->immutable = immutable;
 
-       return __connman_service_set_immutable(provider->vpn_service,
-                                               immutable);
+       return 0;
 }
 
 static struct connman_provider *provider_lookup(const char *identifier)
@@ -374,15 +382,15 @@ static void connection_ready(DBusMessage *msg, int error_code, void *user_data)
 
        if (error_code != 0) {
                reply = __connman_error_failed(msg, -error_code);
-               if (g_dbus_send_message(connection, reply) == FALSE)
+               if (!g_dbus_send_message(connection, reply))
                        DBG("reply %p send failed", reply);
        } else {
                const char *path;
                struct connman_provider *provider;
 
                provider = provider_lookup(identifier);
-               if (provider == NULL) {
-                       reply = __connman_error_failed(msg, -EINVAL);
+               if (!provider) {
+                       reply = __connman_error_failed(msg, EINVAL);
                        g_dbus_send_message(connection, reply);
                        return;
                }
@@ -399,11 +407,11 @@ int __connman_provider_create_and_connect(DBusMessage *msg)
 {
        struct connman_provider_driver *driver;
 
-       if (driver_list == NULL)
+       if (!driver_list)
                return -EINVAL;
 
        driver = driver_list->data;
-       if (driver == NULL || driver->create == NULL)
+       if (!driver || !driver->create)
                return -EINVAL;
 
        DBG("msg %p", msg);
@@ -411,9 +419,9 @@ int __connman_provider_create_and_connect(DBusMessage *msg)
        return driver->create(msg, connection_ready);
 }
 
-const char * __connman_provider_get_ident(struct connman_provider *provider)
+const char *__connman_provider_get_ident(struct connman_provider *provider)
 {
-       if (provider == NULL)
+       if (!provider)
                return NULL;
 
        return provider->identifier;
@@ -422,7 +430,7 @@ const char * __connman_provider_get_ident(struct connman_provider *provider)
 int connman_provider_set_string(struct connman_provider *provider,
                                        const char *key, const char *value)
 {
-       if (provider->driver != NULL && provider->driver->set_property)
+       if (provider->driver && provider->driver->set_property)
                return provider->driver->set_property(provider, key, value);
 
        return 0;
@@ -431,22 +439,22 @@ int connman_provider_set_string(struct connman_provider *provider,
 const char *connman_provider_get_string(struct connman_provider *provider,
                                                        const char *key)
 {
-       if (provider->driver != NULL && provider->driver->get_property)
+       if (provider->driver && provider->driver->get_property)
                return provider->driver->get_property(provider, key);
 
        return NULL;
 }
 
-connman_bool_t
+bool
 __connman_provider_check_routes(struct connman_provider *provider)
 {
-       if (provider == NULL)
-               return FALSE;
+       if (!provider)
+               return false;
 
-       if (provider->driver != NULL && provider->driver->check_routes)
+       if (provider->driver && provider->driver->check_routes)
                return provider->driver->check_routes(provider);
 
-       return FALSE;
+       return false;
 }
 
 void *connman_provider_get_data(struct connman_provider *provider)
@@ -466,16 +474,16 @@ void connman_provider_set_index(struct connman_provider *provider, int index)
 
        DBG("");
 
-       if (service == NULL)
+       if (!service)
                return;
 
        ipconfig = __connman_service_get_ip4config(service);
 
-       if (ipconfig == NULL) {
+       if (!ipconfig) {
                connman_service_create_ip4config(service, index);
 
                ipconfig = __connman_service_get_ip4config(service);
-               if (ipconfig == NULL) {
+               if (!ipconfig) {
                        DBG("Couldnt create ipconfig");
                        goto done;
                }
@@ -486,11 +494,11 @@ void connman_provider_set_index(struct connman_provider *provider, int index)
 
        ipconfig = __connman_service_get_ip6config(service);
 
-       if (ipconfig == NULL) {
+       if (!ipconfig) {
                connman_service_create_ip6config(service, index);
 
                ipconfig = __connman_service_get_ip6config(service);
-               if (ipconfig == NULL) {
+               if (!ipconfig) {
                        DBG("Couldnt create ipconfig for IPv6");
                        goto done;
                }
@@ -515,7 +523,7 @@ int connman_provider_set_ipaddress(struct connman_provider *provider,
 
        ipconfig = __connman_service_get_ipconfig(provider->vpn_service,
                                                        ipaddress->family);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -EINVAL;
 
        provider->family = ipaddress->family;
@@ -552,7 +560,7 @@ int connman_provider_set_domain(struct connman_provider *provider,
 }
 
 int connman_provider_set_nameservers(struct connman_provider *provider,
-                                       char * const * nameservers)
+                                       char * const *nameservers)
 {
        int i;
 
@@ -560,12 +568,12 @@ int connman_provider_set_nameservers(struct connman_provider *provider,
 
        __connman_service_nameserver_clear(provider->vpn_service);
 
-       if (nameservers == NULL)
+       if (!nameservers)
                return 0;
 
-       for (i = 0; nameservers[i] != NULL; i++)
+       for (i = 0; nameservers[i]; i++)
                __connman_service_nameserver_append(provider->vpn_service,
-                                               nameservers[i], FALSE);
+                                               nameservers[i], false);
 
        return 0;
 }
@@ -576,7 +584,7 @@ static void unregister_provider(gpointer data)
 
        DBG("provider %p service %p", provider, provider->vpn_service);
 
-       if (provider->vpn_service != NULL) {
+       if (provider->vpn_service) {
                connman_service_unref(provider->vpn_service);
                provider->vpn_service = NULL;
        }
@@ -619,11 +627,11 @@ static void provider_disconnect_all(gpointer key, gpointer value,
        connman_provider_disconnect(provider);
 }
 
-static void provider_offline_mode(connman_bool_t enabled)
+static void provider_offline_mode(bool enabled)
 {
        DBG("enabled %d", enabled);
 
-       if (enabled == TRUE)
+       if (enabled)
                g_hash_table_foreach(provider_hash, provider_disconnect_all,
                                                                        NULL);
 
@@ -642,7 +650,7 @@ static struct connman_provider *provider_new(void)
        struct connman_provider *provider;
 
        provider = g_try_new0(struct connman_provider, 1);
-       if (provider == NULL)
+       if (!provider)
                return NULL;
 
        provider->refcount = 1;
@@ -658,11 +666,11 @@ struct connman_provider *connman_provider_get(const char *identifier)
        struct connman_provider *provider;
 
        provider = g_hash_table_lookup(provider_hash, identifier);
-       if (provider != NULL)
+       if (provider)
                return provider;
 
        provider = provider_new();
-       if (provider == NULL)
+       if (!provider)
                return NULL;
 
        DBG("provider %p", provider);
@@ -686,7 +694,7 @@ static struct connman_provider *provider_get(int index)
 
        g_hash_table_iter_init(&iter, provider_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct connman_provider *provider = value;
 
                if (provider->index == index)
@@ -702,7 +710,7 @@ static void provider_service_changed(struct connman_service *service,
        struct connman_provider *provider;
        int vpn_index, service_index;
 
-       if (service == NULL)
+       if (!service)
                return;
 
        switch (state) {
@@ -730,7 +738,7 @@ static void provider_service_changed(struct connman_service *service,
                return;
 
        provider = provider_get(vpn_index);
-       if (provider == NULL)
+       if (!provider)
                return;
 
        DBG("disconnect %p index %d", provider, vpn_index);
index b6775b6..0d1a25a 100644 (file)
@@ -69,7 +69,7 @@ static gboolean lookup_callback(gpointer user_data)
        struct proxy_lookup *lookup = user_data;
        GSList *list;
 
-       if (lookup == NULL)
+       if (!lookup)
                return FALSE;
 
        lookup->watch = 0;
@@ -77,14 +77,14 @@ static gboolean lookup_callback(gpointer user_data)
        for (list = driver_list; list; list = list->next) {
                struct connman_proxy_driver *proxy = list->data;
 
-               if (proxy->request_lookup == NULL)
+               if (!proxy->request_lookup)
                        continue;
 
                lookup->proxy = proxy;
                break;
        }
 
-       if (lookup->proxy == NULL ||
+       if (!lookup->proxy ||
                lookup->proxy->request_lookup(lookup->service,
                                                lookup->url) < 0) {
 
@@ -106,11 +106,11 @@ unsigned int connman_proxy_lookup(const char *interface, const char *url,
 
        DBG("interface %s url %s", interface, url);
 
-       if (interface == NULL)
+       if (!interface)
                return 0;
 
        lookup = g_try_new0(struct proxy_lookup, 1);
-       if (lookup == NULL)
+       if (!lookup)
                return 0;
 
        lookup->token = next_lookup_token++;
@@ -149,14 +149,14 @@ void connman_proxy_lookup_cancel(unsigned int token)
                lookup = NULL;
        }
 
-       if (lookup != NULL) {
+       if (lookup) {
                if (lookup->watch > 0) {
                        g_source_remove(lookup->watch);
                        lookup->watch = 0;
                }
 
-               if (lookup->proxy != NULL &&
-                                       lookup->proxy->cancel_lookup != NULL)
+               if (lookup->proxy &&
+                                       lookup->proxy->cancel_lookup)
                        lookup->proxy->cancel_lookup(lookup->service,
                                                                lookup->url);
 
@@ -165,7 +165,7 @@ void connman_proxy_lookup_cancel(unsigned int token)
 }
 
 void connman_proxy_driver_lookup_notify(struct connman_service *service,
-                                        const char *url, const char *result)
+                                       const char *url, const char *result)
 {
        GSList *list, *matches = NULL;
 
@@ -185,7 +185,7 @@ void connman_proxy_driver_lookup_notify(struct connman_service *service,
                }
        }
 
-       if (matches != NULL)
+       if (matches)
                remove_lookups(matches);
 }
 
index b965778..01e7c0e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -54,7 +54,7 @@ struct entry_data {
 };
 
 static GSList *entry_list = NULL;
-static connman_bool_t dnsproxy_enabled = FALSE;
+static bool dnsproxy_enabled = false;
 
 struct resolvfile_entry {
        int index;
@@ -168,7 +168,7 @@ int __connman_resolvfile_append(int index, const char *domain,
                return -ENOENT;
 
        entry = g_try_new0(struct resolvfile_entry, 1);
-       if (entry == NULL)
+       if (!entry)
                return -ENOMEM;
 
        entry->index = index;
@@ -193,7 +193,7 @@ int __connman_resolvfile_remove(int index, const char *domain,
                if (index >= 0 && entry->index != index)
                        continue;
 
-               if (domain != NULL && g_strcmp0(entry->domain, domain) != 0)
+               if (domain && g_strcmp0(entry->domain, domain) != 0)
                        continue;
 
                if (g_strcmp0(entry->server, server) != 0)
@@ -207,6 +207,57 @@ int __connman_resolvfile_remove(int index, const char *domain,
        return resolvfile_export();
 }
 
+static void append_fallback_nameservers(void)
+{
+       GSList *list;
+
+       for (list = entry_list; list; list = list->next) {
+               struct entry_data *entry = list->data;
+
+               if (entry->index >= 0 && entry->server)
+                       return;
+       }
+
+       for (list = entry_list; list; list = list->next) {
+               struct entry_data *entry = list->data;
+
+               if (entry->index != -1 || !entry->server)
+                       continue;
+
+               DBG("index %d server %s", entry->index, entry->server);
+
+               if (dnsproxy_enabled) {
+                       __connman_dnsproxy_append(entry->index, entry->domain,
+                                       entry->server);
+               } else {
+                       __connman_resolvfile_append(entry->index,
+                                       entry->domain, entry->server);
+               }
+       }
+}
+
+static void remove_fallback_nameservers(void)
+{
+       GSList *list;
+
+       for (list = entry_list; list; list = list->next) {
+               struct entry_data *entry = list->data;
+
+               if (entry->index >= 0 || !entry->server)
+                       continue;
+
+               DBG("index %d server %s", entry->index, entry->server);
+
+               if (dnsproxy_enabled) {
+                       __connman_dnsproxy_remove(entry->index, entry->domain,
+                                       entry->server);
+               } else {
+                       __connman_resolvfile_remove(entry->index,
+                                       entry->domain, entry->server);
+               }
+       }
+}
+
 static void remove_entries(GSList *entries)
 {
        GSList *list;
@@ -216,7 +267,7 @@ static void remove_entries(GSList *entries)
 
                entry_list = g_slist_remove(entry_list, entry);
 
-               if (dnsproxy_enabled == TRUE) {
+               if (dnsproxy_enabled) {
                        __connman_dnsproxy_remove(entry->index, entry->domain,
                                                        entry->server);
                } else {
@@ -247,9 +298,9 @@ static gboolean resolver_expire_cb(gpointer user_data)
        if (entry->index >= 0) {
                struct connman_service *service;
                service = __connman_service_lookup_from_index(entry->index);
-               if (service != NULL)
+               if (service)
                        __connman_service_nameserver_remove(service,
-                                                       entry->server, TRUE);
+                                                       entry->server, true);
        }
 
        remove_entries(list);
@@ -277,12 +328,12 @@ static gboolean resolver_refresh_cb(gpointer user_data)
 
        if (entry->index >= 0) {
                service = __connman_service_lookup_from_index(entry->index);
-               if (service != NULL) {
+               if (service) {
                        /*
                         * Send Router Solicitation to refresh RDNSS entries
                         * before their lifetime expires
                         */
-                       __connman_refresh_rs_ipv6(
+                       __connman_network_refresh_rs_ipv6(
                                        __connman_service_get_network(service),
                                        entry->index);
                }
@@ -300,11 +351,11 @@ static int append_resolver(int index, const char *domain,
        DBG("index %d domain %s server %s lifetime %d flags %d",
                                index, domain, server, lifetime, flags);
 
-       if (server == NULL && domain == NULL)
+       if (!server && !domain)
                return -EINVAL;
 
        entry = g_try_new0(struct entry_data, 1);
-       if (entry == NULL)
+       if (!entry)
                return -ENOMEM;
 
        entry->index = index;
@@ -313,7 +364,7 @@ static int append_resolver(int index, const char *domain,
        entry->flags = flags;
        entry->lifetime = lifetime;
 
-       if (server != NULL)
+       if (server)
                entry->family = connman_inet_check_ipaddress(server);
 
        if (lifetime) {
@@ -330,17 +381,21 @@ static int append_resolver(int index, const char *domain,
                 * We update the service only for those nameservers
                 * that are automagically added via netlink (lifetime > 0)
                 */
-               if (server != NULL && entry->index >= 0) {
+               if (server && entry->index >= 0) {
                        struct connman_service *service;
                        service = __connman_service_lookup_from_index(entry->index);
-                       if (service != NULL)
+                       if (service)
                                __connman_service_nameserver_append(service,
-                                                               server, TRUE);
+                                                               server, true);
                }
        }
+
+       if (entry->index >= 0 && entry->server)
+               remove_fallback_nameservers();
+
        entry_list = g_slist_append(entry_list, entry);
 
-       if (dnsproxy_enabled == TRUE)
+       if (dnsproxy_enabled)
                __connman_dnsproxy_append(entry->index, domain, server);
        else
                __connman_resolvfile_append(entry->index, domain, server);
@@ -363,7 +418,7 @@ int connman_resolver_append(int index, const char *domain,
 
        DBG("index %d domain %s server %s", index, domain, server);
 
-       if (server == NULL && domain == NULL)
+       if (!server && !domain)
                return -EINVAL;
 
        for (list = entry_list; list; list = list->next) {
@@ -374,8 +429,13 @@ int connman_resolver_append(int index, const char *domain,
 
                if (entry->index == index &&
                                g_strcmp0(entry->domain, domain) == 0 &&
-                               g_strcmp0(entry->server, server) == 0)
+                               g_strcmp0(entry->server, server) == 0) {
+                       if (dnsproxy_enabled)
+                               __connman_dnsproxy_append(entry->index, domain,
+                                               server);
+
                        return -EEXIST;
+               }
        }
 
        return append_resolver(index, domain, server, 0, 0);
@@ -399,7 +459,7 @@ int connman_resolver_append_lifetime(int index, const char *domain,
        DBG("index %d domain %s server %s lifetime %d",
                                index, domain, server, lifetime);
 
-       if (server == NULL && domain == NULL)
+       if (!server && !domain)
                return -EINVAL;
 
        for (list = entry_list; list; list = list->next) {
@@ -462,7 +522,7 @@ int connman_resolver_remove(int index, const char *domain, const char *server)
                break;
        }
 
-       if (matches == NULL)
+       if (!matches)
                return -ENOENT;
 
        remove_entries(matches);
@@ -494,7 +554,7 @@ int connman_resolver_remove_all(int index)
                matches = g_slist_prepend(matches, entry);
        }
 
-       if (matches == NULL)
+       if (!matches)
                return -ENOENT;
 
        remove_entries(matches);
@@ -509,7 +569,9 @@ int connman_resolver_remove_all(int index)
  */
 void connman_resolver_flush(void)
 {
-       if (dnsproxy_enabled == TRUE)
+       append_fallback_nameservers();
+
+       if (dnsproxy_enabled)
                __connman_dnsproxy_flush();
 
        return;
@@ -519,7 +581,7 @@ int __connman_resolver_redo_servers(int index)
 {
        GSList *list;
 
-       if (dnsproxy_enabled == FALSE)
+       if (!dnsproxy_enabled)
                return 0;
 
        DBG("index %d", index);
@@ -578,14 +640,14 @@ static void free_resolvfile(gpointer data)
        g_free(entry);
 }
 
-int __connman_resolver_init(connman_bool_t dnsproxy)
+int __connman_resolver_init(gboolean dnsproxy)
 {
        int i;
        char **ns;
 
        DBG("dnsproxy %d", dnsproxy);
 
-       if (dnsproxy == FALSE)
+       if (!dnsproxy)
                return 0;
 
        if (__connman_dnsproxy_init() < 0) {
@@ -593,10 +655,10 @@ int __connman_resolver_init(connman_bool_t dnsproxy)
                return 0;
        }
 
-       dnsproxy_enabled = TRUE;
+       dnsproxy_enabled = true;
 
        ns = connman_setting_get_string_list("FallbackNameservers");
-       for (i = 0; ns != NULL && ns[i] != NULL; i += 1) {
+       for (i = 0; ns && ns[i]; i += 1) {
                DBG("server %s", ns[i]);
                append_resolver(-1, NULL, ns[i], 0, RESOLVER_FLAG_PUBLIC);
        }
@@ -608,7 +670,7 @@ void __connman_resolver_cleanup(void)
 {
        DBG("");
 
-       if (dnsproxy_enabled == TRUE)
+       if (dnsproxy_enabled)
                __connman_dnsproxy_cleanup();
        else {
                GList *list;
index e21b2a1..960cfea 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -88,6 +88,7 @@ static enum rfkill_type convert_service_type(enum connman_service_type type)
        case CONNMAN_SERVICE_TYPE_ETHERNET:
        case CONNMAN_SERVICE_TYPE_VPN:
        case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
                return NUM_RFKILL_TYPES;
        }
@@ -141,8 +142,7 @@ static GIOStatus rfkill_process(GIOChannel *chan)
        return status;
 }
 
-static gboolean rfkill_event(GIOChannel *chan,
-                               GIOCondition cond, gpointer data)
+static gboolean rfkill_event(GIOChannel *chan, GIOCondition cond, gpointer data)
 {
        if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
                return FALSE;
@@ -155,7 +155,7 @@ static gboolean rfkill_event(GIOChannel *chan,
 
 static GIOChannel *channel = NULL;
 
-int __connman_rfkill_block(enum connman_service_type type, connman_bool_t block)
+int __connman_rfkill_block(enum connman_service_type type, bool block)
 {
        uint8_t rfkill_type;
        struct rfkill_event event;
@@ -225,7 +225,7 @@ void __connman_rfkill_cleanup(void)
 {
        DBG("");
 
-       if (channel == NULL)
+       if (!channel)
                return;
 
        g_io_channel_shutdown(channel, TRUE, NULL);
index af8ab70..a46aa28 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -65,7 +65,6 @@ static guint update_timeout = 0;
 
 struct interface_data {
        int index;
-       char *name;
        char *ident;
        enum connman_service_type service_type;
        enum connman_device_type device_type;
@@ -78,53 +77,54 @@ static void free_interface(gpointer data)
        struct interface_data *interface = data;
 
        __connman_technology_remove_interface(interface->service_type,
-                       interface->index, interface->name, interface->ident);
+                       interface->index, interface->ident);
 
        g_free(interface->ident);
-       g_free(interface->name);
        g_free(interface);
 }
 
-static connman_bool_t ether_blacklisted(const char *name)
+static bool ether_blacklisted(const char *name)
 {
-       if (name == NULL)
-               return TRUE;
+       if (!name)
+               return true;
 
-       if (__connman_device_isfiltered(name) == TRUE)
-               return TRUE;
+       if (__connman_device_isfiltered(name))
+               return true;
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t wext_interface(char *ifname)
+static bool wext_interface(char *ifname)
 {
        struct iwreq wrq;
        int fd, err;
 
        fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (fd < 0)
-               return FALSE;
+               return false;
 
        memset(&wrq, 0, sizeof(wrq));
-       strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
+       strncpy(wrq.ifr_name, ifname, sizeof(wrq.ifr_name) - 1);
 
        err = ioctl(fd, SIOCGIWNAME, &wrq);
 
        close(fd);
 
        if (err < 0)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static void read_uevent(struct interface_data *interface)
 {
-       char *filename, line[128];
-       connman_bool_t found_devtype;
+       char *filename, *name, line[128];
+       bool found_devtype;
        FILE *f;
 
-       if (ether_blacklisted(interface->name) == TRUE) {
+       name = connman_inet_ifname(interface->index);
+
+       if (ether_blacklisted(name)) {
                interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
                interface->device_type = CONNMAN_DEVICE_TYPE_UNKNOWN;
        } else {
@@ -132,29 +132,31 @@ static void read_uevent(struct interface_data *interface)
                interface->device_type = CONNMAN_DEVICE_TYPE_ETHERNET;
        }
 
-       filename = g_strdup_printf("/sys/class/net/%s/uevent",
-                                               interface->name);
+       filename = g_strdup_printf("/sys/class/net/%s/uevent", name);
 
        f = fopen(filename, "re");
 
        g_free(filename);
 
-       if (f == NULL)
-               return;
+       if (!f) {
+               interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
+               interface->device_type = CONNMAN_DEVICE_TYPE_UNKNOWN;
+               goto out;
+       }
 
-       found_devtype = FALSE;
+       found_devtype = false;
        while (fgets(line, sizeof(line), f)) {
                char *pos;
 
                pos = strchr(line, '\n');
-               if (pos == NULL)
+               if (!pos)
                        continue;
                pos[0] = '\0';
 
                if (strncmp(line, "DEVTYPE=", 8) != 0)
                        continue;
 
-               found_devtype = TRUE;
+               found_devtype = true;
 
                if (strcmp(line + 8, "wlan") == 0) {
                        interface->service_type = CONNMAN_SERVICE_TYPE_WIFI;
@@ -178,16 +180,18 @@ static void read_uevent(struct interface_data *interface)
        fclose(f);
 
        if (found_devtype)
-               return;
+               goto out;
 
        /* We haven't got a DEVTYPE, let's check if it's a wireless device */
-       if (wext_interface(interface->name)) {
+       if (wext_interface(name)) {
                interface->service_type = CONNMAN_SERVICE_TYPE_WIFI;
                interface->device_type = CONNMAN_DEVICE_TYPE_WIFI;
 
-               connman_error("%s runs an unsupported 802.11 driver",
-                               interface->name);
+               connman_error("%s runs an unsupported 802.11 driver", name);
        }
+
+out:
+       g_free(name);
 }
 
 enum connman_device_type __connman_rtnl_get_device_type(int index)
@@ -196,7 +200,7 @@ enum connman_device_type __connman_rtnl_get_device_type(int index)
 
        interface = g_hash_table_lookup(interface_list,
                                        GINT_TO_POINTER(index));
-       if (interface == NULL)
+       if (!interface)
                return CONNMAN_DEVICE_TYPE_UNKNOWN;
 
        return interface->device_type;
@@ -218,7 +222,7 @@ unsigned int connman_rtnl_add_newlink_watch(int index,
        struct watch_data *watch;
 
        watch = g_try_new0(struct watch_data, 1);
-       if (watch == NULL)
+       if (!watch)
                return 0;
 
        watch->id = ++watch_id;
@@ -283,7 +287,7 @@ static void trigger_rtnl(int index, void *user_data)
                        __connman_ipconfig_get_gateway_from_index(index,
                                        CONNMAN_IPCONFIG_TYPE_ALL);
 
-               if (gateway != NULL)
+               if (gateway)
                        rtnl->newgateway(index, gateway);
        }
 }
@@ -353,7 +357,7 @@ static const char *operstate2str(unsigned char operstate)
        return "";
 }
 
-static connman_bool_t extract_link(struct ifinfomsg *msg, int bytes,
+static bool extract_link(struct ifinfomsg *msg, int bytes,
                                struct ether_addr *address, const char **ifname,
                                unsigned int *mtu, unsigned char *operstate,
                                struct rtnl_link_stats *stats)
@@ -364,41 +368,40 @@ static connman_bool_t extract_link(struct ifinfomsg *msg, int bytes,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case IFLA_ADDRESS:
-                       if (address != NULL)
+                       if (address)
                                memcpy(address, RTA_DATA(attr), ETH_ALEN);
                        break;
                case IFLA_IFNAME:
-                       if (ifname != NULL)
+                       if (ifname)
                                *ifname = RTA_DATA(attr);
                        break;
                case IFLA_MTU:
-                       if (mtu != NULL)
+                       if (mtu)
                                *mtu = *((unsigned int *) RTA_DATA(attr));
                        break;
                case IFLA_STATS:
-                       if (stats != NULL)
+                       if (stats)
                                memcpy(stats, RTA_DATA(attr),
                                        sizeof(struct rtnl_link_stats));
                        break;
                case IFLA_OPERSTATE:
-                       if (operstate != NULL)
+                       if (operstate)
                                *operstate = *((unsigned char *) RTA_DATA(attr));
                        break;
                case IFLA_LINKMODE:
                        break;
                case IFLA_WIRELESS:
-                       return FALSE;
+                       return false;
                }
        }
 
-       return TRUE;
+       return true;
 }
 
 static void process_newlink(unsigned short type, int index, unsigned flags,
                        unsigned change, struct ifinfomsg *msg, int bytes)
 {
        struct ether_addr address = {{ 0, 0, 0, 0, 0, 0 }};
-       struct ether_addr compare = {{ 0, 0, 0, 0, 0, 0 }};
        struct rtnl_link_stats stats;
        unsigned char operstate = 0xff;
        struct interface_data *interface;
@@ -408,8 +411,7 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
        GSList *list;
 
        memset(&stats, 0, sizeof(stats));
-       if (extract_link(msg, bytes, &address, &ifname, &mtu, &operstate,
-                                       &stats) == FALSE)
+       if (!extract_link(msg, bytes, &address, &ifname, &mtu, &operstate, &stats))
                return;
 
        snprintf(ident, 13, "%02x%02x%02x%02x%02x%02x",
@@ -428,6 +430,12 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
                                                address.ether_addr_octet[4],
                                                address.ether_addr_octet[5]);
 
+       if (flags & IFF_SLAVE) {
+               connman_info("%s {newlink} ignoring slave, index %d address %s",
+                                               ifname, index, str);
+               return;
+       }
+
        switch (type) {
        case ARPHRD_ETHER:
        case ARPHRD_LOOPBACK:
@@ -439,9 +447,8 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
                break;
        }
 
-       if (memcmp(&address, &compare, ETH_ALEN) != 0)
-               connman_info("%s {newlink} index %d address %s mtu %u",
-                                               ifname, index, str, mtu);
+       connman_info("%s {newlink} index %d address %s mtu %u",
+                                       ifname, index, str, mtu);
 
        if (operstate != 0xff)
                connman_info("%s {newlink} index %d operstate %u <%s>",
@@ -449,10 +456,9 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
                                                operstate2str(operstate));
 
        interface = g_hash_table_lookup(interface_list, GINT_TO_POINTER(index));
-       if (interface == NULL) {
+       if (!interface) {
                interface = g_new0(struct interface_data, 1);
                interface->index = index;
-               interface->name = g_strdup(ifname);
                interface->ident = g_strdup(ident);
 
                g_hash_table_insert(interface_list,
@@ -476,9 +482,9 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
         * __connman_technology_add_interface() expects the
         * technology to be there already.
         */
-       if (interface != NULL)
+       if (interface)
                __connman_technology_add_interface(interface->service_type,
-                       interface->index, interface->name, interface->ident);
+                       interface->index, interface->ident);
 
        for (list = watch_list; list; list = list->next) {
                struct watch_data *watch = list->data;
@@ -500,8 +506,7 @@ static void process_dellink(unsigned short type, int index, unsigned flags,
        GSList *list;
 
        memset(&stats, 0, sizeof(stats));
-       if (extract_link(msg, bytes, NULL, &ifname, NULL, &operstate,
-                                       &stats) == FALSE)
+       if (!extract_link(msg, bytes, NULL, &ifname, NULL, &operstate, &stats))
                return;
 
        if (operstate != 0xff)
@@ -519,6 +524,8 @@ static void process_dellink(unsigned short type, int index, unsigned flags,
        switch (type) {
        case ARPHRD_ETHER:
        case ARPHRD_LOOPBACK:
+       case ARPHDR_PHONET_PIPE:
+       case ARPHRD_PPP:
        case ARPHRD_NONE:
                __connman_ipconfig_dellink(index, &stats);
                break;
@@ -539,19 +546,19 @@ static void extract_ipv4_addr(struct ifaddrmsg *msg, int bytes,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case IFA_ADDRESS:
-                       if (address != NULL)
+                       if (address)
                                *address = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case IFA_LOCAL:
-                       if (local != NULL)
+                       if (local)
                                *local = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case IFA_BROADCAST:
-                       if (broadcast != NULL)
+                       if (broadcast)
                                *broadcast = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case IFA_LABEL:
-                       if (label != NULL)
+                       if (label)
                                *label = RTA_DATA(attr);
                        break;
                }
@@ -568,11 +575,11 @@ static void extract_ipv6_addr(struct ifaddrmsg *msg, int bytes,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case IFA_ADDRESS:
-                       if (addr != NULL)
+                       if (addr)
                                *addr = *((struct in6_addr *) RTA_DATA(attr));
                        break;
                case IFA_LOCAL:
-                       if (local != NULL)
+                       if (local)
                                *local = *((struct in6_addr *) RTA_DATA(attr));
                        break;
                }
@@ -582,18 +589,17 @@ static void extract_ipv6_addr(struct ifaddrmsg *msg, int bytes,
 static void process_newaddr(unsigned char family, unsigned char prefixlen,
                                int index, struct ifaddrmsg *msg, int bytes)
 {
+       struct in_addr ipv4_addr = { INADDR_ANY };
+       struct in6_addr ipv6_address, ipv6_local;
        const char *label = NULL;
        void *src;
        char ip_string[INET6_ADDRSTRLEN];
 
        if (family == AF_INET) {
-               struct in_addr ipv4_addr = { INADDR_ANY };
 
                extract_ipv4_addr(msg, bytes, &label, &ipv4_addr, NULL, NULL);
                src = &ipv4_addr;
        } else if (family == AF_INET6) {
-               struct in6_addr ipv6_address, ipv6_local;
-
                extract_ipv6_addr(msg, bytes, &ipv6_address, &ipv6_local);
                if (IN6_IS_ADDR_LINKLOCAL(&ipv6_address))
                        return;
@@ -603,7 +609,7 @@ static void process_newaddr(unsigned char family, unsigned char prefixlen,
                return;
        }
 
-       if (inet_ntop(family, src, ip_string, INET6_ADDRSTRLEN) == NULL)
+       if (!inet_ntop(family, src, ip_string, INET6_ADDRSTRLEN))
                return;
 
        __connman_ipconfig_newaddr(index, family, label,
@@ -623,18 +629,16 @@ static void process_newaddr(unsigned char family, unsigned char prefixlen,
 static void process_deladdr(unsigned char family, unsigned char prefixlen,
                                int index, struct ifaddrmsg *msg, int bytes)
 {
+       struct in_addr ipv4_addr = { INADDR_ANY };
+       struct in6_addr ipv6_address, ipv6_local;
        const char *label = NULL;
        void *src;
        char ip_string[INET6_ADDRSTRLEN];
 
        if (family == AF_INET) {
-               struct in_addr ipv4_addr = { INADDR_ANY };
-
                extract_ipv4_addr(msg, bytes, &label, &ipv4_addr, NULL, NULL);
                src = &ipv4_addr;
        } else if (family == AF_INET6) {
-               struct in6_addr ipv6_address, ipv6_local;
-
                extract_ipv6_addr(msg, bytes, &ipv6_address, &ipv6_local);
                if (IN6_IS_ADDR_LINKLOCAL(&ipv6_address))
                        return;
@@ -644,7 +648,7 @@ static void process_deladdr(unsigned char family, unsigned char prefixlen,
                return;
        }
 
-       if (inet_ntop(family, src, ip_string, INET6_ADDRSTRLEN) == NULL)
+       if (!inet_ntop(family, src, ip_string, INET6_ADDRSTRLEN))
                return;
 
        __connman_ipconfig_deladdr(index, family, label,
@@ -661,15 +665,15 @@ static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case RTA_DST:
-                       if (dst != NULL)
+                       if (dst)
                                *dst = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case RTA_GATEWAY:
-                       if (gateway != NULL)
+                       if (gateway)
                                *gateway = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case RTA_OIF:
-                       if (index != NULL)
+                       if (index)
                                *index = *((int *) RTA_DATA(attr));
                        break;
                }
@@ -686,16 +690,16 @@ static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case RTA_DST:
-                       if (dst != NULL)
+                       if (dst)
                                *dst = *((struct in6_addr *) RTA_DATA(attr));
                        break;
                case RTA_GATEWAY:
-                       if (gateway != NULL)
+                       if (gateway)
                                *gateway =
                                        *((struct in6_addr *) RTA_DATA(attr));
                        break;
                case RTA_OIF:
-                       if (index != NULL)
+                       if (index)
                                *index = *((int *) RTA_DATA(attr));
                        break;
                }
@@ -947,6 +951,9 @@ static void rtnl_newlink(struct nlmsghdr *hdr)
 
        rtnl_link(hdr);
 
+       if (hdr->nlmsg_type == IFLA_WIRELESS)
+               connman_warn_once("Obsolete WEXT WiFi driver detected");
+
        process_newlink(msg->ifi_type, msg->ifi_index, msg->ifi_flags,
                                msg->ifi_change, msg, IFA_PAYLOAD(hdr));
 }
@@ -1074,20 +1081,20 @@ static void rtnl_route(struct nlmsghdr *hdr)
        }
 }
 
-static connman_bool_t is_route_rtmsg(struct rtmsg *msg)
+static bool is_route_rtmsg(struct rtmsg *msg)
 {
 
        if (msg->rtm_table != RT_TABLE_MAIN)
-               return FALSE;
+               return false;
 
        if (msg->rtm_protocol != RTPROT_BOOT &&
                        msg->rtm_protocol != RTPROT_KERNEL)
-               return FALSE;
+               return false;
 
        if (msg->rtm_type != RTN_UNICAST)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static void rtnl_newroute(struct nlmsghdr *hdr)
@@ -1238,7 +1245,7 @@ static void rtnl_newnduseropt(struct nlmsghdr *hdr)
                        g_free(domains);
 
                        domains = rtnl_nd_opt_dnssl(opt, &lifetime);
-                       for (i = 0; domains != NULL && domains[i] != NULL; i++)
+                       for (i = 0; domains && domains[i]; i++)
                                connman_resolver_append_lifetime(index,
                                                domains[i], NULL, lifetime);
                }
@@ -1344,13 +1351,13 @@ static int process_response(guint32 seq)
        DBG("seq %d", seq);
 
        req = find_request(seq);
-       if (req != NULL) {
+       if (req) {
                request_list = g_slist_remove(request_list, req);
                g_free(req);
        }
 
        req = g_slist_nth_data(request_list, 0);
-       if (req == NULL)
+       if (!req)
                return 0;
 
        return send_request(req);
@@ -1413,8 +1420,7 @@ static void rtnl_message(void *buf, size_t len)
        }
 }
 
-static gboolean netlink_event(GIOChannel *chan,
-                               GIOCondition cond, gpointer data)
+static gboolean netlink_event(GIOChannel *chan, GIOCondition cond, gpointer data)
 {
        unsigned char buf[4096];
        struct sockaddr_nl nladdr;
@@ -1459,7 +1465,7 @@ static int send_getlink(void)
        DBG("");
 
        req = g_try_malloc0(RTNL_REQUEST_SIZE);
-       if (req == NULL)
+       if (!req)
                return -ENOMEM;
 
        req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
@@ -1479,7 +1485,7 @@ static int send_getaddr(void)
        DBG("");
 
        req = g_try_malloc0(RTNL_REQUEST_SIZE);
-       if (req == NULL)
+       if (!req)
                return -ENOMEM;
 
        req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
@@ -1499,7 +1505,7 @@ static int send_getroute(void)
        DBG("");
 
        req = g_try_malloc0(RTNL_REQUEST_SIZE);
-       if (req == NULL)
+       if (!req)
                return -ENOMEM;
 
        req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
@@ -1570,7 +1576,7 @@ unsigned int __connman_rtnl_update_interval_remove(unsigned int interval)
 
        update_list = g_slist_remove(update_list, GINT_TO_POINTER(interval));
 
-       if (update_list != NULL)
+       if (update_list)
                min = GPOINTER_TO_UINT(g_slist_nth_data(update_list, 0));
 
        if (min > update_interval)
index 9c4f3fb..cbca669 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -45,26 +45,26 @@ static GList *service_list = NULL;
 static GHashTable *service_hash = NULL;
 static GSList *counter_list = NULL;
 static unsigned int autoconnect_timeout = 0;
+static unsigned int vpn_autoconnect_timeout = 0;
 static struct connman_service *current_default = NULL;
-static connman_bool_t services_dirty = FALSE;
+static bool services_dirty = false;
 
 struct connman_stats {
-       connman_bool_t valid;
-       connman_bool_t enabled;
+       bool valid;
+       bool enabled;
        struct connman_stats_data data_last;
        struct connman_stats_data data;
        GTimer *timer;
 };
 
 struct connman_stats_counter {
-       connman_bool_t append_all;
+       bool append_all;
        struct connman_stats stats;
        struct connman_stats stats_roaming;
 };
 
 struct connman_service {
        int refcount;
-       int session_usage_count;
        char *identifier;
        char *path;
        enum connman_service_type type;
@@ -73,19 +73,18 @@ struct connman_service {
        enum connman_service_state state_ipv4;
        enum connman_service_state state_ipv6;
        enum connman_service_error error;
+       enum connman_service_connect_reason connect_reason;
        uint8_t strength;
-       connman_bool_t favorite;
-       connman_bool_t immutable;
-       connman_bool_t hidden;
-       connman_bool_t ignore;
-       connman_bool_t autoconnect;
-       connman_bool_t userconnect;
+       bool favorite;
+       bool immutable;
+       bool hidden;
+       bool ignore;
+       bool autoconnect;
        GTimeVal modified;
        unsigned int order;
        char *name;
        char *passphrase;
-       char *agent_passphrase;
-       connman_bool_t roaming;
+       bool roaming;
        struct connman_ipconfig *ipconfig_ipv4;
        struct connman_ipconfig *ipconfig_ipv6;
        struct connman_network *network;
@@ -94,6 +93,7 @@ struct connman_service {
        char **nameservers_config;
        char **nameservers_auto;
        char **domains;
+       char *hostname;
        char *domainname;
        char **timeservers;
        char **timeservers_config;
@@ -117,16 +117,16 @@ struct connman_service {
        char **proxies;
        char **excludes;
        char *pac;
-       connman_bool_t wps;
+       bool wps;
        int online_check_count;
-       connman_bool_t do_split_routing;
-       connman_bool_t new_service;
-       connman_bool_t hidden_service;
+       bool do_split_routing;
+       bool new_service;
+       bool hidden_service;
        char *config_file;
        char *config_entry;
 };
 
-static connman_bool_t allow_property_changed(struct connman_service *service);
+static bool allow_property_changed(struct connman_service *service);
 
 static struct connman_ipconfig *create_ip4config(struct connman_service *service,
                int index, enum connman_ipconfig_method method);
@@ -144,7 +144,7 @@ static void compare_path(gpointer value, gpointer user_data)
        struct connman_service *service = value;
        struct find_data *data = user_data;
 
-       if (data->service != NULL)
+       if (data->service)
                return;
 
        if (g_strcmp0(service->path, data->path) == 0)
@@ -162,6 +162,23 @@ static struct connman_service *find_service(const char *path)
        return data.service;
 }
 
+static const char *reason2string(enum connman_service_connect_reason reason)
+{
+
+       switch (reason) {
+       case CONNMAN_SERVICE_CONNECT_REASON_NONE:
+               return "none";
+       case CONNMAN_SERVICE_CONNECT_REASON_USER:
+               return "user";
+       case CONNMAN_SERVICE_CONNECT_REASON_AUTO:
+               return "auto";
+       case CONNMAN_SERVICE_CONNECT_REASON_SESSION:
+               return "session";
+       }
+
+       return "unknown";
+}
+
 const char *__connman_service_type2string(enum connman_service_type type)
 {
        switch (type) {
@@ -183,6 +200,8 @@ const char *__connman_service_type2string(enum connman_service_type type)
                return "vpn";
        case CONNMAN_SERVICE_TYPE_GADGET:
                return "gadget";
+       case CONNMAN_SERVICE_TYPE_P2P:
+               return "p2p";
        }
 
        return NULL;
@@ -190,7 +209,7 @@ const char *__connman_service_type2string(enum connman_service_type type)
 
 enum connman_service_type __connman_service_string2type(const char *str)
 {
-       if (str == NULL)
+       if (!str)
                return CONNMAN_SERVICE_TYPE_UNKNOWN;
 
        if (strcmp(str, "ethernet") == 0)
@@ -209,6 +228,8 @@ enum connman_service_type __connman_service_string2type(const char *str)
                return CONNMAN_SERVICE_TYPE_GPS;
        if (strcmp(str, "system") == 0)
                return CONNMAN_SERVICE_TYPE_SYSTEM;
+       if (strcmp(str, "p2p") == 0)
+               return CONNMAN_SERVICE_TYPE_P2P;
 
        return CONNMAN_SERVICE_TYPE_UNKNOWN;
 }
@@ -321,67 +342,120 @@ static enum connman_service_proxy_method string2proxymethod(const char *method)
                return CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
 }
 
+int __connman_service_load_modifiable(struct connman_service *service)
+{
+       GKeyFile *keyfile;
+       GError *error = NULL;
+       gchar *str;
+       bool autoconnect;
+
+       DBG("service %p", service);
+
+       keyfile = connman_storage_load_service(service->identifier);
+       if (!keyfile)
+               return -EIO;
+
+       switch (service->type) {
+       case CONNMAN_SERVICE_TYPE_UNKNOWN:
+       case CONNMAN_SERVICE_TYPE_SYSTEM:
+       case CONNMAN_SERVICE_TYPE_GPS:
+       case CONNMAN_SERVICE_TYPE_P2P:
+               break;
+       case CONNMAN_SERVICE_TYPE_VPN:
+               service->do_split_routing = g_key_file_get_boolean(keyfile,
+                               service->identifier, "SplitRouting", NULL);
+               /* fall through */
+       case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_ETHERNET:
+               autoconnect = g_key_file_get_boolean(keyfile,
+                               service->identifier, "AutoConnect", &error);
+               if (!error)
+                       service->autoconnect = autoconnect;
+               g_clear_error(&error);
+               break;
+       }
+
+       str = g_key_file_get_string(keyfile,
+                               service->identifier, "Modified", NULL);
+       if (str) {
+               g_time_val_from_iso8601(str, &service->modified);
+               g_free(str);
+       }
+
+       g_key_file_free(keyfile);
+
+       return 0;
+}
+
 static int service_load(struct connman_service *service)
 {
        GKeyFile *keyfile;
        GError *error = NULL;
        gsize length;
        gchar *str;
-       connman_bool_t autoconnect;
+       bool autoconnect;
        unsigned int ssid_len;
        int err = 0;
 
        DBG("service %p", service);
 
        keyfile = connman_storage_load_service(service->identifier);
-       if (keyfile == NULL) {
-               service->new_service = TRUE;
+       if (!keyfile) {
+               service->new_service = true;
                return -EIO;
        } else
-               service->new_service = FALSE;
+               service->new_service = false;
 
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        case CONNMAN_SERVICE_TYPE_VPN:
                service->do_split_routing = g_key_file_get_boolean(keyfile,
                                service->identifier, "SplitRouting", NULL);
+               autoconnect = g_key_file_get_boolean(keyfile,
+                               service->identifier, "AutoConnect", &error);
+               if (!error)
+                       service->autoconnect = autoconnect;
+               g_clear_error(&error);
                break;
        case CONNMAN_SERVICE_TYPE_WIFI:
-               if (service->name == NULL) {
+               if (!service->name) {
                        gchar *name;
 
                        name = g_key_file_get_string(keyfile,
                                        service->identifier, "Name", NULL);
-                       if (name != NULL) {
+                       if (name) {
                                g_free(service->name);
                                service->name = name;
                        }
 
-                       if (service->network != NULL)
+                       if (service->network)
                                connman_network_set_name(service->network,
                                                                        name);
                }
 
                if (service->network &&
-                               connman_network_get_blob(service->network,
-                                       "WiFi.SSID", &ssid_len) == NULL) {
+                               !connman_network_get_blob(service->network,
+                                               "WiFi.SSID", &ssid_len)) {
                        gchar *hex_ssid;
 
                        hex_ssid = g_key_file_get_string(keyfile,
                                                        service->identifier,
                                                                "SSID", NULL);
 
-                       if (hex_ssid != NULL) {
+                       if (hex_ssid) {
                                gchar *ssid;
                                unsigned int i, j = 0, hex;
                                size_t hex_ssid_len = strlen(hex_ssid);
 
                                ssid = g_try_malloc0(hex_ssid_len / 2);
-                               if (ssid == NULL) {
+                               if (!ssid) {
                                        g_free(hex_ssid);
                                        err = -ENOMEM;
                                        goto done;
@@ -400,6 +474,7 @@ static int service_load(struct connman_service *service)
                }
                /* fall through */
 
+       case CONNMAN_SERVICE_TYPE_GADGET:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
                service->favorite = g_key_file_get_boolean(keyfile,
@@ -407,8 +482,8 @@ static int service_load(struct connman_service *service)
 
                str = g_key_file_get_string(keyfile,
                                service->identifier, "Failure", NULL);
-               if (str != NULL) {
-                       if (service->favorite == FALSE)
+               if (str) {
+                       if (!service->favorite)
                                service->state_ipv4 = service->state_ipv6 =
                                        CONNMAN_SERVICE_STATE_FAILURE;
                        service->error = string2error(str);
@@ -419,7 +494,7 @@ static int service_load(struct connman_service *service)
        case CONNMAN_SERVICE_TYPE_ETHERNET:
                autoconnect = g_key_file_get_boolean(keyfile,
                                service->identifier, "AutoConnect", &error);
-               if (error == NULL)
+               if (!error)
                        service->autoconnect = autoconnect;
                g_clear_error(&error);
                break;
@@ -427,71 +502,71 @@ static int service_load(struct connman_service *service)
 
        str = g_key_file_get_string(keyfile,
                                service->identifier, "Modified", NULL);
-       if (str != NULL) {
+       if (str) {
                g_time_val_from_iso8601(str, &service->modified);
                g_free(str);
        }
 
        str = g_key_file_get_string(keyfile,
                                service->identifier, "Passphrase", NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(service->passphrase);
                service->passphrase = str;
        }
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                __connman_ipconfig_load(service->ipconfig_ipv4, keyfile,
                                        service->identifier, "IPv4.");
 
-       if (service->ipconfig_ipv6 != NULL)
+       if (service->ipconfig_ipv6)
                __connman_ipconfig_load(service->ipconfig_ipv6, keyfile,
                                        service->identifier, "IPv6.");
 
        service->nameservers_config = g_key_file_get_string_list(keyfile,
                        service->identifier, "Nameservers", &length, NULL);
-       if (service->nameservers_config != NULL && length == 0) {
+       if (service->nameservers_config && length == 0) {
                g_strfreev(service->nameservers_config);
                service->nameservers_config = NULL;
        }
 
        service->timeservers_config = g_key_file_get_string_list(keyfile,
                        service->identifier, "Timeservers", &length, NULL);
-       if (service->timeservers_config != NULL && length == 0) {
+       if (service->timeservers_config && length == 0) {
                g_strfreev(service->timeservers_config);
                service->timeservers_config = NULL;
        }
 
        service->domains = g_key_file_get_string_list(keyfile,
                        service->identifier, "Domains", &length, NULL);
-       if (service->domains != NULL && length == 0) {
+       if (service->domains && length == 0) {
                g_strfreev(service->domains);
                service->domains = NULL;
        }
 
        str = g_key_file_get_string(keyfile,
                                service->identifier, "Proxy.Method", NULL);
-       if (str != NULL)
+       if (str)
                service->proxy_config = string2proxymethod(str);
 
        g_free(str);
 
        service->proxies = g_key_file_get_string_list(keyfile,
                        service->identifier, "Proxy.Servers", &length, NULL);
-       if (service->proxies != NULL && length == 0) {
+       if (service->proxies && length == 0) {
                g_strfreev(service->proxies);
                service->proxies = NULL;
        }
 
        service->excludes = g_key_file_get_string_list(keyfile,
                        service->identifier, "Proxy.Excludes", &length, NULL);
-       if (service->excludes != NULL && length == 0) {
+       if (service->excludes && length == 0) {
                g_strfreev(service->excludes);
                service->excludes = NULL;
        }
 
        str = g_key_file_get_string(keyfile,
                                service->identifier, "Proxy.URL", NULL);
-       if (str != NULL) {
+       if (str) {
                g_free(service->pac);
                service->pac = str;
        }
@@ -515,14 +590,14 @@ static int service_save(struct connman_service *service)
 
        DBG("service %p new %d", service, service->new_service);
 
-       if (service->new_service == TRUE)
+       if (service->new_service)
                return -ESRCH;
 
        keyfile = __connman_storage_open_service(service->identifier);
-       if (keyfile == NULL)
+       if (!keyfile)
                return -EIO;
 
-       if (service->name != NULL)
+       if (service->name)
                g_key_file_set_string(keyfile, service->identifier,
                                                "Name", service->name);
 
@@ -530,11 +605,14 @@ static int service_save(struct connman_service *service)
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        case CONNMAN_SERVICE_TYPE_VPN:
                g_key_file_set_boolean(keyfile, service->identifier,
                                "SplitRouting", service->do_split_routing);
+               if (service->favorite)
+                       g_key_file_set_boolean(keyfile, service->identifier,
+                                       "AutoConnect", service->autoconnect);
                break;
        case CONNMAN_SERVICE_TYPE_WIFI:
                if (service->network) {
@@ -544,13 +622,13 @@ static int service_save(struct connman_service *service)
                        ssid = connman_network_get_blob(service->network,
                                                        "WiFi.SSID", &ssid_len);
 
-                       if (ssid != NULL && ssid_len > 0 && ssid[0] != '\0') {
+                       if (ssid && ssid_len > 0 && ssid[0] != '\0') {
                                char *identifier = service->identifier;
                                GString *ssid_str;
                                unsigned int i;
 
                                ssid_str = g_string_sized_new(ssid_len * 2);
-                               if (ssid_str == NULL) {
+                               if (!ssid_str) {
                                        err = -ENOMEM;
                                        goto done;
                                }
@@ -571,6 +649,7 @@ static int service_save(struct connman_service *service)
                }
                /* fall through */
 
+       case CONNMAN_SERVICE_TYPE_GADGET:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
                g_key_file_set_boolean(keyfile, service->identifier,
@@ -579,7 +658,7 @@ static int service_save(struct connman_service *service)
                if (service->state_ipv4 == CONNMAN_SERVICE_STATE_FAILURE ||
                        service->state_ipv6 == CONNMAN_SERVICE_STATE_FAILURE) {
                        const char *failure = error2string(service->error);
-                       if (failure != NULL)
+                       if (failure)
                                g_key_file_set_string(keyfile,
                                                        service->identifier,
                                                        "Failure", failure);
@@ -590,35 +669,35 @@ static int service_save(struct connman_service *service)
                /* fall through */
 
        case CONNMAN_SERVICE_TYPE_ETHERNET:
-               if (service->favorite == TRUE)
+               if (service->favorite)
                        g_key_file_set_boolean(keyfile, service->identifier,
                                        "AutoConnect", service->autoconnect);
                break;
        }
 
        str = g_time_val_to_iso8601(&service->modified);
-       if (str != NULL) {
+       if (str) {
                g_key_file_set_string(keyfile, service->identifier,
                                                        "Modified", str);
                g_free(str);
        }
 
-       if (service->passphrase != NULL && strlen(service->passphrase) > 0)
+       if (service->passphrase && strlen(service->passphrase) > 0)
                g_key_file_set_string(keyfile, service->identifier,
                                        "Passphrase", service->passphrase);
        else
                g_key_file_remove_key(keyfile, service->identifier,
                                                        "Passphrase", NULL);
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                __connman_ipconfig_save(service->ipconfig_ipv4, keyfile,
                                        service->identifier, "IPv4.");
 
-       if (service->ipconfig_ipv6 != NULL)
+       if (service->ipconfig_ipv6)
                __connman_ipconfig_save(service->ipconfig_ipv6, keyfile,
                                                service->identifier, "IPv6.");
 
-       if (service->nameservers_config != NULL) {
+       if (service->nameservers_config) {
                guint len = g_strv_length(service->nameservers_config);
 
                g_key_file_set_string_list(keyfile, service->identifier,
@@ -628,7 +707,7 @@ static int service_save(struct connman_service *service)
        g_key_file_remove_key(keyfile, service->identifier,
                                                        "Nameservers", NULL);
 
-       if (service->timeservers_config != NULL) {
+       if (service->timeservers_config) {
                guint len = g_strv_length(service->timeservers_config);
 
                g_key_file_set_string_list(keyfile, service->identifier,
@@ -638,7 +717,7 @@ static int service_save(struct connman_service *service)
                g_key_file_remove_key(keyfile, service->identifier,
                                                        "Timeservers", NULL);
 
-       if (service->domains != NULL) {
+       if (service->domains) {
                guint len = g_strv_length(service->domains);
 
                g_key_file_set_string_list(keyfile, service->identifier,
@@ -649,11 +728,11 @@ static int service_save(struct connman_service *service)
                                                        "Domains", NULL);
 
        cst_str = proxymethod2string(service->proxy_config);
-       if (cst_str != NULL)
+       if (cst_str)
                g_key_file_set_string(keyfile, service->identifier,
                                "Proxy.Method", cst_str);
 
-       if (service->proxies != NULL) {
+       if (service->proxies) {
                guint len = g_strv_length(service->proxies);
 
                g_key_file_set_string_list(keyfile, service->identifier,
@@ -663,7 +742,7 @@ static int service_save(struct connman_service *service)
                g_key_file_remove_key(keyfile, service->identifier,
                                                "Proxy.Servers", NULL);
 
-       if (service->excludes != NULL) {
+       if (service->excludes) {
                guint len = g_strv_length(service->excludes);
 
                g_key_file_set_string_list(keyfile, service->identifier,
@@ -673,22 +752,22 @@ static int service_save(struct connman_service *service)
                g_key_file_remove_key(keyfile, service->identifier,
                                                "Proxy.Excludes", NULL);
 
-       if (service->pac != NULL && strlen(service->pac) > 0)
+       if (service->pac && strlen(service->pac) > 0)
                g_key_file_set_string(keyfile, service->identifier,
                                        "Proxy.URL", service->pac);
        else
                g_key_file_remove_key(keyfile, service->identifier,
                                                        "Proxy.URL", NULL);
 
-       if (service->hidden_service == TRUE)
+       if (service->hidden_service)
                g_key_file_set_boolean(keyfile, service->identifier, "Hidden",
                                                                        TRUE);
 
-       if (service->config_file != NULL && strlen(service->config_file) > 0)
+       if (service->config_file && strlen(service->config_file) > 0)
                g_key_file_set_string(keyfile, service->identifier,
                                "Config.file", service->config_file);
 
-       if (service->config_entry != NULL &&
+       if (service->config_entry &&
                                        strlen(service->config_entry) > 0)
                g_key_file_set_string(keyfile, service->identifier,
                                "Config.ident", service->config_entry);
@@ -703,6 +782,9 @@ done:
 
 void __connman_service_save(struct connman_service *service)
 {
+       if (!service)
+               return;
+
        service_save(service);
 }
 
@@ -793,14 +875,14 @@ done:
        return result;
 }
 
-static connman_bool_t is_connecting_state(struct connman_service *service,
+static bool is_connecting_state(struct connman_service *service,
                                        enum connman_service_state state)
 {
        switch (state) {
        case CONNMAN_SERVICE_STATE_UNKNOWN:
        case CONNMAN_SERVICE_STATE_IDLE:
        case CONNMAN_SERVICE_STATE_FAILURE:
-               if (service->network != NULL)
+               if (service->network)
                        return connman_network_get_connecting(service->network);
        case CONNMAN_SERVICE_STATE_DISCONNECT:
        case CONNMAN_SERVICE_STATE_READY:
@@ -808,13 +890,13 @@ static connman_bool_t is_connecting_state(struct connman_service *service,
                break;
        case CONNMAN_SERVICE_STATE_ASSOCIATION:
        case CONNMAN_SERVICE_STATE_CONFIGURATION:
-               return TRUE;
+               return true;
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t is_connected_state(const struct connman_service *service,
+static bool is_connected_state(const struct connman_service *service,
                                        enum connman_service_state state)
 {
        switch (state) {
@@ -827,13 +909,13 @@ static connman_bool_t is_connected_state(const struct connman_service *service,
                break;
        case CONNMAN_SERVICE_STATE_READY:
        case CONNMAN_SERVICE_STATE_ONLINE:
-               return TRUE;
+               return true;
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t is_idle_state(const struct connman_service *service,
+static bool is_idle_state(const struct connman_service *service,
                                enum connman_service_state state)
 {
        switch (state) {
@@ -846,31 +928,24 @@ static connman_bool_t is_idle_state(const struct connman_service *service,
        case CONNMAN_SERVICE_STATE_FAILURE:
                break;
        case CONNMAN_SERVICE_STATE_IDLE:
-               return TRUE;
+               return true;
        }
 
-       return FALSE;
+       return false;
 }
 
-static connman_bool_t is_connecting(struct connman_service *service)
+static bool is_connecting(struct connman_service *service)
 {
        return is_connecting_state(service, service->state);
 }
 
-static connman_bool_t is_connected(struct connman_service *service)
+static bool is_connected(struct connman_service *service)
 {
        return is_connected_state(service, service->state);
 }
 
 static int nameserver_get_index(struct connman_service *service)
 {
-       int index;
-
-       index = __connman_service_get_index(service);
-
-       if (index < 0)
-               return -1;
-
        switch (combine_state(service->state_ipv4, service->state_ipv6)) {
        case CONNMAN_SERVICE_STATE_UNKNOWN:
        case CONNMAN_SERVICE_STATE_IDLE:
@@ -884,7 +959,7 @@ static int nameserver_get_index(struct connman_service *service)
                break;
        }
 
-       return index;
+       return __connman_service_get_index(service);
 }
 
 static void remove_nameservers(struct connman_service *service,
@@ -892,7 +967,7 @@ static void remove_nameservers(struct connman_service *service,
 {
        int i;
 
-       if (ns == NULL)
+       if (!ns)
                return;
 
        if (index < 0)
@@ -901,7 +976,7 @@ static void remove_nameservers(struct connman_service *service,
        if (index < 0)
                        return;
 
-       for (i = 0; ns[i] != NULL; i++)
+       for (i = 0; ns[i]; i++)
                connman_resolver_remove(index, NULL, ns[i]);
 }
 
@@ -910,7 +985,7 @@ static void remove_searchdomains(struct connman_service *service,
 {
        int i;
 
-       if (sd == NULL)
+       if (!sd)
                return;
 
        if (index < 0)
@@ -919,13 +994,29 @@ static void remove_searchdomains(struct connman_service *service,
        if (index < 0)
                return;
 
-       for (i = 0; sd[i] != NULL; i++)
+       for (i = 0; sd[i]; i++)
                connman_resolver_remove(index, sd[i], NULL);
 }
 
+static bool nameserver_available(struct connman_service *service, char *ns)
+{
+       int family;
+
+       family = connman_inet_check_ipaddress(ns);
+
+       if (family == AF_INET)
+               return is_connected_state(service, service->state_ipv4);
+
+       if (family == AF_INET6)
+               return is_connected_state(service, service->state_ipv6);
+
+       return false;
+}
+
 static void update_nameservers(struct connman_service *service)
 {
        int index;
+       char *ns;
 
        index = __connman_service_get_index(service);
        if (index < 0)
@@ -946,7 +1037,7 @@ static void update_nameservers(struct connman_service *service)
                break;
        }
 
-       if (service->nameservers_config != NULL) {
+       if (service->nameservers_config) {
                int i;
 
                remove_nameservers(service, index, service->nameservers);
@@ -954,21 +1045,29 @@ static void update_nameservers(struct connman_service *service)
                i = g_strv_length(service->nameservers_config);
                while (i != 0) {
                        i--;
-                       connman_resolver_append(index, NULL,
-                                       service->nameservers_config[i]);
+
+                       ns = service->nameservers_config[i];
+
+                       if (nameserver_available(service, ns))
+                               connman_resolver_append(index, NULL, ns);
                }
-       } else if (service->nameservers != NULL) {
+       } else if (service->nameservers) {
                int i;
 
+               remove_nameservers(service, index, service->nameservers);
+
                i = g_strv_length(service->nameservers);
                while (i != 0) {
                        i--;
-                       connman_resolver_append(index, NULL,
-                                       service->nameservers[i]);
+
+                       ns = service->nameservers[i];
+
+                       if (nameserver_available(service, ns))
+                               connman_resolver_append(index, NULL, ns);
                }
        }
 
-       if (service->domains != NULL) {
+       if (service->domains) {
                char *searchdomains[2] = {NULL, NULL};
                int i;
 
@@ -981,7 +1080,7 @@ static void update_nameservers(struct connman_service *service)
                        connman_resolver_append(index, service->domains[i],
                                                NULL);
                }
-       } else if (service->domainname != NULL)
+       } else if (service->domainname)
                connman_resolver_append(index, service->domainname, NULL);
 
        connman_resolver_flush();
@@ -993,26 +1092,26 @@ static void update_nameservers(struct connman_service *service)
  * for details) and not through service.c
  */
 int __connman_service_nameserver_append(struct connman_service *service,
-                               const char *nameserver, gboolean is_auto)
+                               const char *nameserver, bool is_auto)
 {
        char **nameservers;
        int len, i;
 
        DBG("service %p nameserver %s auto %d", service, nameserver, is_auto);
 
-       if (nameserver == NULL)
+       if (!nameserver)
                return -EINVAL;
 
-       if (is_auto == TRUE)
+       if (is_auto)
                nameservers = service->nameservers_auto;
        else
                nameservers = service->nameservers;
 
-       for (i = 0; nameservers != NULL && nameservers[i] != NULL; i++)
+       for (i = 0; nameservers && nameservers[i]; i++)
                if (g_strcmp0(nameservers[i], nameserver) == 0)
                        return -EEXIST;
 
-       if (nameservers != NULL) {
+       if (nameservers) {
                len = g_strv_length(nameservers);
                nameservers = g_try_renew(char *, nameservers, len + 2);
        } else {
@@ -1020,16 +1119,16 @@ int __connman_service_nameserver_append(struct connman_service *service,
                nameservers = g_try_new0(char *, len + 2);
        }
 
-       if (nameservers == NULL)
+       if (!nameservers)
                return -ENOMEM;
 
        nameservers[len] = g_strdup(nameserver);
-       if (nameservers[len] == NULL)
+       if (!nameservers[len])
                return -ENOMEM;
 
        nameservers[len + 1] = NULL;
 
-       if (is_auto == TRUE) {
+       if (is_auto) {
                service->nameservers_auto = nameservers;
        } else {
                service->nameservers = nameservers;
@@ -1040,39 +1139,39 @@ int __connman_service_nameserver_append(struct connman_service *service,
 }
 
 int __connman_service_nameserver_remove(struct connman_service *service,
-                               const char *nameserver, gboolean is_auto)
+                               const char *nameserver, bool is_auto)
 {
        char **servers, **nameservers;
-       gboolean found = FALSE;
+       bool found = false;
        int len, i, j;
 
        DBG("service %p nameserver %s auto %d", service, nameserver, is_auto);
 
-       if (nameserver == NULL)
+       if (!nameserver)
                return -EINVAL;
 
-       if (is_auto == TRUE)
+       if (is_auto)
                nameservers = service->nameservers_auto;
        else
                nameservers = service->nameservers;
 
-       if (nameservers == NULL)
+       if (!nameservers)
                return 0;
 
-       for (i = 0; nameservers != NULL && nameservers[i] != NULL; i++)
+       for (i = 0; nameservers && nameservers[i]; i++)
                if (g_strcmp0(nameservers[i], nameserver) == 0) {
-                       found = TRUE;
+                       found = true;
                        break;
                }
 
-       if (found == FALSE)
+       if (!found)
                return 0;
 
        len = g_strv_length(nameservers);
 
        if (len == 1) {
                g_strfreev(nameservers);
-               if (is_auto == TRUE)
+               if (is_auto)
                        service->nameservers_auto = NULL;
                else
                        service->nameservers = NULL;
@@ -1081,13 +1180,13 @@ int __connman_service_nameserver_remove(struct connman_service *service,
        }
 
        servers = g_try_new0(char *, len);
-       if (servers == NULL)
+       if (!servers)
                return -ENOMEM;
 
        for (i = 0, j = 0; i < len; i++) {
                if (g_strcmp0(nameservers[i], nameserver) != 0) {
                        servers[j] = g_strdup(nameservers[i]);
-                       if (servers[j] == NULL)
+                       if (!servers[j])
                                return -ENOMEM;
                        j++;
                }
@@ -1097,7 +1196,7 @@ int __connman_service_nameserver_remove(struct connman_service *service,
        g_strfreev(nameservers);
        nameservers = servers;
 
-       if (is_auto == TRUE) {
+       if (is_auto) {
                service->nameservers_auto = nameservers;
        } else {
                service->nameservers = nameservers;
@@ -1120,7 +1219,7 @@ static void add_nameserver_route(int family, int index, char *nameserver,
 {
        switch (family) {
        case AF_INET:
-               if (connman_inet_compare_subnet(index, nameserver) == TRUE)
+               if (connman_inet_compare_subnet(index, nameserver))
                        break;
 
                if (connman_inet_add_host_route(index, nameserver, gw) < 0)
@@ -1142,7 +1241,7 @@ static void nameserver_add_routes(int index, char **nameservers,
 {
        int i, family;
 
-       for (i = 0; nameservers[i] != NULL; i++) {
+       for (i = 0; nameservers[i]; i++) {
                family = connman_inet_check_ipaddress(nameservers[i]);
                if (family < 0)
                        continue;
@@ -1156,7 +1255,7 @@ static void nameserver_del_routes(int index, char **nameservers,
 {
        int i, family;
 
-       for (i = 0; nameservers[i] != NULL; i++) {
+       for (i = 0; nameservers[i]; i++) {
                family = connman_inet_check_ipaddress(nameservers[i]);
                if (family < 0)
                        continue;
@@ -1179,23 +1278,20 @@ static void nameserver_del_routes(int index, char **nameservers,
 void __connman_service_nameserver_add_routes(struct connman_service *service,
                                                const char *gw)
 {
-       int index = -1;
+       int index;
 
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (service->network != NULL)
-               index = connman_network_get_index(service->network);
-       else if (service->provider != NULL)
-               index = connman_provider_get_index(service->provider);
+       index = __connman_service_get_index(service);
 
-       if (service->nameservers_config != NULL) {
+       if (service->nameservers_config) {
                /*
                 * Configured nameserver takes preference over the
                 * discoverd nameserver gathered from DHCP, VPN, etc.
                 */
                nameserver_add_routes(index, service->nameservers_config, gw);
-       } else if (service->nameservers != NULL) {
+       } else if (service->nameservers) {
                /*
                 * We add nameservers host routes for nameservers that
                 * are not on our subnet. For those who are, the subnet
@@ -1210,32 +1306,29 @@ void __connman_service_nameserver_add_routes(struct connman_service *service,
 void __connman_service_nameserver_del_routes(struct connman_service *service,
                                        enum connman_ipconfig_type type)
 {
-       int index = -1;
+       int index;
 
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (service->network != NULL)
-               index = connman_network_get_index(service->network);
-       else if (service->provider != NULL)
-               index = connman_provider_get_index(service->provider);
+       index = __connman_service_get_index(service);
 
-       if (service->nameservers_config != NULL)
+       if (service->nameservers_config)
                nameserver_del_routes(index, service->nameservers_config,
                                        type);
-       else if (service->nameservers != NULL)
+       else if (service->nameservers)
                nameserver_del_routes(index, service->nameservers, type);
 }
 
 static struct connman_stats *stats_get(struct connman_service *service)
 {
-       if (service->roaming == TRUE)
+       if (service->roaming)
                return &service->stats_roaming;
        else
                return &service->stats;
 }
 
-static connman_bool_t stats_enabled(struct connman_service *service)
+static bool stats_enabled(struct connman_service *service)
 {
        struct connman_stats *stats = stats_get(service);
 
@@ -1248,10 +1341,10 @@ static void stats_start(struct connman_service *service)
 
        DBG("service %p", service);
 
-       if (stats->timer == NULL)
+       if (!stats->timer)
                return;
 
-       stats->enabled = TRUE;
+       stats->enabled = true;
        stats->data_last.time = stats->data.time;
 
        g_timer_start(stats->timer);
@@ -1264,10 +1357,10 @@ static void stats_stop(struct connman_service *service)
 
        DBG("service %p", service);
 
-       if (stats->timer == NULL)
+       if (!stats->timer)
                return;
 
-       if (stats->enabled == FALSE)
+       if (!stats->enabled)
                return;
 
        g_timer_stop(stats->timer);
@@ -1275,7 +1368,7 @@ static void stats_stop(struct connman_service *service)
        seconds = g_timer_elapsed(stats->timer, NULL);
        stats->data.time = stats->data_last.time + seconds;
 
-       stats->enabled = FALSE;
+       stats->enabled = false;
 }
 
 static void reset_stats(struct connman_service *service)
@@ -1283,7 +1376,7 @@ static void reset_stats(struct connman_service *service)
        DBG("service %p", service);
 
        /* home */
-       service->stats.valid = FALSE;
+       service->stats.valid = false;
 
        service->stats.data.rx_packets = 0;
        service->stats.data.tx_packets = 0;
@@ -1299,7 +1392,7 @@ static void reset_stats(struct connman_service *service)
        g_timer_reset(service->stats.timer);
 
        /* roaming */
-       service->stats_roaming.valid = FALSE;
+       service->stats_roaming.valid = false;
 
        service->stats_roaming.data.rx_packets = 0;
        service->stats_roaming.data.tx_packets = 0;
@@ -1319,17 +1412,29 @@ struct connman_service *__connman_service_get_default(void)
 {
        struct connman_service *service;
 
-       if (service_list == NULL)
+       if (!service_list)
                return NULL;
 
        service = service_list->data;
 
-       if (is_connected(service) == FALSE)
+       if (!is_connected(service))
                return NULL;
 
        return service;
 }
 
+bool __connman_service_index_is_default(int index)
+{
+       struct connman_service *service;
+
+       if (index < 0)
+               return false;
+
+       service = __connman_service_get_default();
+
+       return __connman_service_get_index(service) == index;
+}
+
 static void default_changed(void)
 {
        struct connman_service *service = __connman_service_get_default();
@@ -1337,10 +1442,23 @@ static void default_changed(void)
        if (service == current_default)
                return;
 
+       DBG("current default %p %s", current_default,
+               current_default ? current_default->identifier : "");
+       DBG("new default %p %s", service, service ? service->identifier : "");
+
        __connman_service_timeserver_changed(current_default, NULL);
 
        current_default = service;
 
+       if (service) {
+               if (service->hostname &&
+                               connman_setting_get_bool("AllowHostnameUpdates"))
+                       __connman_utsname_set_hostname(service->hostname);
+
+               if (service->domainname)
+                       __connman_utsname_set_domainname(service->domainname);
+       }
+
        __connman_notifier_default_changed(service);
 }
 
@@ -1351,10 +1469,10 @@ static void state_changed(struct connman_service *service)
        __connman_notifier_service_state_changed(service, service->state);
 
        str = state2string(service->state);
-       if (str == NULL)
+       if (!str)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_basic(service->path,
@@ -1367,7 +1485,7 @@ static void strength_changed(struct connman_service *service)
        if (service->strength == 0)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_basic(service->path,
@@ -1377,54 +1495,66 @@ static void strength_changed(struct connman_service *service)
 
 static void favorite_changed(struct connman_service *service)
 {
-       if (service->path == NULL)
+       dbus_bool_t favorite;
+
+       if (!service->path)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
+       favorite = service->favorite;
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "Favorite",
-                                       DBUS_TYPE_BOOLEAN, &service->favorite);
+                                       DBUS_TYPE_BOOLEAN, &favorite);
 }
 
 static void immutable_changed(struct connman_service *service)
 {
-       if (service->path == NULL)
+       dbus_bool_t immutable;
+
+       if (!service->path)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
+       immutable = service->immutable;
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "Immutable",
-                                       DBUS_TYPE_BOOLEAN, &service->immutable);
+                                       DBUS_TYPE_BOOLEAN, &immutable);
 }
 
 static void roaming_changed(struct connman_service *service)
 {
-       if (service->path == NULL)
+       dbus_bool_t roaming;
+
+       if (!service->path)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
+       roaming = service->roaming;
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "Roaming",
-                                       DBUS_TYPE_BOOLEAN, &service->roaming);
+                                       DBUS_TYPE_BOOLEAN, &roaming);
 }
 
 static void autoconnect_changed(struct connman_service *service)
 {
-       if (service->path == NULL)
+       dbus_bool_t autoconnect;
+
+       if (!service->path)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
+       autoconnect = service->autoconnect;
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "AutoConnect",
-                               DBUS_TYPE_BOOLEAN, &service->autoconnect);
+                               DBUS_TYPE_BOOLEAN, &autoconnect);
 }
 
 static void append_security(DBusMessageIter *iter, void *user_data)
@@ -1433,7 +1563,7 @@ static void append_security(DBusMessageIter *iter, void *user_data)
        const char *str;
 
        str = security2string(service->security);
-       if (str != NULL)
+       if (str)
                dbus_message_iter_append_basic(iter,
                                DBUS_TYPE_STRING, &str);
 
@@ -1442,14 +1572,14 @@ static void append_security(DBusMessageIter *iter, void *user_data)
         * are configured as open or no security, so filter
         * appropriately.
         */
-       if (service->wps == TRUE) {
+       if (service->wps) {
                switch (service->security) {
                case CONNMAN_SERVICE_SECURITY_PSK:
                case CONNMAN_SERVICE_SECURITY_WPA:
                case CONNMAN_SERVICE_SECURITY_RSN:
                        str = "wps";
                        dbus_message_iter_append_basic(iter,
-                               DBUS_TYPE_STRING, &str);
+                                               DBUS_TYPE_STRING, &str);
                        break;
                case CONNMAN_SERVICE_SECURITY_UNKNOWN:
                case CONNMAN_SERVICE_SECURITY_NONE:
@@ -1464,10 +1594,10 @@ static void append_ethernet(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                __connman_ipconfig_append_ethernet(service->ipconfig_ipv4,
                                                                        iter);
-       else if (service->ipconfig_ipv6 != NULL)
+       else if (service->ipconfig_ipv6)
                __connman_ipconfig_append_ethernet(service->ipconfig_ipv6,
                                                                        iter);
 }
@@ -1476,13 +1606,10 @@ static void append_ipv4(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       DBG("ipv4 %p state %s", service->ipconfig_ipv4,
-                               state2string(service->state_ipv4));
-
-       if (is_connected_state(service, service->state_ipv4) == FALSE)
+       if (!is_connected_state(service, service->state_ipv4))
                return;
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                __connman_ipconfig_append_ipv4(service->ipconfig_ipv4, iter);
 }
 
@@ -1490,13 +1617,10 @@ static void append_ipv6(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       DBG("ipv6 %p state %s", service->ipconfig_ipv6,
-                               state2string(service->state_ipv6));
-
-       if (is_connected_state(service, service->state_ipv6) == FALSE)
+       if (!is_connected_state(service, service->state_ipv6))
                return;
 
-       if (service->ipconfig_ipv6 != NULL)
+       if (service->ipconfig_ipv6)
                __connman_ipconfig_append_ipv6(service->ipconfig_ipv6, iter,
                                                service->ipconfig_ipv4);
 }
@@ -1505,7 +1629,7 @@ static void append_ipv4config(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                __connman_ipconfig_append_ipv4config(service->ipconfig_ipv4,
                                                        iter);
 }
@@ -1514,20 +1638,25 @@ static void append_ipv6config(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       if (service->ipconfig_ipv6 != NULL)
+       if (service->ipconfig_ipv6)
                __connman_ipconfig_append_ipv6config(service->ipconfig_ipv6,
                                                        iter);
 }
 
-static void append_nameservers(DBusMessageIter *iter, char **servers)
+static void append_nameservers(DBusMessageIter *iter,
+               struct connman_service *service, char **servers)
 {
        int i;
+       bool available = true;
 
-       DBG("%p", servers);
+       for (i = 0; servers[i]; i++) {
+               if (service)
+                       available = nameserver_available(service, servers[i]);
 
-       for (i = 0; servers[i] != NULL; i++) {
-               DBG("servers[%d] %s", i, servers[i]);
-               dbus_message_iter_append_basic(iter,
+               DBG("servers[%d] %s available %d", i, servers[i], available);
+
+               if (available)
+                       dbus_message_iter_append_basic(iter,
                                        DBUS_TYPE_STRING, &servers[i]);
        }
 }
@@ -1536,18 +1665,30 @@ static void append_dns(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       if (is_connected(service) == FALSE)
+       if (!is_connected(service))
                return;
 
-       if (service->nameservers_config != NULL) {
-               append_nameservers(iter, service->nameservers_config);
+       if (service->nameservers_config) {
+               append_nameservers(iter, service, service->nameservers_config);
                return;
        } else {
-               if (service->nameservers != NULL)
-                       append_nameservers(iter, service->nameservers);
+               if (service->nameservers)
+                       append_nameservers(iter, service,
+                                       service->nameservers);
 
-               if (service->nameservers_auto != NULL)
-                       append_nameservers(iter, service->nameservers_auto);
+               if (service->nameservers_auto)
+                       append_nameservers(iter, service,
+                                       service->nameservers_auto);
+
+               if (!service->nameservers && !service->nameservers_auto) {
+                       char **ns;
+
+                       DBG("append fallback nameservers");
+
+                       ns = connman_setting_get_string_list("FallbackNameservers");
+                       if (ns)
+                               append_nameservers(iter, service, ns);
+               }
        }
 }
 
@@ -1555,20 +1696,20 @@ static void append_dnsconfig(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       if (service->nameservers_config == NULL)
+       if (!service->nameservers_config)
                return;
 
-       append_nameservers(iter, service->nameservers_config);
+       append_nameservers(iter, NULL, service->nameservers_config);
 }
 
 static void append_ts(DBusMessageIter *iter, void *user_data)
 {
        GSList *list = user_data;
 
-       while (list != NULL) {
+       while (list) {
                char *timeserver = list->data;
 
-               if (timeserver != NULL)
+               if (timeserver)
                        dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                        &timeserver);
 
@@ -1581,7 +1722,7 @@ static void append_tsconfig(DBusMessageIter *iter, void *user_data)
        struct connman_service *service = user_data;
        int i;
 
-       if (service->timeservers_config == NULL)
+       if (!service->timeservers_config)
                return;
 
        for (i = 0; service->timeservers_config[i]; i++) {
@@ -1596,7 +1737,7 @@ static void append_domainconfig(DBusMessageIter *iter, void *user_data)
        struct connman_service *service = user_data;
        int i;
 
-       if (service->domains == NULL)
+       if (!service->domains)
                return;
 
        for (i = 0; service->domains[i]; i++)
@@ -1608,13 +1749,13 @@ static void append_domain(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       if (is_connected(service) == FALSE &&
-                               is_connecting(service) == FALSE)
+       if (!is_connected(service) &&
+                               !is_connecting(service))
                return;
 
-       if (service->domains != NULL)
+       if (service->domains)
                append_domainconfig(iter, user_data);
-       else if (service->domainname != NULL)
+       else if (service->domainname)
                dbus_message_iter_append_basic(iter,
                                DBUS_TYPE_STRING, &service->domainname);
 }
@@ -1624,7 +1765,7 @@ static void append_proxies(DBusMessageIter *iter, void *user_data)
        struct connman_service *service = user_data;
        int i;
 
-       if (service->proxies == NULL)
+       if (!service->proxies)
                return;
 
        for (i = 0; service->proxies[i]; i++)
@@ -1637,7 +1778,7 @@ static void append_excludes(DBusMessageIter *iter, void *user_data)
        struct connman_service *service = user_data;
        int i;
 
-       if (service->excludes == NULL)
+       if (!service->excludes)
                return;
 
        for (i = 0; service->excludes[i]; i++)
@@ -1653,9 +1794,7 @@ static void append_proxy(DBusMessageIter *iter, void *user_data)
        const char *method = proxymethod2string(
                CONNMAN_SERVICE_PROXY_METHOD_DIRECT);
 
-       DBG("");
-
-       if (is_connected(service) == FALSE)
+       if (!is_connected(service))
                return;
 
        proxy = connman_service_get_proxy_method(service);
@@ -1676,17 +1815,17 @@ static void append_proxy(DBusMessageIter *iter, void *user_data)
                break;
        case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
                /* Maybe DHCP, or WPAD,  has provided an url for a pac file */
-               if (service->ipconfig_ipv4 != NULL)
+               if (service->ipconfig_ipv4)
                        pac = __connman_ipconfig_get_proxy_autoconfig(
                                service->ipconfig_ipv4);
-               else if (service->ipconfig_ipv6 != NULL)
+               else if (service->ipconfig_ipv6)
                        pac = __connman_ipconfig_get_proxy_autoconfig(
                                service->ipconfig_ipv6);
 
-               if (service->pac == NULL && pac == NULL)
+               if (!service->pac && !pac)
                        goto done;
 
-               if (service->pac != NULL)
+               if (service->pac)
                        pac = service->pac;
 
                connman_dbus_dict_append_basic(iter, "URL",
@@ -1715,18 +1854,18 @@ static void append_proxyconfig(DBusMessageIter *iter, void *user_data)
        case CONNMAN_SERVICE_PROXY_METHOD_DIRECT:
                break;
        case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
-               if (service->proxies != NULL)
+               if (service->proxies)
                        connman_dbus_dict_append_array(iter, "Servers",
                                                DBUS_TYPE_STRING,
                                                append_proxies, service);
 
-               if (service->excludes != NULL)
+               if (service->excludes)
                        connman_dbus_dict_append_array(iter, "Excludes",
                                                DBUS_TYPE_STRING,
                                                append_excludes, service);
                break;
        case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
-               if (service->pac != NULL)
+               if (service->pac)
                        connman_dbus_dict_append_basic(iter, "URL",
                                        DBUS_TYPE_STRING, &service->pac);
                break;
@@ -1742,12 +1881,10 @@ static void append_provider(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
 
-       DBG("%p %p", service, service->provider);
-
-       if (is_connected(service) == FALSE)
+       if (!is_connected(service))
                return;
 
-       if (service->provider != NULL)
+       if (service->provider)
                __connman_provider_append_properties(service->provider, iter);
 }
 
@@ -1757,7 +1894,7 @@ static void settings_changed(struct connman_service *service,
 {
        enum connman_ipconfig_type type;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        type = __connman_ipconfig_get_config_type(ipconfig);
@@ -1776,7 +1913,7 @@ static void settings_changed(struct connman_service *service,
 
 static void ipv4_configuration_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_dict(service->path,
@@ -1788,7 +1925,7 @@ static void ipv4_configuration_changed(struct connman_service *service)
 
 static void ipv6_configuration_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_dict(service->path,
@@ -1800,7 +1937,7 @@ static void ipv6_configuration_changed(struct connman_service *service)
 
 static void dns_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_array(service->path,
@@ -1810,7 +1947,7 @@ static void dns_changed(struct connman_service *service)
 
 static void dns_configuration_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_array(service->path,
@@ -1823,7 +1960,7 @@ static void dns_configuration_changed(struct connman_service *service)
 
 static void domain_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_array(service->path,
@@ -1833,7 +1970,7 @@ static void domain_changed(struct connman_service *service)
 
 static void domain_configuration_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_array(service->path,
@@ -1844,7 +1981,7 @@ static void domain_configuration_changed(struct connman_service *service)
 
 static void proxy_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_dict(service->path,
@@ -1854,7 +1991,7 @@ static void proxy_changed(struct connman_service *service)
 
 static void proxy_configuration_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_dict(service->path,
@@ -1866,7 +2003,7 @@ static void proxy_configuration_changed(struct connman_service *service)
 
 static void timeservers_configuration_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_array(service->path,
@@ -1878,7 +2015,7 @@ static void timeservers_configuration_changed(struct connman_service *service)
 
 static void link_changed(struct connman_service *service)
 {
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_dict(service->path,
@@ -1889,7 +2026,7 @@ static void link_changed(struct connman_service *service)
 static void stats_append_counters(DBusMessageIter *dict,
                        struct connman_stats_data *stats,
                        struct connman_stats_data *counters,
-                       connman_bool_t append_all)
+                       bool append_all)
 {
        if (counters->rx_packets != stats->rx_packets || append_all) {
                counters->rx_packets = stats->rx_packets;
@@ -1949,7 +2086,7 @@ static void stats_append_counters(DBusMessageIter *dict,
 static void stats_append(struct connman_service *service,
                                const char *counter,
                                struct connman_stats_counter *counters,
-                               connman_bool_t append_all)
+                               bool append_all)
 {
        DBusMessageIter array, dict;
        DBusMessage *msg;
@@ -1957,7 +2094,7 @@ static void stats_append(struct connman_service *service,
        DBG("service %p counter %s", service, counter);
 
        msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL);
-       if (msg == NULL)
+       if (!msg)
                return;
 
        dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH,
@@ -1997,7 +2134,7 @@ static void stats_update(struct connman_service *service,
 
        DBG("service %p", service);
 
-       if (stats->valid == TRUE) {
+       if (stats->valid) {
                data->rx_packets +=
                        rx_packets - data_last->rx_packets;
                data->tx_packets +=
@@ -2015,7 +2152,7 @@ static void stats_update(struct connman_service *service,
                data->tx_dropped +=
                        tx_dropped - data_last->tx_dropped;
        } else {
-               stats->valid = TRUE;
+               stats->valid = true;
        }
 
        data_last->rx_packets = rx_packets;
@@ -2044,10 +2181,10 @@ void __connman_service_notify(struct connman_service *service,
        struct connman_stats_data *data;
        int err;
 
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (is_connected(service) == FALSE)
+       if (!is_connected(service))
                return;
 
        stats_update(service,
@@ -2068,7 +2205,7 @@ void __connman_service_notify(struct connman_service *service,
                counters = value;
 
                stats_append(service, counter, counters, counters->append_all);
-               counters->append_all = FALSE;
+               counters->append_all = false;
        }
 }
 
@@ -2082,14 +2219,14 @@ int __connman_service_counter_register(const char *counter)
 
        counter_list = g_slist_prepend(counter_list, (gpointer)counter);
 
-       for (list = service_list; list != NULL; list = list->next) {
+       for (list = service_list; list; list = list->next) {
                service = list->data;
 
                counters = g_try_new0(struct connman_stats_counter, 1);
-               if (counters == NULL)
+               if (!counters)
                        return -ENOMEM;
 
-               counters->append_all = TRUE;
+               counters->append_all = true;
 
                g_hash_table_replace(service->counter_table, (gpointer)counter,
                                        counters);
@@ -2105,7 +2242,7 @@ void __connman_service_counter_unregister(const char *counter)
 
        DBG("counter %s", counter);
 
-       for (list = service_list; list != NULL; list = list->next) {
+       for (list = service_list; list; list = list->next) {
                service = list->data;
 
                g_hash_table_remove(service->counter_table, counter);
@@ -2118,42 +2255,24 @@ int __connman_service_iterate_services(service_iterate_cb cb, void *user_data)
 {
        GList *list;
 
-       for (list = service_list; list != NULL; list = list->next) {
+       for (list = service_list; list; list = list->next) {
                struct connman_service *service = list->data;
 
-               cb(service, service->name, service->state, user_data);
+               cb(service, user_data);
        }
 
        return 0;
 }
 
-void __connman_service_session_inc(struct connman_service *service)
-{
-       DBG("service %p ref count %d", service,
-               service->session_usage_count + 1);
-
-       __sync_fetch_and_add(&service->session_usage_count, 1);
-}
-
-connman_bool_t __connman_service_session_dec(struct connman_service *service)
-{
-       DBG("service %p ref count %d", service,
-               service->session_usage_count - 1);
-
-       if (__sync_fetch_and_sub(&service->session_usage_count, 1) != 1)
-               return FALSE;
-
-       return TRUE;
-}
-
 static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                                        struct connman_service *service)
 {
+       dbus_bool_t val;
        const char *str;
        GSList *list;
 
        str = __connman_service_type2string(service->type);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(dict, "Type",
                                                DBUS_TYPE_STRING, &str);
 
@@ -2161,12 +2280,12 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                                DBUS_TYPE_STRING, append_security, service);
 
        str = state2string(service->state);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(dict, "State",
                                                DBUS_TYPE_STRING, &str);
 
        str = error2string(service->error);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(dict, "Error",
                                                DBUS_TYPE_STRING, &str);
 
@@ -2174,20 +2293,23 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                connman_dbus_dict_append_basic(dict, "Strength",
                                        DBUS_TYPE_BYTE, &service->strength);
 
+       val = service->favorite;
        connman_dbus_dict_append_basic(dict, "Favorite",
-                                       DBUS_TYPE_BOOLEAN, &service->favorite);
+                                       DBUS_TYPE_BOOLEAN, &val);
 
+       val = service->immutable;
        connman_dbus_dict_append_basic(dict, "Immutable",
-                                       DBUS_TYPE_BOOLEAN, &service->immutable);
+                                       DBUS_TYPE_BOOLEAN, &val);
 
-       if (service->favorite == TRUE)
-               connman_dbus_dict_append_basic(dict, "AutoConnect",
-                               DBUS_TYPE_BOOLEAN, &service->autoconnect);
+       if (service->favorite)
+               val = service->autoconnect;
        else
-               connman_dbus_dict_append_basic(dict, "AutoConnect",
-                                       DBUS_TYPE_BOOLEAN, &service->favorite);
+               val = service->favorite;
 
-       if (service->name != NULL)
+       connman_dbus_dict_append_basic(dict, "AutoConnect",
+                               DBUS_TYPE_BOOLEAN, &val);
+
+       if (service->name)
                connman_dbus_dict_append_basic(dict, "Name",
                                        DBUS_TYPE_STRING, &service->name);
 
@@ -2196,11 +2318,12 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        case CONNMAN_SERVICE_TYPE_CELLULAR:
+               val = service->roaming;
                connman_dbus_dict_append_basic(dict, "Roaming",
-                                       DBUS_TYPE_BOOLEAN, &service->roaming);
+                                       DBUS_TYPE_BOOLEAN, &val);
 
                connman_dbus_dict_append_dict(dict, "Ethernet",
                                                append_ethernet, service);
@@ -2208,6 +2331,7 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
        case CONNMAN_SERVICE_TYPE_WIFI:
        case CONNMAN_SERVICE_TYPE_ETHERNET:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_GADGET:
                connman_dbus_dict_append_dict(dict, "Ethernet",
                                                append_ethernet, service);
                break;
@@ -2270,7 +2394,7 @@ static void append_struct_service(DBusMessageIter *iter,
                                                        &service->path);
 
        connman_dbus_dict_open(&entry, &dict);
-       if (function != NULL)
+       if (function)
                function(&dict, service);
        connman_dbus_dict_close(&entry, &dict);
 
@@ -2289,7 +2413,7 @@ static void append_struct(gpointer value, gpointer user_data)
        struct connman_service *service = value;
        DBusMessageIter *iter = user_data;
 
-       if (service->path == NULL)
+       if (!service->path)
                return;
 
        append_struct_service(iter, append_dict_properties, service);
@@ -2300,25 +2424,39 @@ void __connman_service_list_struct(DBusMessageIter *iter)
        g_list_foreach(service_list, append_struct, iter);
 }
 
-connman_bool_t __connman_service_is_hidden(struct connman_service *service)
+bool __connman_service_is_hidden(struct connman_service *service)
 {
        return service->hidden;
 }
 
-connman_bool_t
+bool
 __connman_service_is_split_routing(struct connman_service *service)
 {
        return service->do_split_routing;
 }
 
+bool __connman_service_index_is_split_routing(int index)
+{
+       struct connman_service *service;
+
+       if (index < 0)
+               return false;
+
+       service = __connman_service_lookup_from_index(index);
+       if (!service)
+               return false;
+
+       return __connman_service_is_split_routing(service);
+}
+
 int __connman_service_get_index(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return -1;
 
-       if (service->network != NULL)
+       if (service->network)
                return connman_network_get_index(service->network);
-       else if (service->provider != NULL)
+       else if (service->provider)
                return connman_provider_get_index(service->provider);
 
        return -1;
@@ -2326,16 +2464,34 @@ int __connman_service_get_index(struct connman_service *service)
 
 void __connman_service_set_hidden(struct connman_service *service)
 {
-       if (service == NULL || service->hidden == TRUE)
+       if (!service || service->hidden)
+               return;
+
+       service->hidden_service = true;
+}
+
+void __connman_service_set_hostname(struct connman_service *service,
+                                               const char *hostname)
+{
+       if (!service || service->hidden)
                return;
 
-       service->hidden_service = TRUE;
+       g_free(service->hostname);
+       service->hostname = g_strdup(hostname);
+}
+
+const char *__connman_service_get_hostname(struct connman_service *service)
+{
+       if (!service)
+               return NULL;
+
+       return service->hostname;
 }
 
 void __connman_service_set_domainname(struct connman_service *service,
                                                const char *domainname)
 {
-       if (service == NULL || service->hidden == TRUE)
+       if (!service || service->hidden)
                return;
 
        g_free(service->domainname);
@@ -2346,10 +2502,10 @@ void __connman_service_set_domainname(struct connman_service *service,
 
 const char *connman_service_get_domainname(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
-       if (service->domains != NULL)
+       if (service->domains)
                return service->domains[0];
        else
                return service->domainname;
@@ -2357,23 +2513,23 @@ const char *connman_service_get_domainname(struct connman_service *service)
 
 char **connman_service_get_nameservers(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
-       if (service->nameservers_config != NULL)
+       if (service->nameservers_config)
                return g_strdupv(service->nameservers_config);
-       else if (service->nameservers != NULL ||
-                                       service->nameservers_auto != NULL) {
+       else if (service->nameservers ||
+                                       service->nameservers_auto) {
                int len = 0, len_auto = 0, i;
                char **nameservers;
 
-               if (service->nameservers != NULL)
+               if (service->nameservers)
                        len = g_strv_length(service->nameservers);
-               if (service->nameservers_auto != NULL)
+               if (service->nameservers_auto)
                        len_auto = g_strv_length(service->nameservers_auto);
 
                nameservers = g_try_new0(char *, len + len_auto + 1);
-               if (nameservers == NULL)
+               if (!nameservers)
                        return NULL;
 
                for (i = 0; i < len; i++)
@@ -2386,12 +2542,12 @@ char **connman_service_get_nameservers(struct connman_service *service)
                return nameservers;
        }
 
-       return NULL;
+       return g_strdupv(connman_setting_get_string_list("FallbackNameservers"));
 }
 
 char **connman_service_get_timeservers_config(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->timeservers_config;
@@ -2399,19 +2555,16 @@ char **connman_service_get_timeservers_config(struct connman_service *service)
 
 char **connman_service_get_timeservers(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
-       if (service->timeservers != NULL)
-               return service->timeservers;
-
-       return NULL;
+       return service->timeservers;
 }
 
 void connman_service_set_proxy_method(struct connman_service *service,
                                        enum connman_service_proxy_method method)
 {
-       if (service == NULL || service->hidden == TRUE)
+       if (!service || service->hidden)
                return;
 
        service->proxy = method;
@@ -2425,12 +2578,12 @@ void connman_service_set_proxy_method(struct connman_service *service,
 enum connman_service_proxy_method connman_service_get_proxy_method(
                                        struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
 
        if (service->proxy_config != CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN) {
                if (service->proxy_config == CONNMAN_SERVICE_PROXY_METHOD_AUTO &&
-                               service->pac == NULL)
+                               !service->pac)
                        return service->proxy;
 
                return service->proxy_config;
@@ -2451,7 +2604,7 @@ char **connman_service_get_proxy_excludes(struct connman_service *service)
 
 const char *connman_service_get_proxy_url(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->pac;
@@ -2460,7 +2613,7 @@ const char *connman_service_get_proxy_url(struct connman_service *service)
 void __connman_service_set_proxy_autoconfig(struct connman_service *service,
                                                        const char *url)
 {
-       if (service == NULL || service->hidden == TRUE)
+       if (!service || service->hidden)
                return;
 
        service->proxy = CONNMAN_SERVICE_PROXY_METHOD_AUTO;
@@ -2483,7 +2636,7 @@ void __connman_service_set_proxy_autoconfig(struct connman_service *service,
 
 const char *connman_service_get_proxy_autoconfig(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        if (service->ipconfig_ipv4)
@@ -2500,13 +2653,13 @@ void __connman_service_set_timeservers(struct connman_service *service,
 {
        int i;
 
-       if (service == NULL)
+       if (!service)
                return;
 
        g_strfreev(service->timeservers);
        service->timeservers = NULL;
 
-       for (i = 0; timeservers != NULL && timeservers[i] != NULL; i++)
+       for (i = 0; timeservers && timeservers[i]; i++)
                __connman_service_timeserver_append(service, timeservers[i]);
 }
 
@@ -2517,13 +2670,13 @@ int __connman_service_timeserver_append(struct connman_service *service,
 
        DBG("service %p timeserver %s", service, timeserver);
 
-       if (timeserver == NULL)
+       if (!timeserver)
                return -EINVAL;
 
-       if (service->timeservers != NULL) {
+       if (service->timeservers) {
                int i;
 
-               for (i = 0; service->timeservers[i] != NULL; i++)
+               for (i = 0; service->timeservers[i]; i++)
                        if (g_strcmp0(service->timeservers[i], timeserver) == 0)
                                return -EEXIST;
 
@@ -2535,7 +2688,7 @@ int __connman_service_timeserver_append(struct connman_service *service,
                service->timeservers = g_try_new0(char *, len + 2);
        }
 
-       if (service->timeservers == NULL)
+       if (!service->timeservers)
                return -ENOMEM;
 
        service->timeservers[len] = g_strdup(timeserver);
@@ -2552,14 +2705,14 @@ int __connman_service_timeserver_remove(struct connman_service *service,
 
        DBG("service %p timeserver %s", service, timeserver);
 
-       if (timeserver == NULL)
+       if (!timeserver)
                return -EINVAL;
 
-       if (service->timeservers == NULL)
+       if (!service->timeservers)
                return 0;
 
-       for (i = 0; service->timeservers != NULL &&
-                                       service->timeservers[i] != NULL; i++)
+       for (i = 0; service->timeservers &&
+                                       service->timeservers[i]; i++)
                if (g_strcmp0(service->timeservers[i], timeserver) == 0) {
                        found = 1;
                        break;
@@ -2578,13 +2731,13 @@ int __connman_service_timeserver_remove(struct connman_service *service,
        }
 
        servers = g_try_new0(char *, len);
-       if (servers == NULL)
+       if (!servers)
                return -ENOMEM;
 
        for (i = 0, j = 0; i < len; i++) {
                if (g_strcmp0(service->timeservers[i], timeserver) != 0) {
                        servers[j] = g_strdup(service->timeservers[i]);
-                       if (servers[j] == NULL)
+                       if (!servers[j])
                                return -ENOMEM;
                        j++;
                }
@@ -2600,10 +2753,10 @@ int __connman_service_timeserver_remove(struct connman_service *service,
 void __connman_service_timeserver_changed(struct connman_service *service,
                GSList *ts_list)
 {
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_array(service->path,
@@ -2614,7 +2767,7 @@ void __connman_service_timeserver_changed(struct connman_service *service,
 void __connman_service_set_pac(struct connman_service *service,
                                        const char *pac)
 {
-       if (service->hidden == TRUE)
+       if (service->hidden)
                return;
        g_free(service->pac);
        service->pac = g_strdup(pac);
@@ -2625,13 +2778,13 @@ void __connman_service_set_pac(struct connman_service *service,
 void __connman_service_set_identity(struct connman_service *service,
                                        const char *identity)
 {
-       if (service->immutable || service->hidden == TRUE)
+       if (service->immutable || service->hidden)
                return;
 
        g_free(service->identity);
        service->identity = g_strdup(identity);
 
-       if (service->network != NULL)
+       if (service->network)
                connman_network_set_string(service->network,
                                        "WiFi.Identity",
                                        service->identity);
@@ -2640,12 +2793,12 @@ void __connman_service_set_identity(struct connman_service *service,
 void __connman_service_set_agent_identity(struct connman_service *service,
                                                const char *agent_identity)
 {
-       if (service->hidden == TRUE)
+       if (service->hidden)
                return;
        g_free(service->agent_identity);
        service->agent_identity = g_strdup(agent_identity);
 
-       if (service->network != NULL)
+       if (service->network)
                connman_network_set_string(service->network,
                                        "WiFi.AgentIdentity",
                                        service->agent_identity);
@@ -2658,12 +2811,12 @@ static int check_passphrase(struct connman_service *service,
        guint i;
        gsize length;
 
-       if (passphrase == NULL) {
+       if (!passphrase) {
                /*
                 * This will prevent __connman_service_set_passphrase() to
                 * wipe the passphrase out in case of -ENOKEY error for a
                 * favorite service. */
-               if (service->favorite == TRUE)
+               if (service->favorite)
                        return 1;
                else
                        return 0;
@@ -2713,7 +2866,7 @@ int __connman_service_set_passphrase(struct connman_service *service,
 {
        int err = 0;
 
-       if (service->immutable == TRUE || service->hidden == TRUE)
+       if (service->immutable || service->hidden)
                return -EINVAL;
 
        err = check_passphrase(service, service->security, passphrase);
@@ -2722,7 +2875,7 @@ int __connman_service_set_passphrase(struct connman_service *service,
                g_free(service->passphrase);
                service->passphrase = g_strdup(passphrase);
 
-               if (service->network != NULL)
+               if (service->network)
                        connman_network_set_string(service->network,
                                                        "WiFi.Passphrase",
                                                        service->passphrase);
@@ -2734,26 +2887,12 @@ int __connman_service_set_passphrase(struct connman_service *service,
 
 const char *__connman_service_get_passphrase(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->passphrase;
 }
 
-void __connman_service_set_agent_passphrase(struct connman_service *service,
-                                               const char *agent_passphrase)
-{
-       if (service->hidden == TRUE)
-               return;
-       g_free(service->agent_passphrase);
-       service->agent_passphrase = g_strdup(agent_passphrase);
-
-       if (service->network != NULL)
-               connman_network_set_string(service->network,
-                                       "WiFi.AgentPassphrase",
-                                       service->agent_passphrase);
-}
-
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -2764,7 +2903,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
        DBG("service %p", service);
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_iter_init_append(reply, &array);
@@ -2809,7 +2948,7 @@ static int update_proxy_configuration(struct connman_service *service,
 
                type = dbus_message_iter_get_arg_type(&variant);
 
-               if (g_str_equal(key, "Method") == TRUE) {
+               if (g_str_equal(key, "Method")) {
                        const char *val;
 
                        if (type != DBUS_TYPE_STRING)
@@ -2817,19 +2956,19 @@ static int update_proxy_configuration(struct connman_service *service,
 
                        dbus_message_iter_get_basic(&variant, &val);
                        method = string2proxymethod(val);
-               } else if (g_str_equal(key, "URL") == TRUE) {
+               } else if (g_str_equal(key, "URL")) {
                        if (type != DBUS_TYPE_STRING)
                                goto error;
 
                        dbus_message_iter_get_basic(&variant, &url);
-               } else if (g_str_equal(key, "Servers") == TRUE) {
+               } else if (g_str_equal(key, "Servers")) {
                        DBusMessageIter str_array;
 
                        if (type != DBUS_TYPE_ARRAY)
                                goto error;
 
                        servers_str = g_string_new(NULL);
-                       if (servers_str == NULL)
+                       if (!servers_str)
                                goto error;
 
                        dbus_message_iter_recurse(&variant, &str_array);
@@ -2848,14 +2987,14 @@ static int update_proxy_configuration(struct connman_service *service,
 
                                dbus_message_iter_next(&str_array);
                        }
-               } else if (g_str_equal(key, "Excludes") == TRUE) {
+               } else if (g_str_equal(key, "Excludes")) {
                        DBusMessageIter str_array;
 
                        if (type != DBUS_TYPE_ARRAY)
                                goto error;
 
                        excludes_str = g_string_new(NULL);
-                       if (excludes_str == NULL)
+                       if (!excludes_str)
                                goto error;
 
                        dbus_message_iter_recurse(&variant, &str_array);
@@ -2883,10 +3022,10 @@ static int update_proxy_configuration(struct connman_service *service,
        case CONNMAN_SERVICE_PROXY_METHOD_DIRECT:
                break;
        case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
-               if (servers_str == NULL && service->proxies == NULL)
+               if (!servers_str && !service->proxies)
                        goto error;
 
-               if (servers_str != NULL) {
+               if (servers_str) {
                        g_strfreev(service->proxies);
 
                        if (servers_str->len > 0)
@@ -2896,7 +3035,7 @@ static int update_proxy_configuration(struct connman_service *service,
                                service->proxies = NULL;
                }
 
-               if (excludes_str != NULL) {
+               if (excludes_str) {
                        g_strfreev(service->excludes);
 
                        if (excludes_str->len > 0)
@@ -2906,14 +3045,14 @@ static int update_proxy_configuration(struct connman_service *service,
                                service->excludes = NULL;
                }
 
-               if (service->proxies == NULL)
+               if (!service->proxies)
                        method = CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
 
                break;
        case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
                g_free(service->pac);
 
-               if (url != NULL && strlen(url) > 0)
+               if (url && strlen(url) > 0)
                        service->pac = g_strdup(url);
                else
                        service->pac = NULL;
@@ -2929,10 +3068,10 @@ static int update_proxy_configuration(struct connman_service *service,
                goto error;
        }
 
-       if (servers_str != NULL)
+       if (servers_str)
                g_string_free(servers_str, TRUE);
 
-       if (excludes_str != NULL)
+       if (excludes_str)
                g_string_free(excludes_str, TRUE);
 
        service->proxy_config = method;
@@ -2940,10 +3079,10 @@ static int update_proxy_configuration(struct connman_service *service,
        return 0;
 
 error:
-       if (servers_str != NULL)
+       if (servers_str)
                g_string_free(servers_str, TRUE);
 
-       if (excludes_str != NULL)
+       if (excludes_str)
                g_string_free(excludes_str, TRUE);
 
        return -EINVAL;
@@ -2969,7 +3108,7 @@ int __connman_service_reset_ipconfig(struct connman_service *service,
        } else
                return -EINVAL;
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -ENXIO;
 
        old_method = __connman_ipconfig_get_method(ipconfig);
@@ -2981,7 +3120,7 @@ int __connman_service_reset_ipconfig(struct connman_service *service,
        else
                new_ipconfig = create_ip6config(service, index);
 
-       if (array != NULL) {
+       if (array) {
                err = __connman_ipconfig_set_config(new_ipconfig, array);
                if (err < 0) {
                        __connman_ipconfig_unref(new_ipconfig);
@@ -2996,25 +3135,24 @@ int __connman_service_reset_ipconfig(struct connman_service *service,
                __connman_network_clear_ipconfig(service->network, ipconfig);
        __connman_ipconfig_unref(ipconfig);
 
-       if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
+       if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                service->ipconfig_ipv4 = new_ipconfig;
-       } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
+       else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
                service->ipconfig_ipv6 = new_ipconfig;
-       }
 
        __connman_ipconfig_enable(new_ipconfig);
 
-       if (new_state != NULL && new_method != old_method) {
+       if (new_state && new_method != old_method) {
                if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                        *new_state = service->state_ipv4;
                else
                        *new_state = service->state_ipv6;
-               __connman_service_auto_connect();
+               __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
        }
 
        DBG("err %d ipconfig %p type %d method %d state %s", err,
                new_ipconfig, type, new_method,
-               new_state == NULL ? "-" : state2string(*new_state));
+               !new_state  ? "-" : state2string(*new_state));
 
        return err;
 }
@@ -3029,7 +3167,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        DBG("service %p", service);
 
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -3045,13 +3183,13 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        type = dbus_message_iter_get_arg_type(&value);
 
-       if (g_str_equal(name, "AutoConnect") == TRUE) {
-               connman_bool_t autoconnect;
+       if (g_str_equal(name, "AutoConnect")) {
+               dbus_bool_t autoconnect;
 
                if (type != DBUS_TYPE_BOOLEAN)
                        return __connman_error_invalid_arguments(msg);
 
-               if (service->favorite == FALSE)
+               if (!service->favorite)
                        return __connman_error_invalid_service(msg);
 
                dbus_message_iter_get_basic(&value, &autoconnect);
@@ -3063,30 +3201,28 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                autoconnect_changed(service);
 
-               if (autoconnect == TRUE)
-                       __connman_service_auto_connect();
+               if (autoconnect)
+                       __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
                service_save(service);
-       } else if (g_str_equal(name, "Nameservers.Configuration") == TRUE) {
+       } else if (g_str_equal(name, "Nameservers.Configuration")) {
                DBusMessageIter entry;
                GString *str;
                int index;
                const char *gw;
 
-               if (service->immutable == TRUE)
+               if (__connman_provider_is_immutable(service->provider) ||
+                               service->immutable)
                        return __connman_error_not_supported(msg);
 
                if (type != DBUS_TYPE_ARRAY)
                        return __connman_error_invalid_arguments(msg);
 
                str = g_string_new(NULL);
-               if (str == NULL)
+               if (!str)
                        return __connman_error_invalid_arguments(msg);
 
-               if (service->type == CONNMAN_SERVICE_TYPE_VPN)
-                       index = connman_provider_get_index(service->provider);
-               else
-                       index = connman_network_get_index(service->network);
+               index = __connman_service_get_index(service);
                gw = __connman_ipconfig_get_gateway_from_index(index,
                        CONNMAN_IPCONFIG_TYPE_ALL);
 
@@ -3137,12 +3273,12 @@ static DBusMessage *set_property(DBusConnection *conn,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
 
                service_save(service);
-       } else if (g_str_equal(name, "Timeservers.Configuration") == TRUE) {
+       } else if (g_str_equal(name, "Timeservers.Configuration")) {
                DBusMessageIter entry;
                GSList *list = NULL;
                int count = 0;
 
-               if (service->immutable == TRUE)
+               if (service->immutable)
                        return __connman_error_not_supported(msg);
 
                if (type != DBUS_TYPE_ARRAY)
@@ -3168,10 +3304,10 @@ static DBusMessage *set_property(DBusConnection *conn,
                g_strfreev(service->timeservers_config);
                service->timeservers_config = NULL;
 
-               if (list != NULL) {
+               if (list) {
                        service->timeservers_config = g_new0(char *, count+1);
 
-                       while (list != NULL) {
+                       while (list) {
                                count--;
                                service->timeservers_config[count] = list->data;
                                list = g_slist_delete_link(list, list);
@@ -3184,18 +3320,18 @@ static DBusMessage *set_property(DBusConnection *conn,
                if (service == __connman_service_get_default())
                        __connman_timeserver_sync(service);
 
-       } else if (g_str_equal(name, "Domains.Configuration") == TRUE) {
+       } else if (g_str_equal(name, "Domains.Configuration")) {
                DBusMessageIter entry;
                GString *str;
 
-               if (service->immutable == TRUE)
+               if (service->immutable)
                        return __connman_error_not_supported(msg);
 
                if (type != DBUS_TYPE_ARRAY)
                        return __connman_error_invalid_arguments(msg);
 
                str = g_string_new(NULL);
-               if (str == NULL)
+               if (!str)
                        return __connman_error_invalid_arguments(msg);
 
                dbus_message_iter_recurse(&value, &entry);
@@ -3225,10 +3361,10 @@ static DBusMessage *set_property(DBusConnection *conn,
                domain_changed(service);
 
                service_save(service);
-       } else if (g_str_equal(name, "Proxy.Configuration") == TRUE) {
+       } else if (g_str_equal(name, "Proxy.Configuration")) {
                int err;
 
-               if (service->immutable == TRUE)
+               if (service->immutable)
                        return __connman_error_not_supported(msg);
 
                if (type != DBUS_TYPE_ARRAY)
@@ -3244,7 +3380,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                __connman_notifier_proxy_changed(service);
 
                service_save(service);
-       } else if (g_str_equal(name, "IPv4.Configuration") == TRUE ||
+       } else if (g_str_equal(name, "IPv4.Configuration") ||
                        g_str_equal(name, "IPv6.Configuration")) {
 
                enum connman_service_state state =
@@ -3253,16 +3389,17 @@ static DBusMessage *set_property(DBusConnection *conn,
                        CONNMAN_IPCONFIG_TYPE_UNKNOWN;
                int err = 0;
 
-               if (service->immutable == TRUE)
+               if (service->type == CONNMAN_SERVICE_TYPE_VPN ||
+                               service->immutable)
                        return __connman_error_not_supported(msg);
 
                DBG("%s", name);
 
-               if (service->ipconfig_ipv4 == NULL &&
-                                       service->ipconfig_ipv6 == NULL)
+               if (!service->ipconfig_ipv4 &&
+                                       !service->ipconfig_ipv6)
                        return __connman_error_invalid_property(msg);
 
-               if (g_str_equal(name, "IPv4.Configuration") == TRUE)
+               if (g_str_equal(name, "IPv4.Configuration"))
                        type = CONNMAN_IPCONFIG_TYPE_IPV4;
                else
                        type = CONNMAN_IPCONFIG_TYPE_IPV6;
@@ -3306,15 +3443,15 @@ static void set_error(struct connman_service *service,
 
        service->error = error;
 
-       if (service->path == NULL)
+       if (!service->path)
                return;
 
        str = error2string(service->error);
 
-       if (str == NULL)
+       if (!str)
                str = "";
 
-       if (allow_property_changed(service) == FALSE)
+       if (!allow_property_changed(service))
                return;
 
        connman_dbus_property_changed_basic(service->path,
@@ -3322,14 +3459,6 @@ static void set_error(struct connman_service *service,
                                DBUS_TYPE_STRING, &str);
 }
 
-static void set_idle(struct connman_service *service)
-{
-       service->state = service->state_ipv4 = service->state_ipv6 =
-                                               CONNMAN_SERVICE_STATE_IDLE;
-       set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
-       state_changed(service);
-}
-
 static DBusMessage *clear_property(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -3341,8 +3470,8 @@ static DBusMessage *clear_property(DBusConnection *conn,
        dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name,
                                                        DBUS_TYPE_INVALID);
 
-       if (g_str_equal(name, "Error") == TRUE) {
-               set_idle(service);
+       if (g_str_equal(name, "Error")) {
+               set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
                g_get_current_time(&service->modified);
                service_save(service);
@@ -3352,34 +3481,102 @@ static DBusMessage *clear_property(DBusConnection *conn,
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
-static connman_bool_t is_ipconfig_usable(struct connman_service *service)
+static bool is_ipconfig_usable(struct connman_service *service)
 {
-       if (__connman_ipconfig_is_usable(service->ipconfig_ipv4) == FALSE &&
-                       __connman_ipconfig_is_usable(service->ipconfig_ipv6)
-                                                               == FALSE)
-               return FALSE;
+       if (!__connman_ipconfig_is_usable(service->ipconfig_ipv4) &&
+                       !__connman_ipconfig_is_usable(service->ipconfig_ipv6))
+               return false;
 
-       return TRUE;
+       return true;
 }
 
-static connman_bool_t is_ignore(struct connman_service *service)
+static bool is_ignore(struct connman_service *service)
 {
-       if (service->autoconnect == FALSE)
-               return TRUE;
+       if (!service->autoconnect)
+               return true;
 
-       if (service->roaming == TRUE)
-               return TRUE;
+       if (service->roaming)
+               return true;
 
-       if (service->ignore == TRUE)
-               return TRUE;
+       if (service->ignore)
+               return true;
 
        if (service->state == CONNMAN_SERVICE_STATE_FAILURE)
-               return TRUE;
+               return true;
 
-       if (is_ipconfig_usable(service) == FALSE)
-               return TRUE;
+       if (!is_ipconfig_usable(service))
+               return true;
 
-       return FALSE;
+       return false;
+}
+
+static void disconnect_on_last_session(enum connman_service_type type)
+{
+       GList *list;
+
+       for (list = service_list; list; list = list->next) {
+               struct connman_service *service = list->data;
+
+               if (service->type != type)
+                       continue;
+
+               if (service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_SESSION)
+                        continue;
+
+               __connman_service_disconnect(service);
+               return;
+       }
+}
+
+static int active_sessions[MAX_CONNMAN_SERVICE_TYPES] = {};
+static int active_count = 0;
+
+void __connman_service_set_active_session(bool enable, GSList *list)
+{
+       if (!list)
+               return;
+
+       if (enable)
+               active_count++;
+       else
+               active_count--;
+
+       while (list != NULL) {
+               enum connman_service_type type = GPOINTER_TO_INT(list->data);
+
+               switch (type) {
+               case CONNMAN_SERVICE_TYPE_ETHERNET:
+               case CONNMAN_SERVICE_TYPE_WIFI:
+               case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+               case CONNMAN_SERVICE_TYPE_CELLULAR:
+               case CONNMAN_SERVICE_TYPE_GADGET:
+                       if (enable)
+                               active_sessions[type]++;
+                       else
+                               active_sessions[type]--;
+                       break;
+
+               case CONNMAN_SERVICE_TYPE_UNKNOWN:
+               case CONNMAN_SERVICE_TYPE_SYSTEM:
+               case CONNMAN_SERVICE_TYPE_GPS:
+               case CONNMAN_SERVICE_TYPE_VPN:
+               case CONNMAN_SERVICE_TYPE_P2P:
+                       break;
+               }
+
+               if (active_sessions[type] == 0)
+                       disconnect_on_last_session(type);
+
+               list = g_slist_next(list);
+       }
+
+       DBG("eth %d wifi %d bt %d cellular %d gadget %d sessions %d",
+                       active_sessions[CONNMAN_SERVICE_TYPE_ETHERNET],
+                       active_sessions[CONNMAN_SERVICE_TYPE_WIFI],
+                       active_sessions[CONNMAN_SERVICE_TYPE_BLUETOOTH],
+                       active_sessions[CONNMAN_SERVICE_TYPE_CELLULAR],
+                       active_sessions[CONNMAN_SERVICE_TYPE_GADGET],
+                       active_count);
 }
 
 struct preferred_tech_data {
@@ -3401,25 +3598,26 @@ static void preferred_tech_add_by_type(gpointer data, gpointer user_data)
        }
 }
 
-static GListpreferred_tech_list_get(void)
+static GList *preferred_tech_list_get(void)
 {
        unsigned int *tech_array;
        struct preferred_tech_data tech_data = { 0, };
        int i;
 
        tech_array = connman_setting_get_uint_list("PreferredTechnologies");
-       if (tech_array == NULL)
+       if (!tech_array)
                return NULL;
 
-       if (connman_setting_get_bool("SingleConnectedTechnology") == TRUE) {
+       if (connman_setting_get_bool("SingleConnectedTechnology")) {
                GList *list;
-               for (list = service_list; list != NULL; list = list->next) {
+               for (list = service_list; list; list = list->next) {
                        struct connman_service *service = list->data;
 
-                       if (is_connected(service) == FALSE)
+                       if (!is_connected(service))
                                break;
 
-                       if (service->userconnect == TRUE) {
+                       if (service->connect_reason ==
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER) {
                                DBG("service %p name %s is user connected",
                                                service, service->name);
                                return NULL;
@@ -3436,92 +3634,167 @@ static GList* preferred_tech_list_get(void)
        return tech_data.preferred_list;
 }
 
-static connman_bool_t auto_connect_service(GList *services,
-               connman_bool_t preferred)
+static bool auto_connect_service(GList *services,
+                               enum connman_service_connect_reason reason,
+                               bool preferred)
 {
        struct connman_service *service = NULL;
+       bool ignore[MAX_CONNMAN_SERVICE_TYPES] = { };
+       bool autoconnecting = false;
        GList *list;
 
-       for (list = services; list != NULL; list = list->next) {
+       DBG("preferred %d sessions %d reason %s", preferred, active_count,
+               reason2string(reason));
+
+       ignore[CONNMAN_SERVICE_TYPE_VPN] = true;
+
+       for (list = services; list; list = list->next) {
                service = list->data;
 
-               if (service->pending != NULL)
-                       return TRUE;
+               if (ignore[service->type]) {
+                       DBG("service %p type %s ignore", service,
+                               __connman_service_type2string(service->type));
+                       continue;
+               }
+
+               if (service->pending ||
+                               is_connecting(service) ||
+                               is_connected(service)) {
+                       if (!active_count)
+                               return true;
+
+                       ignore[service->type] = true;
+                       autoconnecting = true;
 
-               if (is_connecting(service) == TRUE)
-                       return TRUE;
+                       DBG("service %p type %s busy", service,
+                               __connman_service_type2string(service->type));
 
-               if (service->favorite == FALSE) {
-                       if (preferred == TRUE)
-                               goto next_service;
-                       return FALSE;
+                       continue;
                }
 
-               if (is_connected(service) == TRUE)
-                       return TRUE;
+               if (!service->favorite) {
+                       if (preferred)
+                              continue;
 
-               if (is_ignore(service) == FALSE && service->state ==
-                               CONNMAN_SERVICE_STATE_IDLE)
-                       break;
+                       return autoconnecting;
+               }
 
-       next_service:
-               service = NULL;
-       }
+               if (is_ignore(service) || service->state !=
+                               CONNMAN_SERVICE_STATE_IDLE)
+                       continue;
 
-       if (service != NULL) {
+               if (autoconnecting && !active_sessions[service->type]) {
+                       DBG("service %p type %s has no users", service,
+                               __connman_service_type2string(service->type));
+                       continue;
+               }
 
                DBG("service %p %s %s", service, service->name,
-                               (preferred == TRUE)? "preferred": "auto");
+                       (preferred) ? "preferred" : reason2string(reason));
+
+               __connman_service_connect(service, reason);
 
-               service->userconnect = FALSE;
-               __connman_service_connect(service);
-               return TRUE;
+               if (!active_count)
+                       return true;
+
+               ignore[service->type] = true;
        }
-       return FALSE;
+
+       return autoconnecting;
 }
 
 static gboolean run_auto_connect(gpointer data)
 {
-       GList *list = NULL, *preferred_tech;
+       enum connman_service_connect_reason reason = GPOINTER_TO_UINT(data);
+       bool autoconnecting = false;
+       GList *preferred_tech;
 
        autoconnect_timeout = 0;
 
        DBG("");
 
        preferred_tech = preferred_tech_list_get();
-       if (preferred_tech != NULL)
-               list = preferred_tech;
-
-       if (list == NULL || auto_connect_service(list, TRUE) == FALSE)
-               list = service_list;
-
-       if (list != NULL)
-               auto_connect_service(list, FALSE);
-
-       if (preferred_tech != NULL)
+       if (preferred_tech) {
+               autoconnecting = auto_connect_service(preferred_tech, reason,
+                                                       true);
                g_list_free(preferred_tech);
+       }
+
+       if (!autoconnecting || active_count)
+               auto_connect_service(service_list, reason, false);
 
        return FALSE;
 }
 
-void __connman_service_auto_connect(void)
+void __connman_service_auto_connect(enum connman_service_connect_reason reason)
 {
        DBG("");
 
-       if (__connman_session_mode() == TRUE) {
-               DBG("Session mode enabled: auto connect disabled");
+       if (autoconnect_timeout != 0)
                return;
-       }
 
-       if (autoconnect_timeout != 0)
+       if (!__connman_session_policy_autoconnect(reason))
                return;
 
-       autoconnect_timeout = g_timeout_add_seconds(0, run_auto_connect, NULL);
+       autoconnect_timeout = g_timeout_add_seconds(0, run_auto_connect,
+                                               GUINT_TO_POINTER(reason));
 }
 
-static void remove_timeout(struct connman_service *service)
-{
-       if (service->timeout > 0) {
+static gboolean run_vpn_auto_connect(gpointer data) {
+       GList *list;
+       bool need_split = false;
+
+       vpn_autoconnect_timeout = 0;
+
+       for (list = service_list; list; list = list->next) {
+               struct connman_service *service = list->data;
+               int res;
+
+               if (service->type != CONNMAN_SERVICE_TYPE_VPN)
+                       continue;
+
+               if (is_connected(service) || is_connecting(service)) {
+                       if (!service->do_split_routing)
+                               need_split = true;
+                       continue;
+               }
+
+               if (is_ignore(service) || !service->favorite)
+                       continue;
+
+               if (need_split && !service->do_split_routing) {
+                       DBG("service %p no split routing", service);
+                       continue;
+               }
+
+               DBG("service %p %s %s", service, service->name,
+                               service->do_split_routing ?
+                               "split routing" : "");
+
+               res = __connman_service_connect(service,
+                               CONNMAN_SERVICE_CONNECT_REASON_AUTO);
+               if (res < 0 && res != -EINPROGRESS)
+                       continue;
+
+               if (!service->do_split_routing)
+                       need_split = true;
+       }
+
+       return FALSE;
+}
+
+static void vpn_auto_connect(void)
+{
+       if (vpn_autoconnect_timeout)
+               return;
+
+       vpn_autoconnect_timeout =
+               g_timeout_add_seconds(0, run_vpn_auto_connect, NULL);
+}
+
+static void remove_timeout(struct connman_service *service)
+{
+       if (service->timeout > 0) {
                g_source_remove(service->timeout);
                service->timeout = 0;
        }
@@ -3530,18 +3803,18 @@ static void remove_timeout(struct connman_service *service)
 void __connman_service_reply_dbus_pending(DBusMessage *pending, int error,
                                        const char *path)
 {
-       if (pending != NULL) {
+       if (pending) {
                if (error > 0) {
                        DBusMessage *reply;
 
                        reply = __connman_error_failed(pending, error);
-                       if (reply != NULL)
+                       if (reply)
                                g_dbus_send_message(connection, reply);
                } else {
                        const char *sender;
 
                        sender = dbus_message_get_interface(pending);
-                       if (path == NULL)
+                       if (!path)
                                path = dbus_message_get_path(pending);
 
                        DBG("sender %s path %s", sender, path);
@@ -3563,35 +3836,35 @@ static void reply_pending(struct connman_service *service, int error)
 {
        remove_timeout(service);
 
-       if (service->pending != NULL) {
+       if (service->pending) {
                __connman_service_reply_dbus_pending(service->pending, error,
                                                NULL);
                service->pending = NULL;
        }
 
-       if (service->provider_pending != NULL) {
+       if (service->provider_pending) {
                __connman_service_reply_dbus_pending(service->provider_pending,
                                                error, service->path);
                service->provider_pending = NULL;
        }
 }
 
-connman_bool_t
+bool
 __connman_service_is_provider_pending(struct connman_service *service)
 {
-       if (service == NULL)
-               return FALSE;
+       if (!service)
+               return false;
 
-       if (service->provider_pending != NULL)
-               return TRUE;
+       if (service->provider_pending)
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 void __connman_service_set_provider_pending(struct connman_service *service,
                                                        DBusMessage *msg)
 {
-       if (service->provider_pending != NULL) {
+       if (service->provider_pending) {
                DBG("service %p provider pending msg %p already exists",
                        service, service->provider_pending);
                return;
@@ -3603,7 +3876,7 @@ void __connman_service_set_provider_pending(struct connman_service *service,
 
 static void check_pending_msg(struct connman_service *service)
 {
-       if (service->pending == NULL)
+       if (!service->pending)
                return;
 
        DBG("service %p pending msg %p already exists", service,
@@ -3618,7 +3891,7 @@ void __connman_service_set_hidden_data(struct connman_service *service,
 
        DBG("service %p pending %p", service, pending);
 
-       if (pending == NULL)
+       if (!pending)
                return;
 
        check_pending_msg(service);
@@ -3639,15 +3912,15 @@ void __connman_service_return_error(struct connman_service *service,
 static gboolean connect_timeout(gpointer user_data)
 {
        struct connman_service *service = user_data;
-       connman_bool_t autoconnect = FALSE;
+       bool autoconnect = false;
 
        DBG("service %p", service);
 
        service->timeout = 0;
 
-       if (service->network != NULL)
+       if (service->network)
                __connman_network_disconnect(service->network);
-       else if (service->provider != NULL)
+       else if (service->provider)
                connman_provider_disconnect(service->provider);
 
        __connman_ipconfig_disable(service->ipconfig_ipv4);
@@ -3655,17 +3928,17 @@ static gboolean connect_timeout(gpointer user_data)
 
        __connman_stats_service_unregister(service);
 
-       if (service->pending != NULL) {
+       if (service->pending) {
                DBusMessage *reply;
 
                reply = __connman_error_operation_timeout(service->pending);
-               if (reply != NULL)
+               if (reply)
                        g_dbus_send_message(connection, reply);
 
                dbus_message_unref(service->pending);
                service->pending = NULL;
        } else
-               autoconnect = TRUE;
+               autoconnect = true;
 
        __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_FAILURE,
@@ -3674,77 +3947,50 @@ static gboolean connect_timeout(gpointer user_data)
                                        CONNMAN_SERVICE_STATE_FAILURE,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);
 
-       if (autoconnect == TRUE && service->userconnect == FALSE)
-               __connman_service_auto_connect();
+       if (autoconnect &&
+                       service->connect_reason !=
+                               CONNMAN_SERVICE_CONNECT_REASON_USER)
+               __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
        return FALSE;
 }
 
-static void set_reconnect_state(struct connman_service *service,
-                                               connman_bool_t reconnect)
-{
-       struct connman_device *device;
-
-       if (service->network == NULL)
-               return;
-
-       device = connman_network_get_device(service->network);
-       if (device == NULL)
-               return;
-
-       __connman_device_set_reconnect(device, reconnect);
-}
-
-static connman_bool_t get_reconnect_state(struct connman_service *service)
-{
-       struct connman_device *device;
-
-       if (service->network == NULL)
-               return FALSE;
-
-       device = connman_network_get_device(service->network);
-       if (device == NULL)
-               return FALSE;
-
-       return __connman_device_get_reconnect(device);
-}
-
-static connman_bool_t is_interface_available(struct connman_service *service,
+static bool is_interface_available(struct connman_service *service,
                                        struct connman_service *other_service)
 {
        unsigned int index = 0, other_index = 0;
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                index = __connman_ipconfig_get_index(service->ipconfig_ipv4);
-       else if (service->ipconfig_ipv6 != NULL)
+       else if (service->ipconfig_ipv6)
                index = __connman_ipconfig_get_index(service->ipconfig_ipv6);
 
-       if (other_service->ipconfig_ipv4 != NULL)
+       if (other_service->ipconfig_ipv4)
                other_index = __connman_ipconfig_get_index(
                                                other_service->ipconfig_ipv4);
-       else if (other_service->ipconfig_ipv6 != NULL)
+       else if (other_service->ipconfig_ipv6)
                other_index = __connman_ipconfig_get_index(
                                                other_service->ipconfig_ipv6);
 
        if (index > 0 && other_index != index)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static DBusMessage *connect_service(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
        struct connman_service *service = user_data;
+       int err = 0;
        GList *list;
-       int err;
 
        DBG("service %p", service);
 
-       if (service->pending != NULL)
+       if (service->pending)
                return __connman_error_in_progress(msg);
 
-       for (list = service_list; list != NULL; list = list->next) {
+       for (list = service_list; list; list = list->next) {
                struct connman_service *temp = list->data;
 
                /*
@@ -3752,47 +3998,35 @@ static DBusMessage *connect_service(DBusConnection *conn,
                 * interfaces for a given technology type (like having
                 * more than one wifi card).
                 */
-               if (service->type == temp->type &&
-                               is_connecting(temp) == TRUE &&
-                               is_interface_available(service,
-                                                       temp) == FALSE) {
-                       if (temp->pending != NULL)
-                               __connman_service_return_error(temp,
-                                                       ECONNABORTED,
-                                                       NULL);
+               if (!is_connecting(temp) && !is_connected(temp))
+                       break;
 
-                       err = __connman_service_disconnect(temp);
-                       if (err < 0 && err != -EINPROGRESS)
-                               return __connman_error_in_progress(msg);
-                       else {
-                               set_idle(temp);
-                               break;
-                       }
+               if (service->type != temp->type)
+                       continue;
+
+               if(!is_interface_available(service, temp)) {
+                       if (__connman_service_disconnect(temp) == -EINPROGRESS)
+                               err = -EINPROGRESS;
                }
        }
+       if (err == -EINPROGRESS)
+               return __connman_error_in_progress(msg);
 
-       service->ignore = FALSE;
-
-       service->userconnect = TRUE;
+       service->ignore = false;
 
        service->pending = dbus_message_ref(msg);
 
-       set_reconnect_state(service, FALSE);
-
-       err = __connman_service_connect(service);
-       if (err < 0) {
-               if (service->pending == NULL)
-                       return NULL;
+       err = __connman_service_connect(service,
+                       CONNMAN_SERVICE_CONNECT_REASON_USER);
 
-               if (err != -EINPROGRESS) {
-                       dbus_message_unref(service->pending);
-                       service->pending = NULL;
+       if (err == -EINPROGRESS)
+               return NULL;
 
-                       return __connman_error_failed(msg, -err);
-               }
+       dbus_message_unref(service->pending);
+       service->pending = NULL;
 
-               return NULL;
-       }
+       if (err < 0)
+               return __connman_error_failed(msg, -err);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
@@ -3805,11 +4039,7 @@ static DBusMessage *disconnect_service(DBusConnection *conn,
 
        DBG("service %p", service);
 
-       reply_pending(service, ECONNABORTED);
-
-       service->ignore = TRUE;
-
-       set_reconnect_state(service, FALSE);
+       service->ignore = true;
 
        err = __connman_service_disconnect(service);
        if (err < 0) {
@@ -3820,28 +4050,25 @@ static DBusMessage *disconnect_service(DBusConnection *conn,
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
-gboolean __connman_service_remove(struct connman_service *service)
+bool __connman_service_remove(struct connman_service *service)
 {
-       if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET)
-               return FALSE;
+       if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET ||
+                       service->type == CONNMAN_SERVICE_TYPE_GADGET)
+               return false;
 
-       if (service->immutable == TRUE || service->hidden == TRUE)
-               return FALSE;
+       if (service->immutable || service->hidden ||
+                       __connman_provider_is_immutable(service->provider))
+               return false;
 
-       if (service->favorite == FALSE && service->state !=
+       if (!service->favorite && service->state !=
                                                CONNMAN_SERVICE_STATE_FAILURE)
-               return FALSE;
-
-       set_reconnect_state(service, FALSE);
+               return false;
 
        __connman_service_disconnect(service);
 
        g_free(service->passphrase);
        service->passphrase = NULL;
 
-       g_free(service->agent_passphrase);
-       service->agent_passphrase = NULL;
-
        g_free(service->identity);
        service->identity = NULL;
 
@@ -3851,13 +4078,13 @@ gboolean __connman_service_remove(struct connman_service *service)
        g_free(service->eap);
        service->eap = NULL;
 
-       set_idle(service);
+       service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
 
-       __connman_service_set_favorite(service, FALSE);
+       __connman_service_set_favorite(service, false);
 
        service_save(service);
 
-       return TRUE;
+       return true;
 }
 
 static DBusMessage *remove_service(DBusConnection *conn,
@@ -3867,13 +4094,13 @@ static DBusMessage *remove_service(DBusConnection *conn,
 
        DBG("service %p", service);
 
-       if (__connman_service_remove(service) == FALSE)
+       if (!__connman_service_remove(service))
                return __connman_error_not_supported(msg);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
-static gboolean check_suitable_state(enum connman_service_state a,
+static bool check_suitable_state(enum connman_service_state a,
                                        enum connman_service_state b)
 {
        /*
@@ -3884,14 +4111,14 @@ static gboolean check_suitable_state(enum connman_service_state a,
                        b == CONNMAN_SERVICE_STATE_READY) ||
                (b == CONNMAN_SERVICE_STATE_ONLINE &&
                        a == CONNMAN_SERVICE_STATE_READY))
-               return TRUE;
+               return true;
 
        return a == b;
 }
 
 static void downgrade_state(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return;
 
        DBG("service %p state4 %d state6 %d", service, service->state_ipv4,
@@ -3913,13 +4140,14 @@ static void apply_relevant_default_downgrade(struct connman_service *service)
        struct connman_service *def_service;
 
        def_service = __connman_service_get_default();
-       if (def_service == NULL)
+       if (!def_service)
                return;
 
        if (def_service == service &&
                        def_service->state == CONNMAN_SERVICE_STATE_ONLINE) {
                def_service->state = CONNMAN_SERVICE_STATE_READY;
                __connman_notifier_leave_online(def_service->type);
+               state_changed(def_service);
        }
 }
 
@@ -3946,7 +4174,7 @@ static void switch_default_service(struct connman_service *default_service,
 
 static DBusMessage *move_service(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data,
-                                                               gboolean before)
+                                                               bool before)
 {
        struct connman_service *service = user_data;
        struct connman_service *target;
@@ -3959,11 +4187,11 @@ static DBusMessage *move_service(DBusConnection *conn,
        dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
                                                        DBUS_TYPE_INVALID);
 
-       if (service->favorite == FALSE)
+       if (!service->favorite)
                return __connman_error_not_supported(msg);
 
        target = find_service(path);
-       if (target == NULL || target->favorite == FALSE || target == service)
+       if (!target || !target->favorite || target == service)
                return __connman_error_invalid_service(msg);
 
        if (target->type == CONNMAN_SERVICE_TYPE_VPN) {
@@ -3971,19 +4199,18 @@ static DBusMessage *move_service(DBusConnection *conn,
                 * We only allow VPN route splitting if there are
                 * routes defined for a given VPN.
                 */
-               if (__connman_provider_check_routes(target->provider)
-                                                               == FALSE) {
+               if (!__connman_provider_check_routes(target->provider)) {
                        connman_info("Cannot move service. "
                                "No routes defined for provider %s",
                                __connman_provider_get_ident(target->provider));
                        return __connman_error_invalid_service(msg);
                }
 
-               target->do_split_routing = TRUE;
+               target->do_split_routing = true;
        } else
-               target->do_split_routing = FALSE;
+               target->do_split_routing = false;
 
-       service->do_split_routing = FALSE;
+       service->do_split_routing = false;
 
        target4 = __connman_ipconfig_get_method(target->ipconfig_ipv4);
        target6 = __connman_ipconfig_get_method(target->ipconfig_ipv6);
@@ -4004,32 +4231,32 @@ static DBusMessage *move_service(DBusConnection *conn,
         */
        if (target4 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (service6 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (check_suitable_state(target->state_ipv6,
-                                               service->state_ipv6) == FALSE)
+                       if (!check_suitable_state(target->state_ipv6,
+                                                       service->state_ipv6))
                                return __connman_error_invalid_service(msg);
                }
        }
 
        if (target6 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (service4 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (check_suitable_state(target->state_ipv4,
-                                               service->state_ipv4) == FALSE)
+                       if (!check_suitable_state(target->state_ipv4,
+                                                       service->state_ipv4))
                                return __connman_error_invalid_service(msg);
                }
        }
 
        if (service4 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (target6 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (check_suitable_state(target->state_ipv6,
-                                               service->state_ipv6) == FALSE)
+                       if (!check_suitable_state(target->state_ipv6,
+                                                       service->state_ipv6))
                                return __connman_error_invalid_service(msg);
                }
        }
 
        if (service6 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (target4 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (check_suitable_state(target->state_ipv4,
-                                               service->state_ipv4) == FALSE)
+                       if (!check_suitable_state(target->state_ipv4,
+                                                       service->state_ipv4))
                                return __connman_error_invalid_service(msg);
                }
        }
@@ -4044,7 +4271,7 @@ static DBusMessage *move_service(DBusConnection *conn,
         * the service which goes up, needs to recompute its state which
         * is triggered via downgrading it - if relevant - to state ready.
         */
-       if (before == TRUE)
+       if (before)
                switch_default_service(target, service);
        else
                switch_default_service(service, target);
@@ -4057,13 +4284,13 @@ static DBusMessage *move_service(DBusConnection *conn,
 static DBusMessage *move_before(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
-       return move_service(conn, msg, user_data, TRUE);
+       return move_service(conn, msg, user_data, true);
 }
 
 static DBusMessage *move_after(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
-       return move_service(conn, msg, user_data, FALSE);
+       return move_service(conn, msg, user_data, false);
 }
 
 static DBusMessage *reset_counters(DBusConnection *conn,
@@ -4087,12 +4314,12 @@ static void service_append_added_foreach(gpointer data, gpointer user_data)
        struct connman_service *service = data;
        DBusMessageIter *iter = user_data;
 
-       if (service == NULL || service->path == NULL) {
+       if (!service || !service->path) {
                DBG("service %p or path is NULL", service);
                return;
        }
 
-       if (g_hash_table_lookup(services_notify->add, service->path) != NULL) {
+       if (g_hash_table_lookup(services_notify->add, service->path)) {
                DBG("new %s", service->path);
 
                append_struct(service, iter);
@@ -4118,10 +4345,14 @@ static void append_removed(gpointer key, gpointer value, gpointer user_data)
        dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &objpath);
 }
 
+static void service_append_removed(DBusMessageIter *iter, void *user_data)
+{
+       g_hash_table_foreach(services_notify->remove, append_removed, iter);
+}
+
 static gboolean service_send_changed(gpointer data)
 {
        DBusMessage *signal;
-       DBusMessageIter iter, array;
 
        DBG("");
 
@@ -4129,19 +4360,13 @@ static gboolean service_send_changed(gpointer data)
 
        signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
                        CONNMAN_MANAGER_INTERFACE, "ServicesChanged");
-       if (signal == NULL)
+       if (!signal)
                return FALSE;
 
        __connman_dbus_append_objpath_dict_array(signal,
-                       service_append_ordered, NULL);
-
-       dbus_message_iter_init_append(signal, &iter);
-       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-                       DBUS_TYPE_OBJECT_PATH_AS_STRING, &array);
-
-       g_hash_table_foreach(services_notify->remove, append_removed, &array);
-
-       dbus_message_iter_close_container(&iter, &array);
+                                       service_append_ordered, NULL);
+       __connman_dbus_append_objpath_array(signal,
+                                       service_append_removed, NULL);
 
        dbus_connection_send(connection, signal, NULL);
        dbus_message_unref(signal);
@@ -4174,7 +4399,7 @@ static void service_schedule_removed(struct connman_service *service)
 {
        DBG("service %p %s", service, service->path);
 
-       if (service == NULL || service->path == NULL) {
+       if (!service || !service->path) {
                DBG("service %p or path is NULL", service);
                return;
        }
@@ -4186,15 +4411,15 @@ static void service_schedule_removed(struct connman_service *service)
        service_schedule_changed();
 }
 
-static connman_bool_t allow_property_changed(struct connman_service *service)
+static bool allow_property_changed(struct connman_service *service)
 {
        if (g_hash_table_lookup_extended(services_notify->add, service->path,
-                                       NULL, NULL) == TRUE) {
+                                       NULL, NULL)) {
                DBG("no property updates for service %p", service);
-               return FALSE;
+               return false;
        }
 
-       return TRUE;
+       return true;
 }
 
 static const GDBusMethodTable service_methods[] = {
@@ -4245,7 +4470,7 @@ static void service_free(gpointer user_data)
 
        service->path = NULL;
 
-       if (path != NULL) {
+       if (path) {
                __connman_connection_update_gateway();
 
                g_dbus_unregister_interface(connection, path,
@@ -4255,23 +4480,23 @@ static void service_free(gpointer user_data)
 
        g_hash_table_destroy(service->counter_table);
 
-       if (service->network != NULL) {
+       if (service->network) {
                __connman_network_disconnect(service->network);
                connman_network_unref(service->network);
                service->network = NULL;
        }
 
-       if (service->provider != NULL)
+       if (service->provider)
                connman_provider_unref(service->provider);
 
-       if (service->ipconfig_ipv4 != NULL) {
+       if (service->ipconfig_ipv4) {
                __connman_ipconfig_set_ops(service->ipconfig_ipv4, NULL);
                __connman_ipconfig_set_data(service->ipconfig_ipv4, NULL);
                __connman_ipconfig_unref(service->ipconfig_ipv4);
                service->ipconfig_ipv4 = NULL;
        }
 
-       if (service->ipconfig_ipv6 != NULL) {
+       if (service->ipconfig_ipv6) {
                __connman_ipconfig_set_ops(service->ipconfig_ipv6, NULL);
                __connman_ipconfig_set_data(service->ipconfig_ipv6, NULL);
                __connman_ipconfig_unref(service->ipconfig_ipv6);
@@ -4287,11 +4512,11 @@ static void service_free(gpointer user_data)
        g_strfreev(service->proxies);
        g_strfreev(service->excludes);
 
+       g_free(service->hostname);
        g_free(service->domainname);
        g_free(service->pac);
        g_free(service->name);
        g_free(service->passphrase);
-       g_free(service->agent_passphrase);
        g_free(service->identifier);
        g_free(service->eap);
        g_free(service->identity);
@@ -4304,24 +4529,27 @@ static void service_free(gpointer user_data)
        g_free(service->config_file);
        g_free(service->config_entry);
 
-       if (service->stats.timer != NULL)
+       if (service->stats.timer)
                g_timer_destroy(service->stats.timer);
-       if (service->stats_roaming.timer != NULL)
+       if (service->stats_roaming.timer)
                g_timer_destroy(service->stats_roaming.timer);
 
+       if (current_default == service)
+               current_default = NULL;
+
        g_free(service);
 }
 
 static void stats_init(struct connman_service *service)
 {
        /* home */
-       service->stats.valid = FALSE;
-       service->stats.enabled = FALSE;
+       service->stats.valid = false;
+       service->stats.enabled = false;
        service->stats.timer = g_timer_new();
 
        /* roaming */
-       service->stats_roaming.valid = FALSE;
-       service->stats_roaming.enabled = FALSE;
+       service->stats_roaming.valid = false;
+       service->stats_roaming.enabled = false;
        service->stats_roaming.timer = g_timer_new();
 }
 
@@ -4330,7 +4558,6 @@ static void service_initialize(struct connman_service *service)
        DBG("service %p", service);
 
        service->refcount = 1;
-       service->session_usage_count = 0;
 
        service->error = CONNMAN_SERVICE_ERROR_UNKNOWN;
 
@@ -4341,13 +4568,13 @@ static void service_initialize(struct connman_service *service)
        service->state_ipv4 = CONNMAN_SERVICE_STATE_UNKNOWN;
        service->state_ipv6 = CONNMAN_SERVICE_STATE_UNKNOWN;
 
-       service->favorite  = FALSE;
-       service->immutable = FALSE;
-       service->hidden = FALSE;
+       service->favorite  = false;
+       service->immutable = false;
+       service->hidden = false;
 
-       service->ignore = FALSE;
+       service->ignore = false;
 
-       service->userconnect = FALSE;
+       service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_NONE;
 
        service->order = 0;
 
@@ -4355,7 +4582,7 @@ static void service_initialize(struct connman_service *service)
 
        service->provider = NULL;
 
-       service->wps = FALSE;
+       service->wps = false;
 }
 
 /**
@@ -4374,7 +4601,7 @@ struct connman_service *connman_service_create(void)
        struct connman_service *service;
 
        service = g_try_new0(struct connman_service, 1);
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        DBG("service %p", service);
@@ -4386,13 +4613,13 @@ struct connman_service *connman_service_create(void)
                counter = list->data;
 
                counters = g_try_new0(struct connman_stats_counter, 1);
-               if (counters == NULL) {
+               if (!counters) {
                        g_hash_table_destroy(service->counter_table);
                        g_free(service);
                        return NULL;
                }
 
-               counters->append_all = TRUE;
+               counters->append_all = true;
 
                g_hash_table_replace(service->counter_table, (gpointer)counter,
                                counters);
@@ -4439,7 +4666,6 @@ void connman_service_unref_debug(struct connman_service *service,
 
        service_list = g_list_remove(service_list, service);
 
-       reply_pending(service, ECONNABORTED);
        __connman_service_disconnect(service);
 
        g_hash_table_remove(service_hash, service->identifier);
@@ -4450,15 +4676,24 @@ static gint service_compare(gconstpointer a, gconstpointer b)
        struct connman_service *service_a = (void *) a;
        struct connman_service *service_b = (void *) b;
        enum connman_service_state state_a, state_b;
+       bool a_connected, b_connected;
+       gint strength;
 
        state_a = service_a->state;
        state_b = service_b->state;
+       a_connected = is_connected(service_a);
+       b_connected = is_connected(service_b);
 
-       if (state_a != state_b) {
-               gboolean a_connected = is_connected(service_a);
-               gboolean b_connected = is_connected(service_b);
+       if (a_connected && b_connected) {
+               if (service_a->order > service_b->order)
+                       return -1;
+
+               if (service_a->order < service_b->order)
+                       return 1;
+       }
 
-               if (a_connected == TRUE && b_connected == TRUE) {
+       if (state_a != state_b) {
+               if (a_connected && b_connected) {
                        /* We prefer online over ready state */
                        if (state_a == CONNMAN_SERVICE_STATE_ONLINE)
                                return -1;
@@ -4467,47 +4702,69 @@ static gint service_compare(gconstpointer a, gconstpointer b)
                                return 1;
                }
 
-               if (a_connected == TRUE)
+               if (a_connected)
                        return -1;
-               if (b_connected == TRUE)
+               if (b_connected)
                        return 1;
 
-               if (is_connecting(service_a) == TRUE)
+               if (is_connecting(service_a))
                        return -1;
-               if (is_connecting(service_b) == TRUE)
+               if (is_connecting(service_b))
                        return 1;
        }
 
-       if (service_a->order > service_b->order)
+       if (service_a->favorite && !service_b->favorite)
                return -1;
 
-       if (service_a->order < service_b->order)
+       if (!service_a->favorite && service_b->favorite)
                return 1;
 
-       if (service_a->favorite == TRUE && service_b->favorite == FALSE)
-               return -1;
+       if (service_a->type != service_b->type) {
 
-       if (service_a->favorite == FALSE && service_b->favorite == TRUE)
-               return 1;
+               if (service_a->type == CONNMAN_SERVICE_TYPE_ETHERNET)
+                       return -1;
+               if (service_b->type == CONNMAN_SERVICE_TYPE_ETHERNET)
+                       return 1;
 
-       if (service_a->type != service_b->type) {
-               switch (service_a->type) {
-               case CONNMAN_SERVICE_TYPE_UNKNOWN:
-               case CONNMAN_SERVICE_TYPE_SYSTEM:
-               case CONNMAN_SERVICE_TYPE_ETHERNET:
-               case CONNMAN_SERVICE_TYPE_GPS:
-               case CONNMAN_SERVICE_TYPE_VPN:
-               case CONNMAN_SERVICE_TYPE_GADGET:
-                       break;
-               case CONNMAN_SERVICE_TYPE_WIFI:
+               if (service_a->type == CONNMAN_SERVICE_TYPE_WIFI)
+                       return -1;
+               if (service_b->type == CONNMAN_SERVICE_TYPE_WIFI)
                        return 1;
-               case CONNMAN_SERVICE_TYPE_BLUETOOTH:
-               case CONNMAN_SERVICE_TYPE_CELLULAR:
+
+               if (service_a->type == CONNMAN_SERVICE_TYPE_CELLULAR)
                        return -1;
-               }
+               if (service_b->type == CONNMAN_SERVICE_TYPE_CELLULAR)
+                       return 1;
+
+               if (service_a->type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
+                       return -1;
+               if (service_b->type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
+                       return 1;
+
+               if (service_a->type == CONNMAN_SERVICE_TYPE_VPN)
+                       return -1;
+               if (service_b->type == CONNMAN_SERVICE_TYPE_VPN)
+                       return 1;
+
+               if (service_a->type == CONNMAN_SERVICE_TYPE_GADGET)
+                       return -1;
+               if (service_b->type == CONNMAN_SERVICE_TYPE_GADGET)
+                       return 1;
        }
 
-       return (gint) service_b->strength - (gint) service_a->strength;
+       strength = (gint) service_b->strength - (gint) service_a->strength;
+       if (strength)
+               return strength;
+
+       return g_strcmp0(service_a->name, service_b->name);
+}
+
+static void service_list_sort(void)
+{
+       if (service_list && service_list->next) {
+               service_list = g_list_sort(service_list, service_compare);
+               service_schedule_changed();
+       }
 }
 
 /**
@@ -4518,7 +4775,7 @@ static gint service_compare(gconstpointer a, gconstpointer b)
  */
 enum connman_service_type connman_service_get_type(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return CONNMAN_SERVICE_TYPE_UNKNOWN;
 
        return service->type;
@@ -4534,26 +4791,10 @@ char *connman_service_get_interface(struct connman_service *service)
 {
        int index;
 
-       if (service == NULL)
-               return NULL;
-
-       if (service->type == CONNMAN_SERVICE_TYPE_VPN) {
-               if (service->ipconfig_ipv4)
-                       index = __connman_ipconfig_get_index(
-                                               service->ipconfig_ipv4);
-               else if (service->ipconfig_ipv6)
-                       index = __connman_ipconfig_get_index(
-                                               service->ipconfig_ipv6);
-               else
-                       return NULL;
-
-               return connman_inet_ifname(index);
-       }
-
-       if (service->network == NULL)
+       if (!service)
                return NULL;
 
-       index = connman_network_get_index(service->network);
+       index = __connman_service_get_index(service);
 
        return connman_inet_ifname(index);
 }
@@ -4567,7 +4808,7 @@ char *connman_service_get_interface(struct connman_service *service)
 struct connman_network *
 __connman_service_get_network(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->network;
@@ -4576,7 +4817,7 @@ __connman_service_get_network(struct connman_service *service)
 struct connman_ipconfig *
 __connman_service_get_ip4config(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->ipconfig_ipv4;
@@ -4585,7 +4826,7 @@ __connman_service_get_ip4config(struct connman_service *service)
 struct connman_ipconfig *
 __connman_service_get_ip6config(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->ipconfig_ipv6;
@@ -4603,11 +4844,11 @@ __connman_service_get_ipconfig(struct connman_service *service, int family)
 
 }
 
-connman_bool_t __connman_service_is_connected_state(struct connman_service *service,
+bool __connman_service_is_connected_state(struct connman_service *service,
                                        enum connman_ipconfig_type type)
 {
-       if (service == NULL)
-               return FALSE;
+       if (!service)
+               return false;
 
        switch (type) {
        case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
@@ -4618,11 +4859,12 @@ connman_bool_t __connman_service_is_connected_state(struct connman_service *serv
                return is_connected_state(service, service->state_ipv6);
        }
 
-       return FALSE;
+       return false;
 }
-enum connman_service_security __connman_service_get_security(struct connman_service *service)
+enum connman_service_security __connman_service_get_security(
+                               struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return CONNMAN_SERVICE_SECURITY_UNKNOWN;
 
        return service->security;
@@ -4630,24 +4872,24 @@ enum connman_service_security __connman_service_get_security(struct connman_serv
 
 const char *__connman_service_get_phase2(struct connman_service *service)
 {
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        return service->phase2;
 }
 
-connman_bool_t __connman_service_wps_enabled(struct connman_service *service)
+bool __connman_service_wps_enabled(struct connman_service *service)
 {
-       if (service == NULL)
-               return FALSE;
+       if (!service)
+               return false;
 
        return service->wps;
 }
 
-void __connman_service_mark_dirty()
- {
-       services_dirty = TRUE;
- }
+void __connman_service_mark_dirty(void)
+{
+       services_dirty = true;
+}
 
 /**
  * __connman_service_set_favorite_delayed:
@@ -4658,10 +4900,10 @@ void __connman_service_mark_dirty()
  * Change the favorite setting of service
  */
 int __connman_service_set_favorite_delayed(struct connman_service *service,
-                                       connman_bool_t favorite,
-                                       gboolean delay_ordering)
+                                       bool favorite,
+                                       bool delay_ordering)
 {
-       if (service->hidden == TRUE)
+       if (service->hidden)
                return -EOPNOTSUPP;
 
        if (service->favorite == favorite)
@@ -4669,18 +4911,14 @@ int __connman_service_set_favorite_delayed(struct connman_service *service,
 
        service->favorite = favorite;
 
-       if (delay_ordering == FALSE)
-               service->order = __connman_service_get_order(service);
+       if (!delay_ordering)
+               __connman_service_get_order(service);
 
        favorite_changed(service);
 
-       if (delay_ordering == FALSE) {
+       if (!delay_ordering) {
 
-               if (service_list->next != NULL) {
-                       service_list = g_list_sort(service_list,
-                                                       service_compare);
-                       service_schedule_changed();
-               }
+               service_list_sort();
 
                __connman_connection_update_gateway();
        }
@@ -4696,21 +4934,26 @@ int __connman_service_set_favorite_delayed(struct connman_service *service,
  * Change the favorite setting of service
  */
 int __connman_service_set_favorite(struct connman_service *service,
-                                               connman_bool_t favorite)
+                                               bool favorite)
 {
        return __connman_service_set_favorite_delayed(service, favorite,
-                                                       FALSE);
+                                                       false);
+}
+
+bool connman_service_get_favorite(struct connman_service *service)
+{
+       return service->favorite;
 }
 
-connman_bool_t connman_service_get_favorite(struct connman_service *service)
+bool connman_service_get_autoconnect(struct connman_service *service)
 {
-       return service->favorite;
+       return service->autoconnect;
 }
 
 int __connman_service_set_immutable(struct connman_service *service,
-                                               connman_bool_t immutable)
+                                               bool immutable)
 {
-       if (service->hidden == TRUE)
+       if (service->hidden)
                return -EOPNOTSUPP;
 
        if (service->immutable == immutable)
@@ -4724,9 +4967,9 @@ int __connman_service_set_immutable(struct connman_service *service,
 }
 
 int __connman_service_set_ignore(struct connman_service *service,
-                                               connman_bool_t ignore)
+                                               bool ignore)
 {
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        service->ignore = ignore;
@@ -4737,42 +4980,35 @@ int __connman_service_set_ignore(struct connman_service *service,
 void __connman_service_set_string(struct connman_service *service,
                                  const char *key, const char *value)
 {
-       if (service->hidden == TRUE)
+       if (service->hidden)
                return;
-       if (g_str_equal(key, "EAP") == TRUE) {
+       if (g_str_equal(key, "EAP")) {
                g_free(service->eap);
                service->eap = g_strdup(value);
-       } else if (g_str_equal(key, "Identity") == TRUE) {
+       } else if (g_str_equal(key, "Identity")) {
                g_free(service->identity);
                service->identity = g_strdup(value);
-       } else if (g_str_equal(key, "CACertFile") == TRUE) {
+       } else if (g_str_equal(key, "CACertFile")) {
                g_free(service->ca_cert_file);
                service->ca_cert_file = g_strdup(value);
-       } else if (g_str_equal(key, "ClientCertFile") == TRUE) {
+       } else if (g_str_equal(key, "ClientCertFile")) {
                g_free(service->client_cert_file);
                service->client_cert_file = g_strdup(value);
-       } else if (g_str_equal(key, "PrivateKeyFile") == TRUE) {
+       } else if (g_str_equal(key, "PrivateKeyFile")) {
                g_free(service->private_key_file);
                service->private_key_file = g_strdup(value);
-       } else if (g_str_equal(key, "PrivateKeyPassphrase") == TRUE) {
+       } else if (g_str_equal(key, "PrivateKeyPassphrase")) {
                g_free(service->private_key_passphrase);
                service->private_key_passphrase = g_strdup(value);
-       } else if (g_str_equal(key, "Phase2") == TRUE) {
+       } else if (g_str_equal(key, "Phase2")) {
                g_free(service->phase2);
                service->phase2 = g_strdup(value);
-       } else if (g_str_equal(key, "Passphrase") == TRUE) {
+       } else if (g_str_equal(key, "Passphrase")) {
                g_free(service->passphrase);
                service->passphrase = g_strdup(value);
        }
 }
 
-void __connman_service_set_userconnect(struct connman_service *service,
-                                               connman_bool_t userconnect)
-{
-       if (service != NULL)
-               service->userconnect = userconnect;
-}
-
 void __connman_service_set_search_domains(struct connman_service *service,
                                        char **domains)
 {
@@ -4782,7 +5018,7 @@ void __connman_service_set_search_domains(struct connman_service *service,
        if (index < 0)
                return;
 
-       if (service->domains != NULL) {
+       if (service->domains) {
                remove_searchdomains(service, index, service->domains);
                g_strfreev(service->domains);
 
@@ -4792,24 +5028,37 @@ void __connman_service_set_search_domains(struct connman_service *service,
        }
 }
 
+/*
+ * This variant is used when domain search list is updated via
+ * dhcp and in that case the service is not yet fully connected so
+ * we cannot do same things as what the set() variant is doing.
+ */
+void __connman_service_update_search_domains(struct connman_service *service,
+                                       char **domains)
+{
+       g_strfreev(service->domains);
+       service->domains = g_strdupv(domains);
+}
+
 static void service_complete(struct connman_service *service)
 {
        reply_pending(service, EIO);
 
-       if (service->userconnect == FALSE)
-               __connman_service_auto_connect();
+       if (service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_USER)
+               __connman_service_auto_connect(service->connect_reason);
 
        g_get_current_time(&service->modified);
        service_save(service);
 }
 
-static void report_error_cb(void *user_context, gboolean retry,
+static void report_error_cb(void *user_context, bool retry,
                                                        void *user_data)
 {
        struct connman_service *service = user_context;
 
-       if (retry == TRUE)
-               __connman_service_connect(service);
+       if (retry)
+               __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER);
        else {
                /* It is not relevant to stay on Failure state
                 * when failing is due to wrong user input */
@@ -4828,12 +5077,10 @@ int __connman_service_add_passphrase(struct connman_service *service,
        switch (service->security) {
        case CONNMAN_SERVICE_SECURITY_WEP:
        case CONNMAN_SERVICE_SECURITY_PSK:
-               err = __connman_service_set_passphrase(service, passphrase);
-               break;
        case CONNMAN_SERVICE_SECURITY_8021X:
-               __connman_service_set_agent_passphrase(service,
-                                               passphrase);
+               err = __connman_service_set_passphrase(service, passphrase);
                break;
+
        case CONNMAN_SERVICE_SECURITY_UNKNOWN:
        case CONNMAN_SERVICE_SECURITY_NONE:
        case CONNMAN_SERVICE_SECURITY_WPA:
@@ -4852,7 +5099,7 @@ static int check_wpspin(struct connman_service *service, const char *wpspin)
        int length;
        guint i;
 
-       if (wpspin == NULL)
+       if (!wpspin)
                return 0;
 
        length = strlen(wpspin);
@@ -4879,53 +5126,56 @@ static int check_wpspin(struct connman_service *service, const char *wpspin)
        return 0;
 }
 
-static void request_input_cb (struct connman_service *service,
-                       connman_bool_t values_received,
+static void request_input_cb(struct connman_service *service,
+                       bool values_received,
                        const char *name, int name_len,
                        const char *identity, const char *passphrase,
-                       gboolean wps, const char *wpspin,
+                       bool wps, const char *wpspin,
                        const char *error, void *user_data)
 {
        struct connman_device *device;
+       const char *security;
        int err = 0;
 
-       DBG ("RequestInput return, %p", service);
+       DBG("RequestInput return, %p", service);
 
-       if (error != NULL) {
+       if (error) {
                DBG("error: %s", error);
 
                if (g_strcmp0(error,
                                "net.connman.Agent.Error.Canceled") == 0) {
                        err = -EINVAL;
 
-                       if (service->hidden == TRUE)
+                       if (service->hidden)
                                __connman_service_return_error(service,
                                                        ECANCELED, user_data);
                        goto done;
                } else {
-                       if (service->hidden == TRUE)
+                       if (service->hidden)
                                __connman_service_return_error(service,
                                                        ETIMEDOUT, user_data);
                }
        }
 
-       if (service->hidden == TRUE && name_len > 0 && name_len <= 32) {
+       if (service->hidden && name_len > 0 && name_len <= 32) {
                device = connman_network_get_device(service->network);
+               security = connman_network_get_string(service->network,
+                                                       "WiFi.Security");
                err = __connman_device_request_hidden_scan(device,
                                                name, name_len,
                                                identity, passphrase,
-                                               user_data);
+                                               security, user_data);
                if (err < 0)
                        __connman_service_return_error(service, -err,
                                                        user_data);
        }
 
-       if (values_received == FALSE || service->hidden == TRUE) {
+       if (!values_received || service->hidden) {
                err = -EINVAL;
                goto done;
        }
 
-       if (wps == TRUE && service->network != NULL) {
+       if (wps && service->network) {
                err = check_wpspin(service, wpspin);
                if (err < 0)
                        goto done;
@@ -4933,10 +5183,10 @@ static void request_input_cb (struct connman_service *service,
                connman_network_set_bool(service->network, "WiFi.UseWPS", wps);
        }
 
-       if (identity != NULL)
+       if (identity)
                __connman_service_set_agent_identity(service, identity);
 
-       if (passphrase != NULL)
+       if (passphrase)
                err = __connman_service_add_passphrase(service, passphrase);
 
  done:
@@ -4944,11 +5194,9 @@ static void request_input_cb (struct connman_service *service,
                /* We forget any previous error. */
                set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
-               __connman_service_connect(service);
+               __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER);
 
-               /* Never cache agent provided credentials */
-               __connman_service_set_agent_identity(service, NULL);
-               __connman_service_set_agent_passphrase(service, NULL);
        } else if (err == -ENOKEY) {
                __connman_service_indicate_error(service,
                                        CONNMAN_SERVICE_ERROR_INVALID_KEY);
@@ -4957,7 +5205,7 @@ static void request_input_cb (struct connman_service *service,
                 * when failing is due to wrong user input */
                service->state = CONNMAN_SERVICE_STATE_IDLE;
 
-               if (service->hidden == FALSE) {
+               if (!service->hidden) {
                        /*
                         * If there was a real error when requesting
                         * hidden scan, then that error is returned already
@@ -4978,10 +5226,10 @@ static void downgrade_connected_services(void)
        struct connman_service *up_service;
        GList *list;
 
-       for (list = service_list; list != NULL; list = list->next) {
+       for (list = service_list; list; list = list->next) {
                up_service = list->data;
 
-               if (is_connected(up_service) == FALSE)
+               if (!is_connected(up_service))
                        continue;
 
                if (up_service->state == CONNMAN_SERVICE_STATE_ONLINE)
@@ -4998,12 +5246,12 @@ static int service_update_preferred_order(struct connman_service *default_servic
        unsigned int *tech_array;
        int i;
 
-       if (default_service == NULL || default_service == new_service ||
-                       default_service->state != new_state )
+       if (!default_service || default_service == new_service ||
+                       default_service->state != new_state)
                return 0;
 
        tech_array = connman_setting_get_uint_list("PreferredTechnologies");
-       if (tech_array != NULL) {
+       if (tech_array) {
 
                for (i = 0; tech_array[i] != 0; i += 1) {
                        if (default_service->type == tech_array[i])
@@ -5029,10 +5277,10 @@ static void single_connected_tech(struct connman_service *allowed)
 
        DBG("keeping %p %s", allowed, allowed->path);
 
-       for (iter = service_list; iter != NULL; iter = iter->next) {
+       for (iter = service_list; iter; iter = iter->next) {
                service = iter->data;
 
-               if (is_connected(service) == FALSE)
+               if (!is_connected(service))
                        break;
 
                if (service == allowed)
@@ -5041,7 +5289,7 @@ static void single_connected_tech(struct connman_service *allowed)
                services = g_slist_prepend(services, service);
        }
 
-       for (list = services; list != NULL; list = list->next) {
+       for (list = services; list; list = list->next) {
                service = list->data;
 
                DBG("disconnecting %p %s", service, service->path);
@@ -5051,13 +5299,21 @@ static void single_connected_tech(struct connman_service *allowed)
        g_slist_free(services);
 }
 
+static const char *get_dbus_sender(struct connman_service *service)
+{
+       if (!service->pending)
+               return NULL;
+
+       return dbus_message_get_sender(service->pending);
+}
+
 static int service_indicate_state(struct connman_service *service)
 {
        enum connman_service_state old_state, new_state;
        struct connman_service *def_service;
        int result;
 
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        old_state = service->state;
@@ -5090,63 +5346,55 @@ static int service_indicate_state(struct connman_service *service)
 
        if (new_state == CONNMAN_SERVICE_STATE_IDLE &&
                        old_state != CONNMAN_SERVICE_STATE_DISCONNECT) {
-               reply_pending(service, ECONNABORTED);
 
                __connman_service_disconnect(service);
        }
 
        if (new_state == CONNMAN_SERVICE_STATE_CONFIGURATION) {
-               if (service->new_service == FALSE &&
+               if (!service->new_service &&
                                __connman_stats_service_register(service) == 0) {
                        /*
                         * For new services the statistics are updated after
                         * we have successfully connected.
                         */
-                       __connman_stats_get(service, FALSE,
+                       __connman_stats_get(service, false,
                                                &service->stats.data);
-                       __connman_stats_get(service, TRUE,
+                       __connman_stats_get(service, true,
                                                &service->stats_roaming.data);
                }
        }
 
-       if (new_state == CONNMAN_SERVICE_STATE_IDLE) {
-               connman_bool_t reconnect;
-
-               reconnect = get_reconnect_state(service);
-               if (reconnect == TRUE)
-                       __connman_service_auto_connect();
-       }
-
        if (new_state == CONNMAN_SERVICE_STATE_READY) {
                enum connman_ipconfig_method method;
 
-               if (service->new_service == TRUE &&
+               if (service->new_service &&
                                __connman_stats_service_register(service) == 0) {
                        /*
                         * This is normally done after configuring state
                         * but for new service do this after we have connected
                         * successfully.
                         */
-                       __connman_stats_get(service, FALSE,
+                       __connman_stats_get(service, false,
                                                &service->stats.data);
-                       __connman_stats_get(service, TRUE,
+                       __connman_stats_get(service, true,
                                                &service->stats_roaming.data);
                }
 
-               service->new_service = FALSE;
+               service->new_service = false;
 
-               service_update_preferred_order(def_service, service, new_state);
+               default_changed();
 
-               set_reconnect_state(service, TRUE);
+               def_service = __connman_service_get_default();
+
+               service_update_preferred_order(def_service, service, new_state);
 
-               __connman_service_set_favorite(service, TRUE);
+               __connman_service_set_favorite(service, true);
 
                reply_pending(service, 0);
 
                g_get_current_time(&service->modified);
                service_save(service);
 
-               update_nameservers(service);
                dns_changed(service);
                domain_changed(service);
                proxy_changed(service);
@@ -5156,7 +5404,7 @@ static int service_indicate_state(struct connman_service *service)
 
                if (service->type == CONNMAN_SERVICE_TYPE_WIFI &&
                        connman_network_get_bool(service->network,
-                                               "WiFi.UseWPS") == TRUE) {
+                                               "WiFi.UseWPS")) {
                        const char *pass;
 
                        pass = connman_network_get_string(service->network,
@@ -5165,26 +5413,25 @@ static int service_indicate_state(struct connman_service *service)
                        __connman_service_set_passphrase(service, pass);
 
                        connman_network_set_bool(service->network,
-                                                       "WiFi.UseWPS", FALSE);
+                                                       "WiFi.UseWPS", false);
                }
 
-               default_changed();
-
                method = __connman_ipconfig_get_method(service->ipconfig_ipv6);
                if (method == CONNMAN_IPCONFIG_METHOD_OFF)
                        __connman_ipconfig_disable_ipv6(
                                                service->ipconfig_ipv6);
 
-               if (connman_setting_get_bool("SingleConnectedTechnology")
-                               == TRUE)
+               if (connman_setting_get_bool("SingleConnectedTechnology"))
                        single_connected_tech(service);
+               else if (service->type != CONNMAN_SERVICE_TYPE_VPN)
+                       vpn_auto_connect();
 
        } else if (new_state == CONNMAN_SERVICE_STATE_DISCONNECT) {
                def_service = __connman_service_get_default();
 
-               if (__connman_notifier_is_connected() == FALSE &&
-                       def_service != NULL &&
-                               def_service->provider != NULL)
+               if (!__connman_notifier_is_connected() &&
+                       def_service &&
+                               def_service->provider)
                        connman_provider_disconnect(def_service->provider);
 
                default_changed();
@@ -5193,38 +5440,44 @@ static int service_indicate_state(struct connman_service *service)
 
                __connman_wpad_stop(service);
 
-               update_nameservers(service);
                dns_changed(service);
                domain_changed(service);
                proxy_changed(service);
 
-               __connman_notifier_disconnect(service->type);
-
                /*
                 * Previous services which are connected and which states
                 * are set to online should reset relevantly ipconfig_state
                 * to ready so wispr/portal will be rerun on those
                 */
                downgrade_connected_services();
+
+               __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
        }
 
        if (new_state == CONNMAN_SERVICE_STATE_FAILURE) {
-               if (service->userconnect == TRUE &&
+
+               if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER &&
                        connman_agent_report_error(service, service->path,
                                        error2string(service->error),
-                                       report_error_cb, NULL) == -EINPROGRESS)
+                                       report_error_cb,
+                                       get_dbus_sender(service),
+                                       NULL) == -EINPROGRESS)
                        return 0;
                service_complete(service);
        } else
                set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
-       if (service_list->next != NULL) {
-               service_list = g_list_sort(service_list, service_compare);
-               service_schedule_changed();
-       }
+       service_list_sort();
 
        __connman_connection_update_gateway();
 
+       if ((old_state == CONNMAN_SERVICE_STATE_ONLINE &&
+                       new_state != CONNMAN_SERVICE_STATE_READY) ||
+               (old_state == CONNMAN_SERVICE_STATE_READY &&
+                       new_state != CONNMAN_SERVICE_STATE_ONLINE)) {
+               __connman_notifier_disconnect(service->type);
+       }
+
        if (new_state == CONNMAN_SERVICE_STATE_ONLINE) {
                __connman_notifier_enter_online(service->type);
                default_changed();
@@ -5238,14 +5491,21 @@ int __connman_service_indicate_error(struct connman_service *service,
 {
        DBG("service %p error %d", service, error);
 
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        set_error(service, error);
 
-       if (service->error == CONNMAN_SERVICE_ERROR_INVALID_KEY)
+       /*
+        * Supplicant does not always return invalid key error for
+        * WPA-EAP so clear the credentials always.
+        */
+       if (service->error == CONNMAN_SERVICE_ERROR_INVALID_KEY ||
+                       service->security == CONNMAN_SERVICE_SECURITY_8021X)
                __connman_service_set_passphrase(service, NULL);
 
+       __connman_service_set_agent_identity(service, NULL);
+
        __connman_service_ipconfig_indicate_state(service,
                                                CONNMAN_SERVICE_STATE_FAILURE,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
@@ -5259,7 +5519,7 @@ int __connman_service_clear_error(struct connman_service *service)
 {
        DBG("service %p", service);
 
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        if (service->state != CONNMAN_SERVICE_STATE_FAILURE)
@@ -5269,9 +5529,6 @@ int __connman_service_clear_error(struct connman_service *service)
                                                CONNMAN_SERVICE_STATE_UNKNOWN;
        set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
-       if (service->favorite == TRUE)
-               set_reconnect_state(service, TRUE);
-
        __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_IDLE,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);
@@ -5291,7 +5548,16 @@ int __connman_service_clear_error(struct connman_service *service)
 
 int __connman_service_indicate_default(struct connman_service *service)
 {
-       DBG("service %p", service);
+       DBG("service %p state %s", service, state2string(service->state));
+
+       if (!is_connected(service)) {
+               /*
+                * If service is not yet fully connected, then we must not
+                * change the default yet. The default gw will be changed
+                * after the service state is in ready.
+                */
+               return -EINPROGRESS;
+       }
 
        default_changed();
 
@@ -5302,7 +5568,7 @@ enum connman_service_state __connman_service_ipconfig_get_state(
                                        struct connman_service *service,
                                        enum connman_ipconfig_type type)
 {
-       if (service == NULL)
+       if (!service)
                return CONNMAN_SERVICE_STATE_UNKNOWN;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
@@ -5327,7 +5593,7 @@ static void check_proxy_setup(struct connman_service *service)
 
        if (service->proxy_config != CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN &&
                (service->proxy_config != CONNMAN_SERVICE_PROXY_METHOD_AUTO ||
-                       service->pac != NULL))
+                       service->pac))
                goto done;
 
        if (__connman_wpad_start(service) < 0) {
@@ -5352,7 +5618,7 @@ static int connected_networks_count;
 static int original_rp_filter;
 
 static void service_rp_filter(struct connman_service *service,
-                               gboolean connected)
+                               bool connected)
 {
        enum connman_ipconfig_method method;
 
@@ -5369,7 +5635,7 @@ static void service_rp_filter(struct connman_service *service,
                break;
        }
 
-       if (connected == TRUE) {
+       if (connected) {
                if (connected_networks_count == 1) {
                        int filter_value;
                        filter_value = __connman_ipconfig_set_rp_filter();
@@ -5398,8 +5664,13 @@ static void service_rp_filter(struct connman_service *service,
 static gboolean redo_wispr(gpointer user_data)
 {
        struct connman_service *service = user_data;
+       int refcount = service->refcount - 1;
 
-       DBG("");
+       connman_service_unref(service);
+       if (refcount == 0) {
+               DBG("Service %p already removed", service);
+               return FALSE;
+       }
 
        __connman_wispr_start(service, CONNMAN_IPCONFIG_TYPE_IPV6);
 
@@ -5427,7 +5698,7 @@ int __connman_service_online_check_failed(struct connman_service *service,
         * necessary IPv6 router advertisement messages that might have
         * DNS data etc.
         */
-       g_timeout_add_seconds(1, redo_wispr, service);
+       g_timeout_add_seconds(1, redo_wispr, connman_service_ref(service));
 
        return EAGAIN;
 }
@@ -5438,9 +5709,9 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
 {
        struct connman_ipconfig *ipconfig = NULL;
        enum connman_service_state old_state;
-       int ret;
+       enum connman_ipconfig_method method;
 
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
@@ -5451,7 +5722,7 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
                ipconfig = service->ipconfig_ipv6;
        }
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -EINVAL;
 
        /* Any change? */
@@ -5475,11 +5746,9 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
                __connman_ipconfig_enable(ipconfig);
                break;
        case CONNMAN_SERVICE_STATE_READY:
-               update_nameservers(service);
-
                if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
                        check_proxy_setup(service);
-                       service_rp_filter(service, TRUE);
+                       service_rp_filter(service, true);
                } else {
                        service->online_check_count = 1;
                        __connman_wispr_start(service, type);
@@ -5492,48 +5761,42 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
                        return -EINVAL;
 
                if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-                       service_rp_filter(service, FALSE);
+                       service_rp_filter(service, false);
 
                break;
        case CONNMAN_SERVICE_STATE_FAILURE:
                break;
        }
 
-       /* We keep that state */
-       if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
-               service->state_ipv4 = new_state;
-       else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-               service->state_ipv6 = new_state;
-
-       ret = service_indicate_state(service);
-
-       /*
-        * If the ipconfig method is OFF, then we set the state to IDLE
-        * so that it will not affect the combined state in the future.
+       /* Keep that state, but if the ipconfig method is OFF, then we set
+          the state to IDLE so that it will not affect the combined state
+          in the future.
         */
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
-               enum connman_ipconfig_method method;
                method = __connman_ipconfig_get_method(service->ipconfig_ipv4);
+
                if (method == CONNMAN_IPCONFIG_METHOD_OFF ||
-                               method == CONNMAN_IPCONFIG_METHOD_UNKNOWN) {
-                       service->state_ipv4 = CONNMAN_SERVICE_STATE_IDLE;
-                       ret = service_indicate_state(service);
-               }
+                               method == CONNMAN_IPCONFIG_METHOD_UNKNOWN)
+                       new_state = CONNMAN_SERVICE_STATE_IDLE;
+
+               service->state_ipv4 = new_state;
 
        } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
-               enum connman_ipconfig_method method;
                method = __connman_ipconfig_get_method(service->ipconfig_ipv6);
+
                if (method == CONNMAN_IPCONFIG_METHOD_OFF ||
-                               method == CONNMAN_IPCONFIG_METHOD_UNKNOWN) {
-                       service->state_ipv6 = CONNMAN_SERVICE_STATE_IDLE;
-                       ret = service_indicate_state(service);
-               }
+                               method == CONNMAN_IPCONFIG_METHOD_UNKNOWN)
+                       new_state = CONNMAN_SERVICE_STATE_IDLE;
+
+               service->state_ipv6 = new_state;
        }
 
-       return ret;
+       update_nameservers(service);
+
+       return service_indicate_state(service);
 }
 
-static connman_bool_t prepare_network(struct connman_service *service)
+static bool prepare_network(struct connman_service *service)
 {
        enum connman_network_type type;
        unsigned int ssid_len;
@@ -5543,56 +5806,57 @@ static connman_bool_t prepare_network(struct connman_service *service)
        switch (type) {
        case CONNMAN_NETWORK_TYPE_UNKNOWN:
        case CONNMAN_NETWORK_TYPE_VENDOR:
-               return FALSE;
+               return false;
        case CONNMAN_NETWORK_TYPE_WIFI:
-               if (connman_network_get_blob(service->network, "WiFi.SSID",
-                                                       &ssid_len) == NULL)
-                       return FALSE;
+               if (!connman_network_get_blob(service->network, "WiFi.SSID",
+                                               &ssid_len))
+                       return false;
 
-               if (service->passphrase != NULL)
+               if (service->passphrase)
                        connman_network_set_string(service->network,
                                "WiFi.Passphrase", service->passphrase);
                break;
        case CONNMAN_NETWORK_TYPE_ETHERNET:
+       case CONNMAN_NETWORK_TYPE_GADGET:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
        case CONNMAN_NETWORK_TYPE_CELLULAR:
                break;
        }
 
-       return TRUE;
+       return true;
 }
 
 static void prepare_8021x(struct connman_service *service)
 {
-       if (service->eap != NULL)
+       if (service->eap)
                connman_network_set_string(service->network, "WiFi.EAP",
                                                                service->eap);
 
-       if (service->identity != NULL)
+       if (service->identity)
                connman_network_set_string(service->network, "WiFi.Identity",
                                                        service->identity);
 
-       if (service->ca_cert_file != NULL)
+       if (service->ca_cert_file)
                connman_network_set_string(service->network, "WiFi.CACertFile",
                                                        service->ca_cert_file);
 
-       if (service->client_cert_file != NULL)
+       if (service->client_cert_file)
                connman_network_set_string(service->network,
                                                "WiFi.ClientCertFile",
                                                service->client_cert_file);
 
-       if (service->private_key_file != NULL)
+       if (service->private_key_file)
                connman_network_set_string(service->network,
                                                "WiFi.PrivateKeyFile",
                                                service->private_key_file);
 
-       if (service->private_key_passphrase != NULL)
+       if (service->private_key_passphrase)
                connman_network_set_string(service->network,
                                        "WiFi.PrivateKeyPassphrase",
                                        service->private_key_passphrase);
 
-       if (service->phase2 != NULL)
+       if (service->phase2)
                connman_network_set_string(service->network, "WiFi.Phase2",
                                                        service->phase2);
 }
@@ -5601,16 +5865,17 @@ static int service_connect(struct connman_service *service)
 {
        int err;
 
-       if (service->hidden == TRUE)
+       if (service->hidden)
                return -EPERM;
 
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                return -EINVAL;
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_GADGET:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
        case CONNMAN_SERVICE_TYPE_VPN:
@@ -5624,28 +5889,26 @@ static int service_connect(struct connman_service *service)
                case CONNMAN_SERVICE_SECURITY_PSK:
                case CONNMAN_SERVICE_SECURITY_WPA:
                case CONNMAN_SERVICE_SECURITY_RSN:
-                       if (service->passphrase == NULL) {
-                               if (service->network == NULL)
+                       if (!service->passphrase) {
+                               if (!service->network)
                                        return -EOPNOTSUPP;
 
-                               if (service->wps == FALSE ||
-                                       connman_network_get_bool(
-                                                       service->network,
-                                                       "WiFi.UseWPS") == FALSE)
+                               if (!service->wps ||
+                                       !connman_network_get_bool(service->network, "WiFi.UseWPS"))
                                        return -ENOKEY;
                        } else if (service->error ==
                                        CONNMAN_SERVICE_ERROR_INVALID_KEY)
                                return -ENOKEY;
                        break;
                case CONNMAN_SERVICE_SECURITY_8021X:
-                       if (service->eap == NULL)
+                       if (!service->eap)
                                return -EINVAL;
 
                        /*
                         * never request credentials if using EAP-TLS
                         * (EAP-TLS networks need to be fully provisioned)
                         */
-                       if (g_str_equal(service->eap, "tls") == TRUE)
+                       if (g_str_equal(service->eap, "tls"))
                                break;
 
                        /*
@@ -5653,10 +5916,9 @@ static int service_connect(struct connman_service *service)
                         * missing. Agent provided credentials can be used as
                         * fallback if needed.
                         */
-                       if ((service->identity == NULL &&
-                                       service->agent_identity == NULL) ||
-                                       (service->passphrase == NULL &&
-                                       service->agent_passphrase == NULL))
+                       if ((!service->identity &&
+                                       !service->agent_identity) ||
+                                       !service->passphrase)
                                return -ENOKEY;
 
                        break;
@@ -5664,8 +5926,8 @@ static int service_connect(struct connman_service *service)
                break;
        }
 
-       if (service->network != NULL) {
-               if (prepare_network(service) == FALSE)
+       if (service->network) {
+               if (!prepare_network(service))
                        return -EINVAL;
 
                switch (service->security) {
@@ -5682,9 +5944,9 @@ static int service_connect(struct connman_service *service)
                }
 
                if (__connman_stats_service_register(service) == 0) {
-                       __connman_stats_get(service, FALSE,
+                       __connman_stats_get(service, false,
                                                &service->stats.data);
-                       __connman_stats_get(service, TRUE,
+                       __connman_stats_get(service, true,
                                                &service->stats_roaming.data);
                }
 
@@ -5695,7 +5957,7 @@ static int service_connect(struct connman_service *service)
 
                err = __connman_network_connect(service->network);
        } else if (service->type == CONNMAN_SERVICE_TYPE_VPN &&
-                                       service->provider != NULL)
+                                       service->provider)
                err = __connman_provider_connect(service->provider);
        else
                return -EOPNOTSUPP;
@@ -5711,32 +5973,36 @@ static int service_connect(struct connman_service *service)
        return err;
 }
 
-
-int __connman_service_connect(struct connman_service *service)
+int __connman_service_connect(struct connman_service *service,
+                       enum connman_service_connect_reason reason)
 {
        int err;
 
-       DBG("service %p state %s", service, state2string(service->state));
+       DBG("service %p state %s connect reason %s -> %s",
+               service, state2string(service->state),
+               reason2string(service->connect_reason),
+               reason2string(reason));
 
-       if (is_connected(service) == TRUE)
+       if (is_connected(service))
                return -EISCONN;
 
-       if (is_connecting(service) == TRUE)
+       if (is_connecting(service))
                return -EALREADY;
 
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                return -EINVAL;
        default:
-               if (is_ipconfig_usable(service) == FALSE)
+               if (!is_ipconfig_usable(service))
                        return -ENOLINK;
 
                err = service_connect(service);
        }
 
+       service->connect_reason = reason;
        if (err >= 0) {
                set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
                return 0;
@@ -5750,13 +6016,13 @@ int __connman_service_connect(struct connman_service *service)
                return -EINPROGRESS;
        }
 
-       if (service->network != NULL)
+       if (service->network)
                __connman_network_disconnect(service->network);
        else if (service->type == CONNMAN_SERVICE_TYPE_VPN &&
-                               service->provider != NULL)
+                               service->provider)
                        connman_provider_disconnect(service->provider);
 
-       if (service->userconnect == TRUE) {
+       if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER) {
                if (err == -ENOKEY || err == -EPERM) {
                        DBusMessage *pending = NULL;
 
@@ -5766,14 +6032,16 @@ int __connman_service_connect(struct connman_service *service)
                         * after the real hidden network is connected or
                         * connection failed.
                         */
-                       if (service->hidden == TRUE) {
+                       if (service->hidden) {
                                pending = service->pending;
                                service->pending = NULL;
                        }
 
                        err = __connman_agent_request_passphrase_input(service,
-                                       request_input_cb, pending);
-                       if (service->hidden == TRUE && err != -EINPROGRESS)
+                                       request_input_cb,
+                                       get_dbus_sender(service),
+                                       pending);
+                       if (service->hidden && err != -EINPROGRESS)
                                service->pending = pending;
 
                        return err;
@@ -5790,14 +6058,17 @@ int __connman_service_disconnect(struct connman_service *service)
 
        DBG("service %p", service);
 
-       service->userconnect = FALSE;
+       service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_NONE;
+       service->proxy = CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
 
        connman_agent_cancel(service);
 
-       if (service->network != NULL) {
+       reply_pending(service, ECONNABORTED);
+
+       if (service->network) {
                err = __connman_network_disconnect(service->network);
        } else if (service->type == CONNMAN_SERVICE_TYPE_VPN &&
-                                       service->provider != NULL)
+                                       service->provider)
                err = connman_provider_disconnect(service->provider);
        else
                return -EOPNOTSUPP;
@@ -5836,21 +6107,19 @@ int __connman_service_disconnect_all(void)
 
        DBG("");
 
-       for (iter = service_list; iter != NULL; iter = iter->next) {
+       for (iter = service_list; iter; iter = iter->next) {
                service = iter->data;
 
-               if (is_connected(service) == FALSE)
+               if (!is_connected(service))
                        break;
 
                services = g_slist_prepend(services, service);
        }
 
-       for (list = services; list != NULL; list = list->next) {
+       for (list = services; list; list = list->next) {
                struct connman_service *service = list->data;
 
-               service->ignore = TRUE;
-
-               set_reconnect_state(service, FALSE);
+               service->ignore = true;
 
                __connman_service_disconnect(service);
        }
@@ -5902,14 +6171,10 @@ int __connman_service_provision_changed(const char *ident)
         * Because the provision_changed() might have set some services
         * as favorite, we must sort the sequence now.
         */
-       if (services_dirty == TRUE) {
-               services_dirty = FALSE;
+       if (services_dirty) {
+               services_dirty = false;
 
-               if (service_list->next != NULL) {
-                       service_list = g_list_sort(service_list,
-                                                       service_compare);
-                       service_schedule_changed();
-               }
+               service_list_sort();
 
                __connman_connection_update_gateway();
        }
@@ -5920,7 +6185,7 @@ int __connman_service_provision_changed(const char *ident)
 void __connman_service_set_config(struct connman_service *service,
                                const char *file_id, const char *entry)
 {
-       if (service == NULL)
+       if (!service)
                return;
 
        g_free(service->config_file);
@@ -5941,13 +6206,13 @@ static struct connman_service *service_get(const char *identifier)
        struct connman_service *service;
 
        service = g_hash_table_lookup(service_hash, identifier);
-       if (service != NULL) {
+       if (service) {
                connman_service_ref(service);
                return service;
        }
 
        service = connman_service_create();
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        DBG("service %p", service);
@@ -5966,7 +6231,7 @@ static int service_register(struct connman_service *service)
 {
        DBG("service %p", service);
 
-       if (service->path != NULL)
+       if (service->path)
                return -EALREADY;
 
        service->path = g_strdup_printf("%s/service/%s", CONNMAN_PATH,
@@ -5974,74 +6239,75 @@ static int service_register(struct connman_service *service)
 
        DBG("path %s", service->path);
 
-       __connman_config_provision_service(service);
-
-       service_load(service);
+       if (__connman_config_provision_service(service) < 0)
+               service_load(service);
 
        g_dbus_register_interface(connection, service->path,
                                        CONNMAN_SERVICE_INTERFACE,
                                        service_methods, service_signals,
                                                        NULL, service, NULL);
 
-       if (service_list->next != NULL) {
-               service_list = g_list_sort(service_list, service_compare);
-               service_schedule_changed();
-       }
+       service_list_sort();
 
        __connman_connection_update_gateway();
 
        return 0;
 }
 
-static void service_up(struct connman_ipconfig *ipconfig)
+static void service_up(struct connman_ipconfig *ipconfig,
+               const char *ifname)
 {
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
 
-       DBG("%s up", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s up", ifname);
 
        link_changed(service);
 
-       service->stats.valid = FALSE;
-       service->stats_roaming.valid = FALSE;
+       service->stats.valid = false;
+       service->stats_roaming.valid = false;
 }
 
-static void service_down(struct connman_ipconfig *ipconfig)
+static void service_down(struct connman_ipconfig *ipconfig,
+                       const char *ifname)
 {
-       DBG("%s down", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s down", ifname);
 }
 
-static void service_lower_up(struct connman_ipconfig *ipconfig)
+static void service_lower_up(struct connman_ipconfig *ipconfig,
+                       const char *ifname)
 {
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
 
-       DBG("%s lower up", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s lower up", ifname);
 
        stats_start(service);
 }
 
-static void service_lower_down(struct connman_ipconfig *ipconfig)
+static void service_lower_down(struct connman_ipconfig *ipconfig,
+                       const char *ifname)
 {
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
 
-       DBG("%s lower down", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s lower down", ifname);
 
-       if (is_idle_state(service, service->state_ipv4) == FALSE)
+       if (!is_idle_state(service, service->state_ipv4))
                __connman_ipconfig_disable(service->ipconfig_ipv4);
 
-       if (is_idle_state(service, service->state_ipv6) == FALSE)
+       if (!is_idle_state(service, service->state_ipv6))
                __connman_ipconfig_disable(service->ipconfig_ipv6);
 
        stats_stop(service);
        service_save(service);
 }
 
-static void service_ip_bound(struct connman_ipconfig *ipconfig)
+static void service_ip_bound(struct connman_ipconfig *ipconfig,
+                       const char *ifname)
 {
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
        enum connman_ipconfig_method method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
        enum connman_ipconfig_type type = CONNMAN_IPCONFIG_TYPE_UNKNOWN;
 
-       DBG("%s ip bound", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s ip bound", ifname);
 
        type = __connman_ipconfig_get_config_type(ipconfig);
        method = __connman_ipconfig_get_method(ipconfig);
@@ -6058,13 +6324,14 @@ static void service_ip_bound(struct connman_ipconfig *ipconfig)
        settings_changed(service, ipconfig);
 }
 
-static void service_ip_release(struct connman_ipconfig *ipconfig)
+static void service_ip_release(struct connman_ipconfig *ipconfig,
+                       const char *ifname)
 {
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
        enum connman_ipconfig_method method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
        enum connman_ipconfig_type type = CONNMAN_IPCONFIG_TYPE_UNKNOWN;
 
-       DBG("%s ip release", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s ip release", ifname);
 
        type = __connman_ipconfig_get_config_type(ipconfig);
        method = __connman_ipconfig_get_method(ipconfig);
@@ -6087,11 +6354,12 @@ static void service_ip_release(struct connman_ipconfig *ipconfig)
        settings_changed(service, ipconfig);
 }
 
-static void service_route_changed(struct connman_ipconfig *ipconfig)
+static void service_route_changed(struct connman_ipconfig *ipconfig,
+                               const char *ifname)
 {
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
 
-       DBG("%s route changed", __connman_ipconfig_get_ifname(ipconfig));
+       DBG("%s route changed", ifname);
 
        settings_changed(service, ipconfig);
 }
@@ -6114,7 +6382,7 @@ static struct connman_ipconfig *create_ip4config(struct connman_service *service
 
        ipconfig_ipv4 = __connman_ipconfig_create(index,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
-       if (ipconfig_ipv4 == NULL)
+       if (!ipconfig_ipv4)
                return NULL;
 
        __connman_ipconfig_set_method(ipconfig_ipv4, method);
@@ -6133,7 +6401,7 @@ static struct connman_ipconfig *create_ip6config(struct connman_service *service
 
        ipconfig_ipv6 = __connman_ipconfig_create(index,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
-       if (ipconfig_ipv6 == NULL)
+       if (!ipconfig_ipv6)
                return NULL;
 
        __connman_ipconfig_set_data(ipconfig_ipv6, service);
@@ -6147,11 +6415,11 @@ void __connman_service_read_ip4config(struct connman_service *service)
 {
        GKeyFile *keyfile;
 
-       if (service->ipconfig_ipv4 == NULL)
+       if (!service->ipconfig_ipv4)
                return;
 
        keyfile = connman_storage_load_service(service->identifier);
-       if (keyfile == NULL)
+       if (!keyfile)
                return;
 
        __connman_ipconfig_load(service->ipconfig_ipv4, keyfile,
@@ -6165,7 +6433,7 @@ void connman_service_create_ip4config(struct connman_service *service,
 {
        DBG("ipv4 %p", service->ipconfig_ipv4);
 
-       if (service->ipconfig_ipv4 != NULL)
+       if (service->ipconfig_ipv4)
                return;
 
        service->ipconfig_ipv4 = create_ip4config(service, index,
@@ -6177,11 +6445,11 @@ void __connman_service_read_ip6config(struct connman_service *service)
 {
        GKeyFile *keyfile;
 
-       if (service->ipconfig_ipv6 == NULL)
+       if (!service->ipconfig_ipv6)
                return;
 
        keyfile = connman_storage_load_service(service->identifier);
-       if (keyfile == NULL)
+       if (!keyfile)
                return;
 
        __connman_ipconfig_load(service->ipconfig_ipv6, keyfile,
@@ -6195,7 +6463,7 @@ void connman_service_create_ip6config(struct connman_service *service,
 {
        DBG("ipv6 %p", service->ipconfig_ipv6);
 
-       if (service->ipconfig_ipv6 != NULL)
+       if (service->ipconfig_ipv6)
                return;
 
        service->ipconfig_ipv6 = create_ip6config(service, index);
@@ -6215,17 +6483,15 @@ struct connman_service *connman_service_lookup_from_network(struct connman_netwo
        const char *ident, *group;
        char *name;
 
-       DBG("network %p", network);
-
-       if (network == NULL)
+       if (!network)
                return NULL;
 
        ident = __connman_network_get_ident(network);
-       if (ident == NULL)
+       if (!ident)
                return NULL;
 
        group = connman_network_get_group(network);
-       if (group == NULL)
+       if (!group)
                return NULL;
 
        name = g_strdup_printf("%s_%s_%s",
@@ -6241,7 +6507,7 @@ struct connman_service *__connman_service_lookup_from_index(int index)
        struct connman_service *service;
        GList *list;
 
-       for (list = service_list; list != NULL; list = list->next) {
+       for (list = service_list; list; list = list->next) {
                service = list->data;
 
                if (__connman_ipconfig_get_index(service->ipconfig_ipv4)
@@ -6271,34 +6537,46 @@ const char *__connman_service_get_path(struct connman_service *service)
        return service->path;
 }
 
+const char *__connman_service_get_name(struct connman_service *service)
+{
+       return service->name;
+}
+
+enum connman_service_state __connman_service_get_state(struct connman_service *service)
+{
+       return service->state;
+}
+
 unsigned int __connman_service_get_order(struct connman_service *service)
 {
-       if (service == NULL)
+       unsigned int order = 0;
+
+       if (!service)
                return 0;
 
-       if (service->favorite == FALSE) {
-               service->order = 0;
-               goto done;
-       }
+       service->order = 0;
+
+       if (!service->favorite)
+               return 0;
 
        if (service == service_list->data)
-               service->order = 1;
-       else if (service->type == CONNMAN_SERVICE_TYPE_VPN &&
-                       service->do_split_routing == FALSE)
+               order = 1;
+
+       if (service->type == CONNMAN_SERVICE_TYPE_VPN &&
+                       !service->do_split_routing) {
                service->order = 10;
-       else
-               service->order = 0;
+               order = 10;
+       }
 
        DBG("service %p name %s order %d split %d", service, service->name,
-               service->order, service->do_split_routing);
+               order, service->do_split_routing);
 
-done:
-       return service->order;
+       return order;
 }
 
 void __connman_service_update_ordering(void)
 {
-       if (service_list != NULL && service_list->next != NULL)
+       if (service_list && service_list->next)
                service_list = g_list_sort(service_list, service_compare);
 }
 
@@ -6319,6 +6597,8 @@ static enum connman_service_type convert_network_type(struct connman_network *ne
                return CONNMAN_SERVICE_TYPE_BLUETOOTH;
        case CONNMAN_NETWORK_TYPE_CELLULAR:
                return CONNMAN_SERVICE_TYPE_CELLULAR;
+       case CONNMAN_NETWORK_TYPE_GADGET:
+               return CONNMAN_SERVICE_TYPE_GADGET;
        }
 
        return CONNMAN_SERVICE_TYPE_UNKNOWN;
@@ -6326,19 +6606,19 @@ static enum connman_service_type convert_network_type(struct connman_network *ne
 
 static enum connman_service_security convert_wifi_security(const char *security)
 {
-       if (security == NULL)
+       if (!security)
                return CONNMAN_SERVICE_SECURITY_UNKNOWN;
-       else if (g_str_equal(security, "none") == TRUE)
+       else if (g_str_equal(security, "none"))
                return CONNMAN_SERVICE_SECURITY_NONE;
-       else if (g_str_equal(security, "wep") == TRUE)
+       else if (g_str_equal(security, "wep"))
                return CONNMAN_SERVICE_SECURITY_WEP;
-       else if (g_str_equal(security, "psk") == TRUE)
+       else if (g_str_equal(security, "psk"))
                return CONNMAN_SERVICE_SECURITY_PSK;
-       else if (g_str_equal(security, "ieee8021x") == TRUE)
+       else if (g_str_equal(security, "ieee8021x"))
                return CONNMAN_SERVICE_SECURITY_8021X;
-       else if (g_str_equal(security, "wpa") == TRUE)
+       else if (g_str_equal(security, "wpa"))
                return CONNMAN_SERVICE_SECURITY_WPA;
-       else if (g_str_equal(security, "rsn") == TRUE)
+       else if (g_str_equal(security, "rsn"))
                return CONNMAN_SERVICE_SECURITY_RSN;
        else
                return CONNMAN_SERVICE_SECURITY_UNKNOWN;
@@ -6352,21 +6632,21 @@ static void update_from_network(struct connman_service *service,
 
        DBG("service %p network %p", service, network);
 
-       if (is_connected(service) == TRUE)
+       if (is_connected(service))
                return;
 
-       if (is_connecting(service) == TRUE)
+       if (is_connecting(service))
                return;
 
        str = connman_network_get_string(network, "Name");
-       if (str != NULL) {
+       if (str) {
                g_free(service->name);
                service->name = g_strdup(str);
-               service->hidden = FALSE;
+               service->hidden = false;
        } else {
                g_free(service->name);
                service->name = NULL;
-               service->hidden = TRUE;
+               service->hidden = true;
        }
 
        service->strength = connman_network_get_strength(network);
@@ -6386,20 +6666,17 @@ static void update_from_network(struct connman_service *service,
        if (service->type == CONNMAN_SERVICE_TYPE_WIFI)
                service->wps = connman_network_get_bool(network, "WiFi.WPS");
 
-       if (service->strength > strength && service->network != NULL) {
+       if (service->strength > strength && service->network) {
                connman_network_unref(service->network);
                service->network = connman_network_ref(network);
 
                strength_changed(service);
        }
 
-       if (service->network == NULL)
+       if (!service->network)
                service->network = connman_network_ref(network);
 
-       if (service_list->next != NULL) {
-               service_list = g_list_sort(service_list, service_compare);
-               service_schedule_changed();
-       }
+       service_list_sort();
 }
 
 /**
@@ -6419,15 +6696,15 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
 
        DBG("network %p", network);
 
-       if (network == NULL)
+       if (!network)
                return NULL;
 
        ident = __connman_network_get_ident(network);
-       if (ident == NULL)
+       if (!ident)
                return NULL;
 
        group = connman_network_get_group(network);
-       if (group == NULL)
+       if (!group)
                return NULL;
 
        name = g_strdup_printf("%s_%s_%s",
@@ -6435,13 +6712,13 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
        service = service_get(name);
        g_free(name);
 
-       if (service == NULL)
+       if (!service)
                return NULL;
 
-       if (__connman_network_get_weakness(network) == TRUE)
+       if (__connman_network_get_weakness(network))
                return service;
 
-       if (service->path != NULL) {
+       if (service->path) {
                update_from_network(service, network);
                __connman_connection_update_gateway();
                return service;
@@ -6450,11 +6727,11 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
        service->type = convert_network_type(network);
 
        auto_connect_types = connman_setting_get_uint_list("DefaultAutoConnectTechnologies");
-       service->autoconnect = FALSE;
-       for (i = 0; auto_connect_types != NULL &&
+       service->autoconnect = false;
+       for (i = 0; auto_connect_types &&
                     auto_connect_types[i] != 0; i++) {
                if (service->type == auto_connect_types[i]) {
-                       service->autoconnect = TRUE;
+                       service->autoconnect = true;
                        break;
                }
        }
@@ -6468,9 +6745,10 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
        case CONNMAN_SERVICE_TYPE_GADGET:
        case CONNMAN_SERVICE_TYPE_WIFI:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        case CONNMAN_SERVICE_TYPE_ETHERNET:
-               service->favorite = TRUE;
+               service->favorite = true;
                break;
        }
 
@@ -6481,19 +6759,19 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
 
        index = connman_network_get_index(network);
 
-       if (service->ipconfig_ipv4 == NULL)
+       if (!service->ipconfig_ipv4)
                service->ipconfig_ipv4 = create_ip4config(service, index,
                                CONNMAN_IPCONFIG_METHOD_DHCP);
 
-       if (service->ipconfig_ipv6 == NULL)
+       if (!service->ipconfig_ipv6)
                service->ipconfig_ipv6 = create_ip6config(service, index);
 
        service_register(service);
 
-       if (service->favorite == TRUE) {
+       if (service->favorite) {
                device = connman_network_get_device(service->network);
-               if (device && connman_device_get_scanning(device) == FALSE)
-                       __connman_service_auto_connect();
+               if (device && !connman_device_get_scanning(device))
+                       __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
        }
 
        __connman_notifier_service_add(service, service->name);
@@ -6504,20 +6782,18 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne
 
 void __connman_service_update_from_network(struct connman_network *network)
 {
-       connman_bool_t need_sort = FALSE;
+       bool need_sort = false;
        struct connman_service *service;
        uint8_t strength;
-       connman_bool_t roaming;
+       bool roaming;
        const char *name;
-       connman_bool_t stats_enable;
-
-       DBG("network %p", network);
+       bool stats_enable;
 
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (service->network == NULL)
+       if (!service->network)
                return;
 
        name = connman_network_get_string(service->network, "Name");
@@ -6525,7 +6801,7 @@ void __connman_service_update_from_network(struct connman_network *network)
                g_free(service->name);
                service->name = g_strdup(name);
 
-               if (allow_property_changed(service) == TRUE)
+               if (allow_property_changed(service))
                        connman_dbus_property_changed_basic(service->path,
                                        CONNMAN_SERVICE_INTERFACE, "Name",
                                        DBUS_TYPE_STRING, &service->name);
@@ -6539,7 +6815,7 @@ void __connman_service_update_from_network(struct connman_network *network)
                goto roaming;
 
        service->strength = strength;
-       need_sort = TRUE;
+       need_sort = true;
 
        strength_changed(service);
 
@@ -6549,24 +6825,20 @@ roaming:
                goto sorting;
 
        stats_enable = stats_enabled(service);
-       if (stats_enable == TRUE)
+       if (stats_enable)
                stats_stop(service);
 
        service->roaming = roaming;
-       need_sort = TRUE;
+       need_sort = true;
 
-       if (stats_enable == TRUE)
+       if (stats_enable)
                stats_start(service);
 
        roaming_changed(service);
 
 sorting:
-       if (need_sort == TRUE) {
-               if (service_list->next != NULL) {
-                       service_list = g_list_sort(service_list,
-                                                       service_compare);
-                       service_schedule_changed();
-               }
+       if (need_sort) {
+               service_list_sort();
        }
 }
 
@@ -6574,13 +6846,14 @@ void __connman_service_remove_from_network(struct connman_network *network)
 {
        struct connman_service *service;
 
-       DBG("network %p", network);
-
        service = connman_service_lookup_from_network(network);
-       if (service == NULL)
+
+       DBG("network %p service %p", network, service);
+
+       if (!service)
                return;
 
-       service->ignore = TRUE;
+       service->ignore = true;
 
        __connman_connection_gateway_remove(service,
                                        CONNMAN_IPCONFIG_TYPE_ALL);
@@ -6605,42 +6878,42 @@ __connman_service_create_from_provider(struct connman_provider *provider)
        DBG("provider %p", provider);
 
        ident = __connman_provider_get_ident(provider);
-       if (ident == NULL)
+       if (!ident)
                return NULL;
 
        name = g_strdup_printf("vpn_%s", ident);
        service = service_get(name);
        g_free(name);
 
-       if (service == NULL)
+       if (!service)
                return NULL;
 
        service->type = CONNMAN_SERVICE_TYPE_VPN;
        service->provider = connman_provider_ref(provider);
-       service->autoconnect = FALSE;
-       service->userconnect = TRUE;
+       service->autoconnect = false;
+       service->favorite = true;
 
        service->state_ipv4 = service->state_ipv6 = CONNMAN_SERVICE_STATE_IDLE;
        service->state = combine_state(service->state_ipv4, service->state_ipv6);
 
        str = connman_provider_get_string(provider, "Name");
-       if (str != NULL) {
+       if (str) {
                g_free(service->name);
                service->name = g_strdup(str);
-               service->hidden = FALSE;
+               service->hidden = false;
        } else {
                g_free(service->name);
                service->name = NULL;
-               service->hidden = TRUE;
+               service->hidden = true;
        }
 
        service->strength = 0;
 
-       if (service->ipconfig_ipv4 == NULL)
+       if (!service->ipconfig_ipv4)
                service->ipconfig_ipv4 = create_ip4config(service, index,
                                CONNMAN_IPCONFIG_METHOD_MANUAL);
 
-       if (service->ipconfig_ipv6 == NULL)
+       if (!service->ipconfig_ipv6)
                service->ipconfig_ipv6 = create_ip6config(service, index);
 
        service_register(service);
@@ -6651,7 +6924,7 @@ __connman_service_create_from_provider(struct connman_provider *provider)
        return service;
 }
 
-static void remove_unprovisioned_services()
+static void remove_unprovisioned_services(void)
 {
        gchar **services;
        GKeyFile *keyfile, *configkeyfile;
@@ -6659,29 +6932,29 @@ static void remove_unprovisioned_services()
        int i = 0;
 
        services = connman_storage_get_services();
-       if (services == NULL)
+       if (!services)
                return;
 
-       for (;services[i] != NULL; i++) {
+       for (; services[i]; i++) {
                file = section = NULL;
                keyfile = configkeyfile = NULL;
 
                keyfile = connman_storage_load_service(services[i]);
-               if (keyfile == NULL)
+               if (!keyfile)
                        continue;
 
                file = g_key_file_get_string(keyfile, services[i],
                                        "Config.file", NULL);
-               if (file == NULL)
+               if (!file)
                        goto next;
 
                section = g_key_file_get_string(keyfile, services[i],
                                        "Config.ident", NULL);
-               if (section == NULL)
+               if (!section)
                        goto next;
 
                configkeyfile = __connman_storage_load_config(file);
-               if (configkeyfile == NULL) {
+               if (!configkeyfile) {
                        /*
                         * Config file is missing, remove the provisioned
                         * service.
@@ -6690,7 +6963,7 @@ static void remove_unprovisioned_services()
                        goto next;
                }
 
-               if (g_key_file_has_group(configkeyfile, section) == FALSE)
+               if (!g_key_file_has_group(configkeyfile, section))
                        /*
                         * Config section is missing, remove the provisioned
                         * service.
@@ -6698,10 +6971,10 @@ static void remove_unprovisioned_services()
                        __connman_storage_remove_service(services[i]);
 
        next:
-               if (keyfile != NULL)
+               if (keyfile)
                        g_key_file_free(keyfile);
 
-               if (configkeyfile != NULL)
+               if (configkeyfile)
                        g_key_file_free(configkeyfile);
 
                g_free(section);
@@ -6777,11 +7050,18 @@ void __connman_service_cleanup(void)
 {
        DBG("");
 
+       if (vpn_autoconnect_timeout) {
+               g_source_remove(vpn_autoconnect_timeout);
+               vpn_autoconnect_timeout = 0;
+       }
+
        if (autoconnect_timeout != 0) {
                g_source_remove(autoconnect_timeout);
                autoconnect_timeout = 0;
        }
 
+       connman_agent_driver_unregister(&agent_driver);
+
        g_list_free(service_list);
        service_list = NULL;
 
@@ -6799,7 +7079,5 @@ void __connman_service_cleanup(void)
        }
        g_free(services_notify);
 
-       connman_agent_driver_unregister(&agent_driver);
-
        dbus_connection_unref(connection);
 }
index 6d3827b..00ef369 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
- *  Copyright (C) 2011  BWM CarIT GmbH. All rights reserved.
+ *  Copyright (C) 2007-2014  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2011-2014  BWM CarIT GmbH. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
 
 static DBusConnection *connection;
 static GHashTable *session_hash;
-static connman_bool_t sessionmode;
+static GHashTable *service_hash;
 static struct connman_session *ecall_session;
-static GSList *policy_list;
-
-enum connman_session_trigger {
-       CONNMAN_SESSION_TRIGGER_UNKNOWN         = 0,
-       CONNMAN_SESSION_TRIGGER_SETTING         = 1,
-       CONNMAN_SESSION_TRIGGER_CONNECT         = 2,
-       CONNMAN_SESSION_TRIGGER_DISCONNECT      = 3,
-       CONNMAN_SESSION_TRIGGER_SERVICE         = 4,
-       CONNMAN_SESSION_TRIGGER_ECALL           = 5,
-};
-
-enum connman_session_reason {
-       CONNMAN_SESSION_REASON_UNKNOWN          = 0,
-       CONNMAN_SESSION_REASON_CONNECT          = 1,
-       CONNMAN_SESSION_REASON_FREE_RIDE        = 2,
-};
+static uint32_t session_mark = 256;
+static struct firewall_context *global_firewall = NULL;
 
 enum connman_session_state {
        CONNMAN_SESSION_STATE_DISCONNECTED   = 0,
@@ -59,23 +45,9 @@ enum connman_session_state {
        CONNMAN_SESSION_STATE_ONLINE         = 2,
 };
 
-struct service_entry {
-       struct connman_session *session;
-       /* track why this service was selected */
-       enum connman_session_reason reason;
-       enum connman_service_state state;
-       const char *name;
-       struct connman_service *service;
-       char *ifname;
-       const char *bearer;
-       GSList *pending_timeouts;
-};
-
 struct session_info {
        struct connman_session_config config;
        enum connman_session_state state;
-       struct service_entry *entry;
-       enum connman_session_reason reason;
 };
 
 struct connman_session {
@@ -84,52 +56,41 @@ struct connman_session {
        char *notify_path;
        guint notify_watch;
 
-       struct connman_session_policy *policy;
-
-       connman_bool_t append_all;
+       bool active;
+       bool append_all;
        struct session_info *info;
        struct session_info *info_last;
+       struct connman_service *service;
+       struct connman_service *service_last;
        struct connman_session_config *policy_config;
        GSList *user_allowed_bearers;
 
-       connman_bool_t ecall;
+       bool ecall;
 
-       GList *service_list;
-       GHashTable *service_hash;
+       enum connman_session_id_type id_type;
+       struct firewall_context *fw;
+       uint32_t mark;
+       int index;
+       char *gateway;
+       bool policy_routing;
 };
 
-static const char *trigger2string(enum connman_session_trigger trigger)
-{
-       switch (trigger) {
-       case CONNMAN_SESSION_TRIGGER_UNKNOWN:
-               break;
-       case CONNMAN_SESSION_TRIGGER_SETTING:
-               return "setting";
-       case CONNMAN_SESSION_TRIGGER_CONNECT:
-               return "connect";
-       case CONNMAN_SESSION_TRIGGER_DISCONNECT:
-               return "disconnect";
-       case CONNMAN_SESSION_TRIGGER_SERVICE:
-               return "service";
-       case CONNMAN_SESSION_TRIGGER_ECALL:
-               return "ecall";
-       }
+struct connman_service_info {
+       struct connman_service *service;
+       GSList *sessions;
+};
 
-       return NULL;
-}
+static struct connman_session_policy *policy;
+static void session_activate(struct connman_session *session);
+static void session_deactivate(struct connman_session *session);
+static void update_session_state(struct connman_session *session);
 
-static const char *reason2string(enum connman_session_reason reason)
+static void cleanup_service(gpointer data)
 {
-       switch (reason) {
-       case CONNMAN_SESSION_REASON_UNKNOWN:
-               return "unknown";
-       case CONNMAN_SESSION_REASON_CONNECT:
-               return "connect";
-       case CONNMAN_SESSION_REASON_FREE_RIDE:
-               return "free-ride";
-       }
+       struct connman_service_info *info = data;
 
-       return NULL;
+       g_slist_free(info->sessions);
+       g_free(info);
 }
 
 static const char *state2string(enum connman_session_state state)
@@ -196,14 +157,14 @@ static int bearer2service(const char *bearer, enum connman_service_type *type)
                *type = CONNMAN_SERVICE_TYPE_ETHERNET;
        else if (g_strcmp0(bearer, "wifi") == 0)
                *type = CONNMAN_SERVICE_TYPE_WIFI;
+       else if (g_strcmp0(bearer, "gadget") == 0)
+               *type = CONNMAN_SERVICE_TYPE_GADGET;
        else if (g_strcmp0(bearer, "bluetooth") == 0)
                *type = CONNMAN_SERVICE_TYPE_BLUETOOTH;
        else if (g_strcmp0(bearer, "cellular") == 0)
                *type = CONNMAN_SERVICE_TYPE_CELLULAR;
        else if (g_strcmp0(bearer, "vpn") == 0)
                *type = CONNMAN_SERVICE_TYPE_VPN;
-       else if (g_strcmp0(bearer, "*") == 0)
-               *type = CONNMAN_SERVICE_TYPE_UNKNOWN;
        else
                return -EINVAL;
 
@@ -215,6 +176,8 @@ static char *service2bearer(enum connman_service_type type)
        switch (type) {
        case CONNMAN_SERVICE_TYPE_ETHERNET:
                return "ethernet";
+       case CONNMAN_SERVICE_TYPE_GADGET:
+               return "gadget";
        case CONNMAN_SERVICE_TYPE_WIFI:
                return "wifi";
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
@@ -223,30 +186,220 @@ static char *service2bearer(enum connman_service_type type)
                return "cellular";
        case CONNMAN_SERVICE_TYPE_VPN:
                return "vpn";
-       case CONNMAN_SERVICE_TYPE_UNKNOWN:
-               return "*";
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
+       case CONNMAN_SERVICE_TYPE_UNKNOWN:
                return "";
        }
 
        return "";
 }
 
+static int init_firewall(void)
+{
+       struct firewall_context *fw;
+       int err;
+
+       if (global_firewall)
+               return 0;
+
+       fw = __connman_firewall_create();
+
+       err = __connman_firewall_add_rule(fw, "mangle", "INPUT",
+                                       "-j CONNMARK --restore-mark");
+       if (err < 0)
+               goto err;
+
+       err = __connman_firewall_add_rule(fw, "mangle", "POSTROUTING",
+                                       "-j CONNMARK --save-mark");
+       if (err < 0)
+               goto err;
+
+       err = __connman_firewall_enable(fw);
+       if (err < 0)
+               goto err;
+
+       global_firewall = fw;
+
+       return 0;
+
+err:
+       __connman_firewall_destroy(fw);
+
+       return err;
+}
+
+static void cleanup_firewall(void)
+{
+       if (!global_firewall)
+               return;
+
+       __connman_firewall_disable(global_firewall);
+       __connman_firewall_destroy(global_firewall);
+}
+
+static int init_firewall_session(struct connman_session *session)
+{
+       struct firewall_context *fw;
+       int err;
+
+       if (session->policy_config->id_type == CONNMAN_SESSION_ID_TYPE_UNKNOWN)
+               return 0;
+
+       DBG("");
+
+       err = init_firewall();
+       if (err < 0)
+               return err;
+
+       fw = __connman_firewall_create();
+       if (!fw)
+               return -ENOMEM;
+
+       switch (session->policy_config->id_type) {
+       case CONNMAN_SESSION_ID_TYPE_UID:
+               err = __connman_firewall_add_rule(fw, "mangle", "OUTPUT",
+                               "-m owner --uid-owner %s -j MARK --set-mark %d",
+                                               session->policy_config->id,
+                                               session->mark);
+               break;
+       case CONNMAN_SESSION_ID_TYPE_GID:
+               err = __connman_firewall_add_rule(fw, "mangle", "OUTPUT",
+                               "-m owner --gid-owner %s -j MARK --set-mark %d",
+                                               session->policy_config->id,
+                                               session->mark);
+               break;
+       case CONNMAN_SESSION_ID_TYPE_LSM:
+       default:
+               err = -EINVAL;
+       }
+
+       if (err < 0)
+               goto err;
+
+       session->id_type = session->policy_config->id_type;
+
+       err = __connman_firewall_enable(fw);
+       if (err)
+               goto err;
+
+       session->fw = fw;
+
+       return 0;
+
+err:
+       __connman_firewall_destroy(fw);
+
+       return err;
+}
+
+static void cleanup_firewall_session(struct connman_session *session)
+{
+       if (!session->fw)
+               return;
+
+       __connman_firewall_disable(session->fw);
+       __connman_firewall_destroy(session->fw);
+
+       session->fw = NULL;
+}
+
+static int init_routing_table(struct connman_session *session)
+{
+       int err;
+
+       if (session->policy_config->id_type == CONNMAN_SESSION_ID_TYPE_UNKNOWN)
+               return 0;
+
+       DBG("");
+
+       err = __connman_inet_add_fwmark_rule(session->mark,
+                                               AF_INET, session->mark);
+       if (err < 0)
+               return err;
+
+       err = __connman_inet_add_fwmark_rule(session->mark,
+                                               AF_INET6, session->mark);
+       if (err < 0)
+               __connman_inet_del_fwmark_rule(session->mark,
+                                               AF_INET, session->mark);
+       session->policy_routing = true;
+
+       return err;
+}
+
+static void del_default_route(struct connman_session *session)
+{
+       if (!session->gateway)
+               return;
+
+       DBG("index %d routing table %d default gateway %s",
+               session->index, session->mark, session->gateway);
+
+       __connman_inet_del_default_from_table(session->mark,
+                                       session->index, session->gateway);
+       g_free(session->gateway);
+       session->gateway = NULL;
+       session->index = -1;
+}
+
+static void add_default_route(struct connman_session *session)
+{
+       struct connman_ipconfig *ipconfig;
+       int err;
+
+       if (!session->service)
+               return;
+
+       ipconfig = __connman_service_get_ip4config(session->service);
+       session->index = __connman_ipconfig_get_index(ipconfig);
+       session->gateway = g_strdup(__connman_ipconfig_get_gateway(ipconfig));
+
+       DBG("index %d routing table %d default gateway %s",
+               session->index, session->mark, session->gateway);
+
+       err = __connman_inet_add_default_to_table(session->mark,
+                                       session->index, session->gateway);
+       if (err < 0)
+               DBG("session %p %s", session, strerror(-err));
+}
+
+static void cleanup_routing_table(struct connman_session *session)
+{
+       DBG("");
+
+       if (session->policy_routing) {
+               __connman_inet_del_fwmark_rule(session->mark,
+                                       AF_INET6, session->mark);
+
+               __connman_inet_del_fwmark_rule(session->mark,
+                                       AF_INET, session->mark);
+               session->policy_routing = false;
+       }
+
+       del_default_route(session);
+}
+
+static void update_routing_table(struct connman_session *session)
+{
+       del_default_route(session);
+       add_default_route(session);
+}
+
 static void destroy_policy_config(struct connman_session *session)
 {
-       if (session->policy == NULL) {
+       if (!policy) {
                g_free(session->policy_config);
                return;
        }
 
-       (*session->policy->destroy)(session);
+       policy->destroy(session);
 }
 
 static void free_session(struct connman_session *session)
 {
-       if (session == NULL)
+       if (!session)
                return;
 
        if (session->notify_watch > 0)
@@ -259,158 +412,123 @@ static void free_session(struct connman_session *session)
        g_free(session->notify_path);
        g_free(session->info);
        g_free(session->info_last);
+       g_free(session->gateway);
 
        g_free(session);
 }
 
+static void set_active_session(struct connman_session *session, bool enable)
+{
+
+       if (policy && policy->session_changed)
+               policy->session_changed(session, enable,
+                                       session->info->config.allowed_bearers);
+
+       __connman_service_set_active_session(enable,
+                               session->info->config.allowed_bearers);
+}
+
 static void cleanup_session(gpointer user_data)
 {
        struct connman_session *session = user_data;
-       struct session_info *info = session->info;
 
        DBG("remove %s", session->session_path);
 
-       g_slist_free(session->user_allowed_bearers);
-       if (session->service_hash != NULL)
-               g_hash_table_destroy(session->service_hash);
-       g_list_free(session->service_list);
-
-       if (info->entry != NULL &&
-                       info->entry->reason == CONNMAN_SESSION_REASON_CONNECT) {
-               __connman_service_disconnect(info->entry->service);
-       }
-
-       free_session(session);
-}
+       cleanup_routing_table(session);
+       cleanup_firewall_session(session);
 
-static int assign_policy_plugin(struct connman_session *session)
-{
-       if (session->policy != NULL)
-               return -EALREADY;
+       if (session->active)
+               set_active_session(session, false);
 
-       if (policy_list == NULL)
-               return 0;
+       session_deactivate(session);
+       update_session_state(session);
 
-       session->policy = policy_list->data;
+       g_slist_free(session->user_allowed_bearers);
 
-       return 0;
+       free_session(session);
 }
 
-struct user_config {
+struct creation_data {
        DBusMessage *pending;
+       struct connman_session *session;
 
+       /* user config */
        enum connman_session_type type;
        GSList *allowed_bearers;
 };
 
-static void cleanup_user_config(struct user_config *user_config)
+static void cleanup_creation_data(struct creation_data *creation_data)
 {
-       if (user_config == NULL)
+       if (!creation_data)
                return;
 
-       if (user_config->pending != NULL)
-               dbus_message_unref(user_config->pending);
+       if (creation_data->pending)
+               dbus_message_unref(creation_data->pending);
 
-       g_slist_free(user_config->allowed_bearers);
-       g_free(user_config);
+       g_slist_free(creation_data->allowed_bearers);
+       g_free(creation_data);
 }
 
 static int create_policy_config(struct connman_session *session,
                                connman_session_config_func_t cb,
-                               struct user_config *user_config)
+                               struct creation_data *creation_data)
 {
        struct connman_session_config *config;
 
-       if (session->policy == NULL) {
+       if (!policy) {
                config = connman_session_create_default_config();
-               if (config == NULL) {
+               if (!config) {
                        free_session(session);
-                       cleanup_user_config(user_config);
+                       cleanup_creation_data(creation_data);
                        return -ENOMEM;
                }
 
-               return cb(session, config, user_config, 0);
+               return cb(session, config, creation_data, 0);
        }
 
-       return (*session->policy->create)(session, cb, user_config);
+       return policy->create(session, cb, creation_data);
 }
 
-static void probe_policy(struct connman_session_policy *policy)
+int connman_session_policy_register(struct connman_session_policy *plugin)
 {
+       if (policy)
+               return -EINVAL;
 
-       GHashTableIter iter;
-       gpointer key, value;
-       struct connman_session *session;
-
-       DBG("policy %p name %s", policy, policy->name);
-
-       g_hash_table_iter_init(&iter, session_hash);
+       if (!plugin->create || !plugin->destroy)
+               return -EINVAL;
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               session = value;
+       DBG("name %s", plugin->name);
 
-               if (session->policy != NULL)
-                       continue;
+       policy = plugin;
 
-               assign_policy_plugin(session);
-       }
+       return 0;
 }
 
-static void remove_policy(struct connman_session_policy *policy)
+void connman_session_policy_unregister(struct connman_session_policy *plugin)
 {
-       GHashTableIter iter;
-       gpointer key, value;
-       struct connman_session *session;
-
-       if (session_hash == NULL)
+       if (plugin != policy)
                return;
 
-       DBG("policy %p name %s", policy, policy->name);
-
-       g_hash_table_iter_init(&iter, session_hash);
-
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               session = value;
-
-               if (session->policy != policy)
-                       continue;
-
-               session->policy = NULL;
-               assign_policy_plugin(session);
-       }
-}
-
-static gint compare_priority(gconstpointer a, gconstpointer b)
-{
-       const struct connman_session_policy *policy1 = a;
-       const struct connman_session_policy *policy2 = b;
-
-       return policy2->priority - policy1->priority;
-}
-
-
-int connman_session_policy_register(struct connman_session_policy *policy)
-{
        DBG("name %s", policy->name);
 
-       if (policy->create == NULL || policy->destroy == NULL)
-               return -EINVAL;
-
-       policy_list = g_slist_insert_sorted(policy_list, policy,
-                                               compare_priority);
-
-       probe_policy(policy);
-
-       return 0;
+       policy = NULL;
 }
 
-void connman_session_policy_unregister(struct connman_session_policy *policy)
-{
-       DBG("name %s", policy->name);
+static int default_bearers[] = {
+       CONNMAN_SERVICE_TYPE_ETHERNET,
+       CONNMAN_SERVICE_TYPE_WIFI,
+       CONNMAN_SERVICE_TYPE_BLUETOOTH,
+       CONNMAN_SERVICE_TYPE_CELLULAR,
+       CONNMAN_SERVICE_TYPE_GADGET,
+};
 
-       policy_list = g_slist_remove(policy_list, policy);
+static void add_default_bearer_types(GSList **list)
+{
+       unsigned int i;
 
-       remove_policy(policy);
+       for (i = 0; i < G_N_ELEMENTS(default_bearers); i++)
+               *list = g_slist_append(*list,
+                               GINT_TO_POINTER(default_bearers[i]));
 }
 
 void connman_session_set_default_config(struct connman_session_config *config)
@@ -425,8 +543,7 @@ void connman_session_set_default_config(struct connman_session_config *config)
        config->ecall = FALSE;
 
        g_slist_free(config->allowed_bearers);
-       config->allowed_bearers = g_slist_prepend(NULL,
-                               GINT_TO_POINTER(CONNMAN_SERVICE_TYPE_UNKNOWN));
+       add_default_bearer_types(&config->allowed_bearers);
 }
 
 struct connman_session_config *connman_session_create_default_config(void)
@@ -463,6 +580,11 @@ int connman_session_parse_bearers(const char *token, GSList **list)
        if (g_strcmp0(token, "") == 0)
                return 0;
 
+       if (g_strcmp0(token, "*") == 0) {
+               add_default_bearer_types(list);
+               return 0;
+       }
+
        err = bearer2service(token, &bearer);
        if (err < 0)
                return err;
@@ -506,58 +628,40 @@ static int parse_bearers(DBusMessageIter *iter, GSList **list)
        return 0;
 }
 
-static int filter_bearer(GSList *policy_bearers,
+static void filter_bearer(GSList *policy_bearers,
                                enum connman_service_type bearer,
                                GSList **list)
 {
        enum connman_service_type policy;
        GSList *it;
 
-       if (policy_bearers == NULL)
-               return 0;
+       if (!policy_bearers)
+               return;
 
-       for (it = policy_bearers; it != NULL; it = it->next) {
+       for (it = policy_bearers; it; it = it->next) {
                policy = GPOINTER_TO_INT(it->data);
 
-               if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) {
-                       bearer = policy;
-                       goto clone;
-               }
-
-               if (policy != CONNMAN_SERVICE_TYPE_UNKNOWN && policy != bearer)
+               if (policy != bearer)
                        continue;
 
-               goto clone;
+               *list = g_slist_append(*list, GINT_TO_POINTER(bearer));
+               return;
        }
-
-       *list = NULL;
-
-       return 0;
-
-clone:
-       *list = g_slist_append(*list, GINT_TO_POINTER(bearer));
-
-       return 0;
 }
 
-static int apply_policy_on_bearers(GSList *policy_bearers, GSList *bearers,
+static void apply_policy_on_bearers(GSList *policy_bearers, GSList *bearers,
                                GSList **list)
 {
        enum connman_service_type bearer;
        GSList *it;
-       int err;
 
        *list = NULL;
 
-       for (it = bearers; it != NULL; it = it->next) {
+       for (it = bearers; it; it = it->next) {
                bearer = GPOINTER_TO_INT(it->data);
 
-               err = filter_bearer(policy_bearers, bearer, list);
-               if (err < 0)
-                       return err;
+               filter_bearer(policy_bearers, bearer, list);
        }
-
-       return 0;
 }
 
 const char *connman_session_get_owner(struct connman_session *session)
@@ -571,12 +675,12 @@ static void append_allowed_bearers(DBusMessageIter *iter, void *user_data)
        GSList *list;
 
        for (list = info->config.allowed_bearers;
-                       list != NULL; list = list->next) {
+                       list; list = list->next) {
                enum connman_service_type bearer = GPOINTER_TO_INT(list->data);
                const char *name = __connman_service_type2string(bearer);
 
-               if (name == NULL)
-                       name = "*";
+               if (!name)
+                       name = "";
 
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
                                                &name);
@@ -588,16 +692,15 @@ static void append_ipconfig_ipv4(DBusMessageIter *iter, void *user_data)
        struct connman_service *service = user_data;
        struct connman_ipconfig *ipconfig_ipv4;
 
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (__connman_service_is_connected_state(service,
-                               CONNMAN_IPCONFIG_TYPE_IPV4) == FALSE) {
+       if (!__connman_service_is_connected_state(service,
+                                               CONNMAN_IPCONFIG_TYPE_IPV4))
                return;
-       }
 
        ipconfig_ipv4 = __connman_service_get_ip4config(service);
-       if (ipconfig_ipv4 == NULL)
+       if (!ipconfig_ipv4)
                return;
 
        __connman_ipconfig_append_ipv4(ipconfig_ipv4, iter);
@@ -608,17 +711,16 @@ static void append_ipconfig_ipv6(DBusMessageIter *iter, void *user_data)
        struct connman_service *service = user_data;
        struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
 
-       if (service == NULL)
+       if (!service)
                return;
 
-       if (__connman_service_is_connected_state(service,
-                               CONNMAN_IPCONFIG_TYPE_IPV6) == FALSE) {
+       if (!__connman_service_is_connected_state(service,
+                                               CONNMAN_IPCONFIG_TYPE_IPV6))
                return;
-       }
 
        ipconfig_ipv4 = __connman_service_get_ip4config(service);
        ipconfig_ipv6 = __connman_service_get_ip6config(service);
-       if (ipconfig_ipv6 == NULL)
+       if (!ipconfig_ipv6)
                return;
 
        __connman_ipconfig_append_ipv6(ipconfig_ipv6, iter, ipconfig_ipv4);
@@ -630,10 +732,12 @@ static void append_notify(DBusMessageIter *dict,
        struct session_info *info = session->info;
        struct session_info *info_last = session->info_last;
        struct connman_service *service;
-       const char *name, *ifname, *bearer;
+       enum connman_service_type type;
+       const char *name, *bearer;
+       char *ifname;
+       int idx;
 
-       if (session->append_all == TRUE ||
-                       info->state != info_last->state) {
+       if (session->append_all || info->state != info_last->state) {
                const char *state = state2string(info->state);
 
                connman_dbus_dict_append_basic(dict, "State",
@@ -642,18 +746,23 @@ static void append_notify(DBusMessageIter *dict,
                info_last->state = info->state;
        }
 
-       if (session->append_all == TRUE ||
-                       info->entry != info_last->entry) {
-               if (info->entry == NULL) {
-                       name = "";
-                       ifname = "";
+       if (session->append_all || session->service != session->service_last) {
+               if (session->service) {
+                       service = session->service;
+                       name = __connman_service_get_name(service);
+                       idx = __connman_service_get_index(service);
+
+                       ifname = connman_inet_ifname(idx);
+                       if (!ifname)
+                               ifname = g_strdup("");
+
+                       type = connman_service_get_type(service);
+                       bearer = service2bearer(type);
+               } else {
                        service = NULL;
+                       name = "";
+                       ifname = g_strdup("");
                        bearer = "";
-               } else {
-                       name = info->entry->name;
-                       ifname = info->entry->ifname;
-                       service = info->entry->service;
-                       bearer = info->entry->bearer;
                }
 
                connman_dbus_dict_append_basic(dict, "Name",
@@ -672,758 +781,101 @@ static void append_notify(DBusMessageIter *dict,
                                                DBUS_TYPE_STRING,
                                                &ifname);
 
-               connman_dbus_dict_append_basic(dict, "Bearer",
-                                               DBUS_TYPE_STRING,
-                                               &bearer);
-
-               info_last->entry = info->entry;
-       }
-
-       if (session->append_all == TRUE ||
-                       info->config.type != info_last->config.type) {
-               const char *type = type2string(info->config.type);
-
-               connman_dbus_dict_append_basic(dict, "ConnectionType",
-                                               DBUS_TYPE_STRING,
-                                               &type);
-               info_last->config.type = info->config.type;
-       }
-
-       if (session->append_all == TRUE ||
-                       info->config.allowed_bearers != info_last->config.allowed_bearers) {
-               connman_dbus_dict_append_array(dict, "AllowedBearers",
-                                               DBUS_TYPE_STRING,
-                                               append_allowed_bearers,
-                                               info);
-               info_last->config.allowed_bearers = info->config.allowed_bearers;
-       }
-
-       session->append_all = FALSE;
-}
-
-static connman_bool_t is_type_matching_state(enum connman_session_state *state,
-                                               enum connman_session_type type)
-{
-       switch (type) {
-       case CONNMAN_SESSION_TYPE_UNKNOWN:
-               return FALSE;
-       case CONNMAN_SESSION_TYPE_ANY:
-               return TRUE;
-       case CONNMAN_SESSION_TYPE_LOCAL:
-               if (*state >= CONNMAN_SESSION_STATE_CONNECTED) {
-                       *state = CONNMAN_SESSION_STATE_CONNECTED;
-                       return TRUE;
-               }
-
-               break;
-       case CONNMAN_SESSION_TYPE_INTERNET:
-               if (*state == CONNMAN_SESSION_STATE_ONLINE)
-                       return TRUE;
-               break;
-       }
-
-       return FALSE;
-}
-
-static connman_bool_t compute_notifiable_changes(struct connman_session *session)
-{
-       struct session_info *info_last = session->info_last;
-       struct session_info *info = session->info;
-
-       if (session->append_all == TRUE)
-               return TRUE;
-
-       if (info->state != info_last->state)
-               return TRUE;
-
-       if (info->entry != info_last->entry &&
-                       info->state >= CONNMAN_SESSION_STATE_CONNECTED)
-               return TRUE;
-
-       if (info->config.allowed_bearers != info_last->config.allowed_bearers ||
-                       info->config.type != info_last->config.type)
-               return TRUE;
-
-       return FALSE;
-}
-
-static gboolean session_notify(gpointer user_data)
-{
-       struct connman_session *session = user_data;
-       DBusMessage *msg;
-       DBusMessageIter array, dict;
-
-       if (compute_notifiable_changes(session) == FALSE)
-               return FALSE;
-
-       DBG("session %p owner %s notify_path %s", session,
-               session->owner, session->notify_path);
-
-       msg = dbus_message_new_method_call(session->owner, session->notify_path,
-                                               CONNMAN_NOTIFICATION_INTERFACE,
-                                               "Update");
-       if (msg == NULL)
-               return FALSE;
-
-       dbus_message_iter_init_append(msg, &array);
-       connman_dbus_dict_open(&array, &dict);
-
-       append_notify(&dict, session);
-
-       connman_dbus_dict_close(&array, &dict);
-
-       g_dbus_send_message(connection, msg);
-
-       return FALSE;
-}
-
-static void ipconfig_ipv4_changed(struct connman_session *session)
-{
-       struct session_info *info = session->info;
-
-       connman_dbus_setting_changed_dict(session->owner, session->notify_path,
-                                               "IPv4", append_ipconfig_ipv4,
-                                               info->entry->service);
-}
-
-static void ipconfig_ipv6_changed(struct connman_session *session)
-{
-       struct session_info *info = session->info;
-
-       connman_dbus_setting_changed_dict(session->owner, session->notify_path,
-                                               "IPv6", append_ipconfig_ipv6,
-                                               info->entry->service);
-}
-
-static connman_bool_t service_type_match(struct connman_session *session,
-                                       struct connman_service *service)
-{
-       struct session_info *info = session->info;
-       GSList *list;
-
-       for (list = info->config.allowed_bearers;
-                       list != NULL; list = list->next) {
-               enum connman_service_type bearer = GPOINTER_TO_INT(list->data);
-               enum connman_service_type service_type;
-
-               if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN)
-                       return TRUE;
-
-               service_type = connman_service_get_type(service);
-               if (bearer == service_type)
-                       return TRUE;
-       }
-
-       return FALSE;
-}
-
-static connman_bool_t service_match(struct connman_session *session,
-                                       struct connman_service *service)
-{
-       if (service_type_match(session, service) == FALSE)
-               return FALSE;
-
-       return TRUE;
-}
-
-static int service_type_weight(enum connman_service_type type)
-{
-       /*
-        * The session doesn't care which service
-        * to use. Nevertheless we have to sort them
-        * according their type. The ordering is
-        *
-        * 1. Ethernet
-        * 2. Bluetooth
-        * 3. WiFi
-        * 4. Cellular
-        */
-
-       switch (type) {
-       case CONNMAN_SERVICE_TYPE_ETHERNET:
-               return 4;
-       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
-               return 3;
-       case CONNMAN_SERVICE_TYPE_WIFI:
-               return 2;
-       case CONNMAN_SERVICE_TYPE_CELLULAR:
-               return 1;
-       case CONNMAN_SERVICE_TYPE_UNKNOWN:
-       case CONNMAN_SERVICE_TYPE_SYSTEM:
-       case CONNMAN_SERVICE_TYPE_GPS:
-       case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
-               break;
-       }
-
-       return 0;
-}
-
-static gint sort_allowed_bearers(struct connman_service *service_a,
-                                       struct connman_service *service_b,
-                                       struct connman_session *session)
-{
-       struct session_info *info = session->info;
-       GSList *list;
-       enum connman_service_type type_a, type_b;
-       int weight_a, weight_b;
-
-       type_a = connman_service_get_type(service_a);
-       type_b = connman_service_get_type(service_b);
-
-       for (list = info->config.allowed_bearers;
-                       list != NULL; list = list->next) {
-               enum connman_service_type bearer = GPOINTER_TO_INT(list->data);
-
-               if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) {
-                       if (type_a != type_b) {
-                               weight_a = service_type_weight(type_a);
-                               weight_b = service_type_weight(type_b);
-
-                               if (weight_a > weight_b)
-                                       return -1;
-
-                               if (weight_a < weight_b)
-                                       return 1;
-
-                               return 0;
-                       }
-               }
-
-               if (type_a == bearer && type_b == bearer)
-                       return 0;
-
-               if (type_a == bearer && type_b != bearer)
-                       return -1;
-
-               if (type_a != bearer && type_b == bearer)
-                       return 1;
-       }
-
-       return 0;
-}
-
-static gint sort_services(gconstpointer a, gconstpointer b, gpointer user_data)
-{
-       struct service_entry *entry_a = (void *)a;
-       struct service_entry *entry_b = (void *)b;
-       struct connman_session *session = user_data;
-
-       return sort_allowed_bearers(entry_a->service, entry_b->service,
-                               session);
-}
-
-static enum connman_session_state service_to_session_state(enum connman_service_state state)
-{
-       switch (state) {
-       case CONNMAN_SERVICE_STATE_UNKNOWN:
-       case CONNMAN_SERVICE_STATE_IDLE:
-       case CONNMAN_SERVICE_STATE_ASSOCIATION:
-       case CONNMAN_SERVICE_STATE_CONFIGURATION:
-       case CONNMAN_SERVICE_STATE_DISCONNECT:
-       case CONNMAN_SERVICE_STATE_FAILURE:
-               break;
-       case CONNMAN_SERVICE_STATE_READY:
-               return CONNMAN_SESSION_STATE_CONNECTED;
-       case CONNMAN_SERVICE_STATE_ONLINE:
-               return CONNMAN_SESSION_STATE_ONLINE;
-       }
-
-       return CONNMAN_SESSION_STATE_DISCONNECTED;
-}
-
-static connman_bool_t is_connected(enum connman_service_state state)
-{
-       switch (state) {
-       case CONNMAN_SERVICE_STATE_UNKNOWN:
-       case CONNMAN_SERVICE_STATE_IDLE:
-       case CONNMAN_SERVICE_STATE_ASSOCIATION:
-       case CONNMAN_SERVICE_STATE_CONFIGURATION:
-       case CONNMAN_SERVICE_STATE_DISCONNECT:
-       case CONNMAN_SERVICE_STATE_FAILURE:
-               break;
-       case CONNMAN_SERVICE_STATE_READY:
-       case CONNMAN_SERVICE_STATE_ONLINE:
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
-static connman_bool_t is_connecting(enum connman_service_state state)
-{
-       switch (state) {
-       case CONNMAN_SERVICE_STATE_UNKNOWN:
-       case CONNMAN_SERVICE_STATE_IDLE:
-               break;
-       case CONNMAN_SERVICE_STATE_ASSOCIATION:
-       case CONNMAN_SERVICE_STATE_CONFIGURATION:
-               return TRUE;
-       case CONNMAN_SERVICE_STATE_DISCONNECT:
-       case CONNMAN_SERVICE_STATE_FAILURE:
-       case CONNMAN_SERVICE_STATE_READY:
-       case CONNMAN_SERVICE_STATE_ONLINE:
-               break;
-       }
-
-       return FALSE;
-}
-
-static connman_bool_t explicit_connect(enum connman_session_reason reason)
-{
-       switch (reason) {
-       case CONNMAN_SESSION_REASON_UNKNOWN:
-       case CONNMAN_SESSION_REASON_FREE_RIDE:
-               break;
-       case CONNMAN_SESSION_REASON_CONNECT:
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
-static connman_bool_t explicit_disconnect(struct session_info *info)
-{
-       if (info->entry == NULL)
-               return FALSE;
-
-       DBG("reason %s service %p state %d",
-               reason2string(info->entry->reason),
-               info->entry->service, info->entry->state);
-
-       if (info->entry->reason == CONNMAN_SESSION_REASON_UNKNOWN)
-               return FALSE;
-
-       if (explicit_connect(info->entry->reason) == FALSE)
-               return FALSE;
-
-       if (__connman_service_session_dec(info->entry->service) == FALSE)
-               return FALSE;
-
-       return TRUE;
-}
-
-struct pending_data {
-       unsigned int timeout;
-       struct service_entry *entry;
-       gboolean (*cb)(gpointer);
-};
-
-static void pending_timeout_free(gpointer data, gpointer user_data)
-{
-       struct pending_data *pending = data;
-
-       DBG("pending %p timeout %d", pending, pending->timeout);
-       g_source_remove(pending->timeout);
-       g_free(pending);
-}
-
-static void pending_timeout_remove_all(struct service_entry *entry)
-{
-       DBG("");
-
-       g_slist_foreach(entry->pending_timeouts, pending_timeout_free, NULL);
-       g_slist_free(entry->pending_timeouts);
-       entry->pending_timeouts = NULL;
-}
-
-static gboolean pending_timeout_cb(gpointer data)
-{
-       struct pending_data *pending = data;
-       struct service_entry *entry = pending->entry;
-       gboolean ret;
-
-       DBG("pending %p timeout %d", pending, pending->timeout);
-
-       ret = pending->cb(pending->entry);
-       if (ret == FALSE) {
-               entry->pending_timeouts =
-                       g_slist_remove(entry->pending_timeouts,
-                                       pending);
-               g_free(pending);
-       }
-       return ret;
-}
-
-static connman_bool_t pending_timeout_add(unsigned int seconds,
-                                       gboolean (*cb)(gpointer),
-                                       struct service_entry *entry)
-{
-       struct pending_data *pending = g_try_new0(struct pending_data, 1);
-
-       if (pending == NULL || cb == NULL || entry == NULL) {
-               g_free(pending);
-               return FALSE;
-       }
-
-       pending->cb = cb;
-       pending->entry = entry;
-       pending->timeout = g_timeout_add_seconds(seconds, pending_timeout_cb,
-                                               pending);
-       entry->pending_timeouts = g_slist_prepend(entry->pending_timeouts,
-                                               pending);
-
-       DBG("pending %p entry %p timeout id %d", pending, entry,
-               pending->timeout);
-
-       return TRUE;
-}
-
-static gboolean call_disconnect(gpointer user_data)
-{
-       struct service_entry *entry = user_data;
-       struct connman_service *service = entry->service;
-
-       /*
-        * TODO: We should mark this entry as pending work. In case
-        * disconnect fails we just unassign this session from the
-        * service and can't do anything later on it
-        */
-       DBG("disconnect service %p", service);
-       __connman_service_disconnect(service);
-
-       return FALSE;
-}
-
-static gboolean call_connect(gpointer user_data)
-{
-       struct service_entry *entry = user_data;
-       struct connman_service *service = entry->service;
-
-       DBG("connect service %p", service);
-       __connman_service_connect(service);
-
-       return FALSE;
-}
-
-static void deselect_service(struct session_info *info)
-{
-       struct service_entry *entry;
-       connman_bool_t disconnect, connected;
-
-       DBG("");
-
-       if (info->entry == NULL)
-               return;
-
-       disconnect = explicit_disconnect(info);
-
-       connected = is_connecting(info->entry->state) == TRUE ||
-                       is_connected(info->entry->state) == TRUE;
-
-       info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
-       info->entry->reason = CONNMAN_SESSION_REASON_UNKNOWN;
-
-       entry = info->entry;
-       info->entry = NULL;
-
-       DBG("disconnect %d connected %d", disconnect, connected);
-
-       if (disconnect == TRUE && connected == TRUE)
-               pending_timeout_add(0, call_disconnect, entry);
-}
-
-static void deselect_and_disconnect(struct connman_session *session)
-{
-       struct session_info *info = session->info;
-
-       deselect_service(info);
-
-       info->reason = CONNMAN_SESSION_REASON_FREE_RIDE;
-}
-
-static void select_connected_service(struct session_info *info,
-                                       struct service_entry *entry)
-{
-       enum connman_session_state state;
-
-       state = service_to_session_state(entry->state);
-       if (is_type_matching_state(&state, info->config.type) == FALSE)
-               return;
-
-       info->state = state;
-
-       info->entry = entry;
-       info->entry->reason = info->reason;
-
-       if (explicit_connect(info->reason) == FALSE)
-               return;
-
-       __connman_service_session_inc(info->entry->service);
-}
-
-static void select_offline_service(struct session_info *info,
-                                       struct service_entry *entry)
-{
-       if (explicit_connect(info->reason) == FALSE)
-               return;
-
-       info->state = service_to_session_state(entry->state);
-
-       info->entry = entry;
-       info->entry->reason = info->reason;
-
-       __connman_service_session_inc(info->entry->service);
-       pending_timeout_add(0, call_connect, entry);
-}
-
-static void select_service(struct session_info *info,
-                               struct service_entry *entry)
-{
-       DBG("service %p", entry->service);
-
-       if (is_connected(entry->state) == TRUE)
-               select_connected_service(info, entry);
-       else
-               select_offline_service(info, entry);
-}
-
-static void select_and_connect(struct connman_session *session,
-                               enum connman_session_reason reason)
-{
-       struct session_info *info = session->info;
-       struct service_entry *entry = NULL;
-       GList *list;
-
-       DBG("session %p reason %s", session, reason2string(reason));
-
-       info->reason = reason;
-
-       for (list = session->service_list; list != NULL; list = list->next) {
-               entry = list->data;
-
-               switch (entry->state) {
-               case CONNMAN_SERVICE_STATE_ASSOCIATION:
-               case CONNMAN_SERVICE_STATE_CONFIGURATION:
-               case CONNMAN_SERVICE_STATE_READY:
-               case CONNMAN_SERVICE_STATE_ONLINE:
-               case CONNMAN_SERVICE_STATE_IDLE:
-               case CONNMAN_SERVICE_STATE_DISCONNECT:
-                       select_service(info, entry);
-                       return;
-               case CONNMAN_SERVICE_STATE_UNKNOWN:
-               case CONNMAN_SERVICE_STATE_FAILURE:
-                       break;
-               }
-       }
-}
-
-static struct service_entry *create_service_entry(struct connman_session * session,
-                                       struct connman_service *service,
-                                       const char *name,
-                                       enum connman_service_state state)
-{
-       struct service_entry *entry;
-       enum connman_service_type type;
-       int idx;
-
-       entry = g_try_new0(struct service_entry, 1);
-       if (entry == NULL)
-               return entry;
-
-       entry->reason = CONNMAN_SESSION_REASON_UNKNOWN;
-       entry->state = state;
-       if (name != NULL)
-               entry->name = name;
-       else
-               entry->name = "";
-       entry->service = service;
-
-       idx = __connman_service_get_index(entry->service);
-       entry->ifname = connman_inet_ifname(idx);
-       if (entry->ifname == NULL)
-               entry->ifname = g_strdup("");
-
-       type = connman_service_get_type(entry->service);
-       entry->bearer = service2bearer(type);
-
-       entry->session = session;
-
-       return entry;
-}
-
-static void iterate_service_cb(struct connman_service *service,
-                               const char *name,
-                               enum connman_service_state state,
-                               void *user_data)
-{
-       struct connman_session *session = user_data;
-       struct service_entry *entry;
-
-       if (service_match(session, service) == FALSE)
-               return;
-
-       entry = create_service_entry(session, service, name, state);
-       if (entry == NULL)
-               return;
-
-       g_hash_table_replace(session->service_hash, service, entry);
-}
-
-static void destroy_service_entry(gpointer data)
-{
-       struct service_entry *entry = data;
-       struct session_info *info = entry->session->info;
-       struct connman_session *session;
-
-       if (info != NULL && info->entry == entry) {
-               session = entry->session;
-               deselect_and_disconnect(session);
-       }
-
-       pending_timeout_remove_all(entry);
-       g_free(entry->ifname);
-
-       g_free(entry);
-}
+               connman_dbus_dict_append_basic(dict, "Bearer",
+                                               DBUS_TYPE_STRING,
+                                               &bearer);
 
-static void populate_service_list(struct connman_session *session)
-{
-       GHashTableIter iter;
-       gpointer key, value;
+               g_free(ifname);
 
-       session->service_hash =
-               g_hash_table_new_full(g_direct_hash, g_direct_equal,
-                                       NULL, destroy_service_entry);
-       __connman_service_iterate_services(iterate_service_cb, session);
+               session->service_last = session->service;
+       }
 
-       g_hash_table_iter_init(&iter, session->service_hash);
+       if (session->append_all ||
+                       info->config.type != info_last->config.type) {
+               const char *type = type2string(info->config.type);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               struct service_entry *entry = value;
+               connman_dbus_dict_append_basic(dict, "ConnectionType",
+                                               DBUS_TYPE_STRING,
+                                               &type);
+               info_last->config.type = info->config.type;
+       }
 
-               DBG("service %p type %s name %s", entry->service,
-                       service2bearer(connman_service_get_type(entry->service)),
-                       entry->name);
-               session->service_list = g_list_prepend(session->service_list,
-                                                       entry);
+       if (session->append_all ||
+                       info->config.allowed_bearers != info_last->config.allowed_bearers) {
+               connman_dbus_dict_append_array(dict, "AllowedBearers",
+                                               DBUS_TYPE_STRING,
+                                               append_allowed_bearers,
+                                               info);
+               info_last->config.allowed_bearers = info->config.allowed_bearers;
        }
 
-       session->service_list = g_list_sort_with_data(session->service_list,
-                                               sort_services, session);
+       session->append_all = false;
 }
 
-static void session_changed(struct connman_session *session,
-                               enum connman_session_trigger trigger)
+static bool compute_notifiable_changes(struct connman_session *session)
 {
-       struct session_info *info = session->info;
        struct session_info *info_last = session->info_last;
-       struct connman_service *service;
-       struct service_entry *entry = NULL, *entry_last = NULL;
-       GHashTable *service_hash_last;
-
-       /*
-        * TODO: This only a placeholder for the 'real' algorithm to
-        * play a bit around. So we are going to improve it step by step.
-        */
-
-       DBG("session %p trigger %s reason %s", session, trigger2string(trigger),
-                                               reason2string(info->reason));
-
-       if (info->entry != NULL) {
-               enum connman_session_state state;
+       struct session_info *info = session->info;
 
-               state = service_to_session_state(info->entry->state);
+       if (session->append_all)
+               return true;
 
-               if (is_type_matching_state(&state, info->config.type) == TRUE)
-                       info->state = state;
-       }
+       if (info->state != info_last->state)
+               return true;
 
-       switch (trigger) {
-       case CONNMAN_SESSION_TRIGGER_UNKNOWN:
-               DBG("ignore session changed event");
-               return;
-       case CONNMAN_SESSION_TRIGGER_SETTING:
-               if (info->config.allowed_bearers != info_last->config.allowed_bearers) {
-
-                       service_hash_last = session->service_hash;
-                       g_list_free(session->service_list);
-                       session->service_list = NULL;
-
-                       if (info->entry != NULL)
-                               service = info->entry->service;
-                       else
-                               service = NULL;
-
-                       populate_service_list(session);
-
-                       if (info->entry != NULL) {
-                               entry_last = g_hash_table_lookup(
-                                                       service_hash_last,
-                                                       info->entry->service);
-                               entry = g_hash_table_lookup(
-                                                       session->service_hash,
-                                                       service);
-                       }
+       if (session->service != session->service_last &&
+                       info->state >= CONNMAN_SESSION_STATE_CONNECTED)
+               return true;
 
-                       if (entry == NULL && entry_last != NULL) {
-                               /*
-                                * The currently selected service is
-                                * not part of this session anymore.
-                                */
-                               deselect_and_disconnect(session);
-                       }
+       if (info->config.allowed_bearers != info_last->config.allowed_bearers ||
+                       info->config.type != info_last->config.type)
+               return true;
 
-                       g_hash_table_destroy(service_hash_last);
-               }
+       return false;
+}
 
-               if (info->config.type != info_last->config.type) {
-                       if (info->state >= CONNMAN_SESSION_STATE_CONNECTED &&
-                                       is_type_matching_state(&info->state,
-                                                       info->config.type) == FALSE)
-                               deselect_and_disconnect(session);
-               }
+static gboolean session_notify(gpointer user_data)
+{
+       struct connman_session *session = user_data;
+       DBusMessage *msg;
+       DBusMessageIter array, dict;
 
-               if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED) {
-                       select_and_connect(session,
-                                       CONNMAN_SESSION_REASON_FREE_RIDE);
-               }
+       if (!compute_notifiable_changes(session))
+               return FALSE;
 
-               break;
-       case CONNMAN_SESSION_TRIGGER_ECALL:
-               /*
-                * For the time beeing we fallback to normal connect
-                * strategy.
-                */
-       case CONNMAN_SESSION_TRIGGER_CONNECT:
-               if (info->state >= CONNMAN_SESSION_STATE_CONNECTED) {
-                       if (info->entry->reason == CONNMAN_SESSION_REASON_CONNECT)
-                               break;
-                       info->entry->reason = CONNMAN_SESSION_REASON_CONNECT;
-                       __connman_service_session_inc(info->entry->service);
-                       break;
-               }
+       DBG("session %p owner %s notify_path %s", session,
+               session->owner, session->notify_path);
 
-               if (info->entry != NULL &&
-                               is_connecting(info->entry->state) == TRUE) {
-                       break;
-               }
+       msg = dbus_message_new_method_call(session->owner, session->notify_path,
+                                               CONNMAN_NOTIFICATION_INTERFACE,
+                                               "Update");
+       if (!msg)
+               return FALSE;
 
-               select_and_connect(session,
-                               CONNMAN_SESSION_REASON_CONNECT);
+       dbus_message_iter_init_append(msg, &array);
+       connman_dbus_dict_open(&array, &dict);
 
-               break;
-       case CONNMAN_SESSION_TRIGGER_DISCONNECT:
-               deselect_and_disconnect(session);
+       append_notify(&dict, session);
 
-               break;
-       case CONNMAN_SESSION_TRIGGER_SERVICE:
-               if (info->entry != NULL &&
-                       (is_connecting(info->entry->state) == TRUE ||
-                               is_connected(info->entry->state) == TRUE)) {
-                       break;
-               }
+       connman_dbus_dict_close(&array, &dict);
 
-               deselect_and_disconnect(session);
+       g_dbus_send_message(connection, msg);
 
-               if (info->reason == CONNMAN_SESSION_REASON_FREE_RIDE) {
-                       select_and_connect(session, info->reason);
-               }
+       return FALSE;
+}
 
-               break;
-       }
+static void ipconfig_ipv4_changed(struct connman_session *session)
+{
+       connman_dbus_setting_changed_dict(session->owner, session->notify_path,
+                                               "IPv4", append_ipconfig_ipv4,
+                                               session->service);
+}
 
-       session_notify(session);
+static void ipconfig_ipv6_changed(struct connman_session *session)
+{
+       connman_dbus_setting_changed_dict(session->owner, session->notify_path,
+                                               "IPv6", append_ipconfig_ipv6,
+                                               session->service);
 }
 
 int connman_session_config_update(struct connman_session *session)
@@ -1439,16 +891,33 @@ int connman_session_config_update(struct connman_session *session)
         * might have changed. We can still optimize this later.
         */
 
-       err = apply_policy_on_bearers(
+       if (session->id_type != session->policy_config->id_type) {
+               cleanup_firewall_session(session);
+               err = init_firewall_session(session);
+               if (err < 0) {
+                       connman_session_destroy(session);
+                       return err;
+               }
+
+               session->id_type = session->policy_config->id_type;
+       }
+
+       apply_policy_on_bearers(
                session->policy_config->allowed_bearers,
                session->user_allowed_bearers,
                &allowed_bearers);
-       if (err < 0)
-               return err;
+
+       if (session->active)
+               set_active_session(session, false);
+
+       session->active = false;
+       session_deactivate(session);
 
        g_slist_free(info->config.allowed_bearers);
        info->config.allowed_bearers = allowed_bearers;
 
+       session_activate(session);
+
        info->config.type = apply_policy_on_type(
                                session->policy_config->type,
                                info->config.type);
@@ -1456,12 +925,12 @@ int connman_session_config_update(struct connman_session *session)
        info->config.roaming_policy = session->policy_config->roaming_policy;
 
        info->config.ecall = session->policy_config->ecall;
-       if (info->config.ecall == TRUE)
+       if (info->config.ecall)
                ecall_session = session;
 
        info->config.priority = session->policy_config->priority;
 
-       session_changed(session, CONNMAN_SESSION_TRIGGER_SETTING);
+       session_notify(session);
 
        return 0;
 }
@@ -1473,14 +942,21 @@ static DBusMessage *connect_session(DBusConnection *conn,
 
        DBG("session %p", session);
 
-       if (ecall_session != NULL) {
-               if (ecall_session->ecall == TRUE && ecall_session != session)
+       if (ecall_session) {
+               if (ecall_session->ecall && ecall_session != session)
                        return __connman_error_failed(msg, EBUSY);
 
-               session->ecall = TRUE;
-               session_changed(session, CONNMAN_SESSION_TRIGGER_ECALL);
-       } else
-               session_changed(session, CONNMAN_SESSION_TRIGGER_CONNECT);
+               session->ecall = true;
+       }
+
+       if (!session->active) {
+               session->active = true;
+               set_active_session(session, true);
+       }
+
+       session_activate(session);
+
+       __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_SESSION);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
@@ -1492,14 +968,20 @@ static DBusMessage *disconnect_session(DBusConnection *conn,
 
        DBG("session %p", session);
 
-       if (ecall_session != NULL) {
-               if (ecall_session->ecall == TRUE && ecall_session != session)
+       if (ecall_session) {
+               if (ecall_session->ecall && ecall_session != session)
                        return __connman_error_failed(msg, EBUSY);
 
-               session->ecall = FALSE;
+               session->ecall = false;
+       }
+
+       if (session->active) {
+               session->active = false;
+               set_active_session(session, false);
        }
 
-       session_changed(session, CONNMAN_SESSION_TRIGGER_DISCONNECT);
+       session_deactivate(session);
+       update_session_state(session);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
@@ -1516,7 +998,7 @@ static DBusMessage *change_session(DBusConnection *conn,
        int err;
 
        DBG("session %p", session);
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -1532,27 +1014,32 @@ static DBusMessage *change_session(DBusConnection *conn,
 
        switch (dbus_message_iter_get_arg_type(&value)) {
        case DBUS_TYPE_ARRAY:
-               if (g_str_equal(name, "AllowedBearers") == TRUE) {
+               if (g_str_equal(name, "AllowedBearers")) {
                        err = parse_bearers(&value, &allowed_bearers);
                        if (err < 0)
-                               return __connman_error_failed(msg, err);
+                               return __connman_error_failed(msg, -err);
+
+                       if (session->active)
+                               set_active_session(session, false);
+
+                       session->active = false;
+                       session_deactivate(session);
 
                        g_slist_free(info->config.allowed_bearers);
                        session->user_allowed_bearers = allowed_bearers;
 
-                       err = apply_policy_on_bearers(
+                       apply_policy_on_bearers(
                                        session->policy_config->allowed_bearers,
                                        session->user_allowed_bearers,
                                        &info->config.allowed_bearers);
 
-                       if (err < 0)
-                               return __connman_error_failed(msg, err);
+                       session_activate(session);
                } else {
                        goto err;
                }
                break;
        case DBUS_TYPE_STRING:
-               if (g_str_equal(name, "ConnectionType") == TRUE) {
+               if (g_str_equal(name, "ConnectionType")) {
                        dbus_message_iter_get_basic(&value, &val);
                        info->config.type = apply_policy_on_type(
                                session->policy_config->type,
@@ -1565,7 +1052,7 @@ static DBusMessage *change_session(DBusConnection *conn,
                goto err;
        }
 
-       session_changed(session, CONNMAN_SESSION_TRIGGER_SETTING);
+       session_notify(session);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 
@@ -1590,7 +1077,7 @@ static void release_session(gpointer key, gpointer value, gpointer user_data)
                                                session->notify_path,
                                                CONNMAN_NOTIFICATION_INTERFACE,
                                                "Release");
-       if (message == NULL)
+       if (!message)
                return;
 
        dbus_message_set_no_reply(message, TRUE);
@@ -1608,8 +1095,6 @@ static int session_disconnect(struct connman_session *session)
        g_dbus_unregister_interface(connection, session->session_path,
                                                CONNMAN_SESSION_INTERFACE);
 
-       deselect_and_disconnect(session);
-
        g_hash_table_remove(session_hash, session->session_path);
 
        return 0;
@@ -1631,7 +1116,7 @@ static DBusMessage *destroy_session(DBusConnection *conn,
 
        DBG("session %p", session);
 
-       if (ecall_session != NULL && ecall_session != session)
+       if (ecall_session && ecall_session != session)
                return __connman_error_failed(msg, EBUSY);
 
        session_disconnect(session);
@@ -1650,86 +1135,93 @@ static const GDBusMethodTable session_methods[] = {
        { },
 };
 
-static int session_create_cb(struct connman_session *session,
+static int session_policy_config_cb(struct connman_session *session,
                                struct connman_session_config *config,
                                void *user_data, int err)
 {
-       DBusMessage *reply;
-       struct user_config *user_config = user_data;
+       struct creation_data *creation_data = user_data;
        struct session_info *info, *info_last;
+       DBusMessage *reply;
 
        DBG("session %p config %p", session, config);
 
-       if (err != 0)
-               goto out;
+       if (err < 0)
+               goto err;
 
        session->policy_config = config;
 
+       session->mark = session_mark++;
+       session->index = -1;
+
+       err = init_firewall_session(session);
+       if (err < 0)
+               goto err;
+
+       err = init_routing_table(session);
+       if (err < 0)
+               goto err;
+
        info = session->info;
        info_last = session->info_last;
 
-       if (session->policy_config->ecall == TRUE)
+       if (session->policy_config->ecall)
                ecall_session = session;
 
        info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
        info->config.type = apply_policy_on_type(
                                session->policy_config->type,
-                               user_config->type);
+                               creation_data->type);
        info->config.priority = session->policy_config->priority;
        info->config.roaming_policy = session->policy_config->roaming_policy;
-       info->entry = NULL;
 
-       session->user_allowed_bearers = user_config->allowed_bearers;
-       user_config->allowed_bearers = NULL;
+       session->user_allowed_bearers = creation_data->allowed_bearers;
+       creation_data->allowed_bearers = NULL;
 
-       err = apply_policy_on_bearers(
+       apply_policy_on_bearers(
                        session->policy_config->allowed_bearers,
                        session->user_allowed_bearers,
                        &info->config.allowed_bearers);
-       if (err < 0)
-               goto out;
 
        g_hash_table_replace(session_hash, session->session_path, session);
 
        DBG("add %s", session->session_path);
 
-       if (g_dbus_register_interface(connection, session->session_path,
+       if (!g_dbus_register_interface(connection, session->session_path,
                                        CONNMAN_SESSION_INTERFACE,
-                                       session_methods, NULL,
-                                       NULL, session, NULL) == FALSE) {
+                                       session_methods, NULL, NULL,
+                                       session, NULL)) {
                connman_error("Failed to register %s", session->session_path);
                g_hash_table_remove(session_hash, session->session_path);
                err = -EINVAL;
-               goto out;
+               goto err;
        }
 
-       reply = g_dbus_create_reply(user_config->pending,
+       reply = g_dbus_create_reply(creation_data->pending,
                                DBUS_TYPE_OBJECT_PATH, &session->session_path,
                                DBUS_TYPE_INVALID);
        g_dbus_send_message(connection, reply);
-       user_config->pending = NULL;
-
-       populate_service_list(session);
+       creation_data->pending = NULL;
 
        info_last->state = info->state;
        info_last->config.priority = info->config.priority;
        info_last->config.roaming_policy = info->config.roaming_policy;
-       info_last->entry = info->entry;
        info_last->config.allowed_bearers = info->config.allowed_bearers;
 
-       session->append_all = TRUE;
+       session->append_all = true;
 
-       session_changed(session, CONNMAN_SESSION_TRIGGER_SETTING);
+       cleanup_creation_data(creation_data);
 
-out:
-       if (err < 0) {
-               reply = __connman_error_failed(user_config->pending, -err);
-               g_dbus_send_message(connection, reply);
+       session_activate(session);
 
-               free_session(session);
-       }
+       return 0;
+
+err:
+       reply = __connman_error_failed(creation_data->pending, -err);
+       g_dbus_send_message(connection, reply);
+       creation_data->pending = NULL;
 
-       cleanup_user_config(user_config);
+       cleanup_session(session);
+       cleanup_creation_data(creation_data);
 
        return err;
 }
@@ -1740,16 +1232,17 @@ int __connman_session_create(DBusMessage *msg)
        char *session_path = NULL;
        DBusMessageIter iter, array;
        struct connman_session *session = NULL;
-       struct user_config *user_config = NULL;
-       connman_bool_t user_allowed_bearers = FALSE;
-       connman_bool_t user_connection_type = FALSE;
-       int err;
+       struct creation_data *creation_data = NULL;
+       bool user_allowed_bearers = false;
+       bool user_connection_type = false;
+       int err, i;
+       char *str;
 
        owner = dbus_message_get_sender(msg);
 
        DBG("owner %s", owner);
 
-       if (ecall_session != NULL && ecall_session->ecall == TRUE) {
+       if (ecall_session && ecall_session->ecall) {
                /*
                 * If there is an emergency call already going on,
                 * ignore session creation attempt
@@ -1758,13 +1251,13 @@ int __connman_session_create(DBusMessage *msg)
                goto err;
        }
 
-       user_config = g_try_new0(struct user_config, 1);
-       if (user_config == NULL) {
+       creation_data = g_try_new0(struct creation_data, 1);
+       if (!creation_data) {
                err = -ENOMEM;
                goto err;
        }
 
-       user_config->pending = dbus_message_ref(msg);
+       creation_data->pending = dbus_message_ref(msg);
 
        dbus_message_iter_init(msg, &iter);
        dbus_message_iter_recurse(&iter, &array);
@@ -1781,25 +1274,25 @@ int __connman_session_create(DBusMessage *msg)
 
                switch (dbus_message_iter_get_arg_type(&value)) {
                case DBUS_TYPE_ARRAY:
-                       if (g_str_equal(key, "AllowedBearers") == TRUE) {
+                       if (g_str_equal(key, "AllowedBearers")) {
                                err = parse_bearers(&value,
-                                               &user_config->allowed_bearers);
+                                       &creation_data->allowed_bearers);
                                if (err < 0)
                                        goto err;
 
-                               user_allowed_bearers = TRUE;
+                               user_allowed_bearers = true;
                        } else {
                                err = -EINVAL;
                                goto err;
                        }
                        break;
                case DBUS_TYPE_STRING:
-                       if (g_str_equal(key, "ConnectionType") == TRUE) {
+                       if (g_str_equal(key, "ConnectionType")) {
                                dbus_message_iter_get_basic(&value, &val);
-                               user_config->type =
+                               creation_data->type =
                                        connman_session_parse_connection_type(val);
 
-                               user_connection_type = TRUE;
+                               user_connection_type = true;
                        } else {
                                err = -EINVAL;
                                goto err;
@@ -1814,36 +1307,40 @@ int __connman_session_create(DBusMessage *msg)
         *
         * For AllowedBearers this is '*', ...
         */
-       if (user_allowed_bearers == FALSE) {
-               user_config->allowed_bearers =
-                       g_slist_append(NULL,
-                               GINT_TO_POINTER(CONNMAN_SERVICE_TYPE_UNKNOWN));
-               if (user_config->allowed_bearers == NULL) {
+       if (!user_allowed_bearers) {
+               add_default_bearer_types(&creation_data->allowed_bearers);
+               if (!creation_data->allowed_bearers) {
                        err = -ENOMEM;
                        goto err;
                }
        }
 
        /* ... and for ConnectionType it is 'any'. */
-       if (user_connection_type == FALSE)
-               user_config->type = CONNMAN_SESSION_TYPE_ANY;
+       if (!user_connection_type)
+               creation_data->type = CONNMAN_SESSION_TYPE_ANY;
 
        dbus_message_iter_next(&iter);
        dbus_message_iter_get_basic(&iter, &notify_path);
 
-       if (notify_path == NULL) {
+       if (!notify_path) {
                err = -EINVAL;
                goto err;
        }
 
-       session_path = g_strdup_printf("/sessions%s", notify_path);
-       if (session_path == NULL) {
+       str = g_strdup(owner);
+       for (i = 0; str[i] != '\0'; i++)
+               if (str[i] == ':' || str[i] == '.')
+                       str[i] = '_';
+       session_path = g_strdup_printf("/sessions/%s%s", str, notify_path);
+       g_free(str);
+
+       if (!session_path) {
                err = -ENOMEM;
                goto err;
        }
 
        session = g_hash_table_lookup(session_hash, session_path);
-       if (session != NULL) {
+       if (session) {
                g_free(session_path);
                session = NULL;
                err = -EEXIST;
@@ -1851,22 +1348,23 @@ int __connman_session_create(DBusMessage *msg)
        }
 
        session = g_try_new0(struct connman_session, 1);
-       if (session == NULL) {
+       if (!session) {
                g_free(session_path);
                err = -ENOMEM;
                goto err;
        }
 
+       creation_data->session = session;
        session->session_path = session_path;
 
        session->info = g_try_new0(struct session_info, 1);
-       if (session->info == NULL) {
+       if (!session->info) {
                err = -ENOMEM;
                goto err;
        }
 
        session->info_last = g_try_new0(struct session_info, 1);
-       if (session->info_last == NULL) {
+       if (!session->info_last) {
                err = -ENOMEM;
                goto err;
        }
@@ -1877,11 +1375,8 @@ int __connman_session_create(DBusMessage *msg)
                g_dbus_add_disconnect_watch(connection, session->owner,
                                        owner_disconnect, session, NULL);
 
-       err = assign_policy_plugin(session);
-       if (err < 0)
-               goto err;
-
-       err = create_policy_config(session, session_create_cb, user_config);
+       err = create_policy_config(session, session_policy_config_cb,
+                                       creation_data);
        if (err < 0 && err != -EINPROGRESS)
                return err;
 
@@ -1892,10 +1387,18 @@ err:
 
        free_session(session);
 
-       cleanup_user_config(user_config);
+       cleanup_creation_data(creation_data);
        return err;
 }
 
+bool __connman_session_policy_autoconnect(enum connman_service_connect_reason reason)
+{
+       if (!policy || !policy->autoconnect)
+               return true;
+
+       return policy->autoconnect(reason);
+}
+
 void connman_session_destroy(struct connman_session *session)
 {
        DBG("session %p", session);
@@ -1914,11 +1417,11 @@ int __connman_session_destroy(DBusMessage *msg)
 
        dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &session_path,
                                                        DBUS_TYPE_INVALID);
-       if (session_path == NULL)
+       if (!session_path)
                return -EINVAL;
 
        session = g_hash_table_lookup(session_hash, session_path);
-       if (session == NULL)
+       if (!session)
                return -EINVAL;
 
        if (g_strcmp0(owner, session->owner) != 0)
@@ -1929,111 +1432,241 @@ int __connman_session_destroy(DBusMessage *msg)
        return 0;
 }
 
-connman_bool_t __connman_session_mode()
+int connman_session_connect(struct connman_service *service)
 {
-       return sessionmode;
+       DBG("service %p name %s", service, __connman_service_get_name(service));
+
+       return __connman_service_connect(service,
+                               CONNMAN_SERVICE_CONNECT_REASON_SESSION);
 }
 
-void __connman_session_set_mode(connman_bool_t enable)
+int connman_session_disconnect(struct connman_service *service)
 {
-       DBG("enable %d", enable);
+       DBG("service %p", service);
 
-       if (sessionmode != enable) {
-               sessionmode = enable;
+       return __connman_service_disconnect(service);
+}
 
-               connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
-                               CONNMAN_MANAGER_INTERFACE, "SessionMode",
-                               DBUS_TYPE_BOOLEAN, &sessionmode);
+static enum connman_session_state service_to_session_state(
+                                       enum connman_service_state state)
+{
+       switch (state) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+       case CONNMAN_SERVICE_STATE_FAILURE:
+               break;
+       case CONNMAN_SERVICE_STATE_READY:
+               return CONNMAN_SESSION_STATE_CONNECTED;
+       case CONNMAN_SERVICE_STATE_ONLINE:
+               return CONNMAN_SESSION_STATE_ONLINE;
        }
 
-       if (sessionmode == TRUE)
-               __connman_service_disconnect_all();
+       return CONNMAN_SESSION_STATE_DISCONNECTED;
 }
 
-static void service_add(struct connman_service *service,
-                       const char *name)
+static void update_session_state(struct connman_session *session)
 {
-       GHashTableIter iter;
-       gpointer key, value;
-       struct connman_session *session;
-       struct service_entry *entry;
-
-       DBG("service %p", service);
+       enum connman_service_state service_state;
+       enum connman_session_state state = CONNMAN_SESSION_STATE_DISCONNECTED;
 
-       g_hash_table_iter_init(&iter, session_hash);
+       if (session->service) {
+               service_state = __connman_service_get_state(session->service);
+               state = service_to_session_state(service_state);
+               session->info->state = state;
+       }
+       session->info->state = state;
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               session = value;
+       DBG("session %p state %s", session, state2string(state));
 
-               if (service_match(session, service) == FALSE)
-                       continue;
+       update_routing_table(session);
+       session_notify(session);
+}
 
-               entry = create_service_entry(session, service, name,
-                                               CONNMAN_SERVICE_STATE_IDLE);
-               if (entry == NULL)
-                       continue;
+static bool session_match_service(struct connman_session *session,
+                               struct connman_service *service)
+{
+       enum connman_service_type bearer_type;
+       enum connman_service_type service_type;
+       GSList *list;
 
-               session->service_list = g_list_insert_sorted_with_data(
-                       session->service_list, entry, sort_services, session);
+       if (policy && policy->allowed)
+               return policy->allowed(session, service);
 
-               g_hash_table_replace(session->service_hash, service, entry);
+       for (list = session->info->config.allowed_bearers; list; list = list->next) {
+               bearer_type = GPOINTER_TO_INT(list->data);
+               service_type = connman_service_get_type(service);
 
-               session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE);
+               if (bearer_type == service_type)
+                       return true;
        }
+
+       return false;
 }
 
-static void service_remove(struct connman_service *service)
+static bool is_session_connected(struct connman_session *session,
+                               enum connman_service_state state)
+
 {
+       switch (state) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+       case CONNMAN_SERVICE_STATE_FAILURE:
+                         break;
+       case CONNMAN_SERVICE_STATE_READY:
+               if (session->info->config.type == CONNMAN_SESSION_TYPE_INTERNET)
+                       return false;
+       case CONNMAN_SERVICE_STATE_ONLINE:
+               return true;
+       }
+
+       return false;
+}
 
+static void session_activate(struct connman_session *session)
+{
        GHashTableIter iter;
        gpointer key, value;
-       struct connman_session *session;
-       struct session_info *info;
 
-       DBG("service %p", service);
+       if (!service_hash)
+               return;
+
+       g_hash_table_iter_init(&iter, service_hash);
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               struct connman_service_info *info = value;
+               enum connman_service_state state;
+
+               state = __connman_service_get_state(info->service);
+
+               if (is_session_connected(session, state) &&
+                               session_match_service(session, info->service)) {
+                       DBG("session %p add service %p", session, info->service);
+
+                       info->sessions = g_slist_prepend(info->sessions,
+                                                       session);
+                       session->service = info->service;
+                       update_session_state(session);
+
+                       return;
+               }
+       }
+
+       session_notify(session);
+}
+
+static void session_deactivate(struct connman_session *session)
+{
+       struct connman_service_info *info;
+
+       if (!service_hash)
+               return;
+
+       if (!session->service)
+               return;
+
+       info = g_hash_table_lookup(service_hash, session->service);
+       if (!info)
+               return;
+
+       info->sessions = g_slist_remove(info->sessions, session);
+       session->service = NULL;
+
+       session->info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+}
+
+static void handle_service_state_online(struct connman_service *service,
+                                       enum connman_service_state state,
+                                       struct connman_service_info *info)
+{
+       GHashTableIter iter;
+       gpointer key, value;
 
        g_hash_table_iter_init(&iter, session_hash);
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               struct connman_session *session = value;
+               bool connected;
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               struct service_entry *entry;
-               session = value;
-               info = session->info;
+               connected = is_session_connected(session, state);
 
-               entry = g_hash_table_lookup(session->service_hash, service);
-               if (entry == NULL)
-                       continue;
+               if (session->service == service) {
+                       if (!connected) {
+                               DBG("session %p remove service %p", session, service);
+                               info->sessions = g_slist_remove(info->sessions,
+                                                       session);
+                               session->service = NULL;
+                               update_session_state(session);
+                       }
+               } else if (connected && session_match_service(session, service)) {
+                       DBG("session %p add service %p", session, service);
+
+                       info->sessions = g_slist_prepend(info->sessions,
+                                                       session);
+                       session->service = service;
+                       update_session_state(session);
+               }
+       }
+}
 
-               session->service_list = g_list_remove(session->service_list,
-                                                       entry);
+static void handle_service_state_offline(struct connman_service *service,
+                                       struct connman_service_info *info)
+{
+       GSList *list;
+
+       for (list = info->sessions; list; list = list->next) {
+               struct connman_session *session = list->data;
+
+               if (session->service != service) {
+                       connman_warn("session %p should have session %p assigned",
+                                       session, service);
+                       continue;
+               }
 
-               g_hash_table_remove(session->service_hash, service);
+               DBG("session %p remove service %p", session, service);
 
-               if (info->entry != NULL && info->entry->service == service)
-                       info->entry = NULL;
-               session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE);
+               session->service = NULL;
+               update_session_state(session);
        }
 }
 
+
 static void service_state_changed(struct connman_service *service,
-                                       enum connman_service_state state)
+                               enum connman_service_state state)
 {
-       GHashTableIter iter;
-       gpointer key, value;
+       struct connman_service_info *info;
 
        DBG("service %p state %d", service, state);
 
-       g_hash_table_iter_init(&iter, session_hash);
+       info = g_hash_table_lookup(service_hash, service);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
-               struct connman_session *session = value;
-               struct service_entry *entry;
+       switch (state) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+       case CONNMAN_SERVICE_STATE_FAILURE:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+               if (!info)
+                       return;
 
-               entry = g_hash_table_lookup(session->service_hash, service);
-               if (entry != NULL)
-                       entry->state = state;
+               handle_service_state_offline(service, info);
+
+               g_hash_table_remove(service_hash, service);
+
+               return;
+       case CONNMAN_SERVICE_STATE_READY:
+       case CONNMAN_SERVICE_STATE_ONLINE:
+               if (!info) {
+                       info = g_new0(struct connman_service_info, 1);
+                       g_hash_table_replace(service_hash, service, info);
+               }
 
-               session_changed(session,
-                               CONNMAN_SESSION_TRIGGER_SERVICE);
+               info->service = service;
+               handle_service_state_online(service, state, info);
        }
 }
 
@@ -2052,14 +1685,16 @@ static void ipconfig_changed(struct connman_service *service,
 
        g_hash_table_iter_init(&iter, session_hash);
 
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                session = value;
                info = session->info;
 
                if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
                        continue;
 
-               if (info->entry != NULL && info->entry->service == service) {
+               if (session->service && session->service == service) {
+                       update_routing_table(session);
+
                        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                                ipconfig_ipv4_changed(session);
                        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
@@ -2070,8 +1705,6 @@ static void ipconfig_changed(struct connman_service *service,
 
 static struct connman_notifier session_notifier = {
        .name                   = "session",
-       .service_add            = service_add,
-       .service_remove         = service_remove,
        .service_state_changed  = service_state_changed,
        .ipconfig_changed       = ipconfig_changed,
 };
@@ -2083,7 +1716,7 @@ int __connman_session_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        err = connman_notifier_register(&session_notifier);
@@ -2095,7 +1728,14 @@ int __connman_session_init(void)
        session_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                NULL, cleanup_session);
 
-       sessionmode = FALSE;
+       service_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+                                               NULL, cleanup_service);
+       if (__connman_firewall_is_up()) {
+               err = init_firewall();
+               if (err < 0)
+                       return err;
+       }
+
        return 0;
 }
 
@@ -2103,14 +1743,18 @@ void __connman_session_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
+       cleanup_firewall();
+
        connman_notifier_unregister(&session_notifier);
 
        g_hash_table_foreach(session_hash, release_session, NULL);
        g_hash_table_destroy(session_hash);
        session_hash = NULL;
+       g_hash_table_destroy(service_hash);
+       service_hash = NULL;
 
        dbus_connection_unref(connection);
 }
diff --git a/src/shared/debugfs.c b/src/shared/debugfs.c
deleted file mode 100644 (file)
index f522c51..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- *  Connection Manager
- *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
- *
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdbool.h>
-#include <string.h>
-#include <limits.h>
-
-#include "src/shared/debugfs.h"
-
-#define STRINGIFY(x) STRINGIFY_ARG(x)
-#define STRINGIFY_ARG(x) #x
-
-const char *debugfs_get_path(void)
-{
-       static char path[PATH_MAX + 1];
-       static bool found = false;
-       char type[100];
-       FILE *fp;
-
-       if (found)
-               return path;
-
-       fp = fopen("/proc/mounts", "r");
-       if (!fp)
-               return NULL;
-
-       while (fscanf(fp, "%*s %" STRINGIFY(PATH_MAX) "s %99s %*s %*d %*d\n",
-                                                       path, type) == 2) {
-               if (!strcmp(type, "debugfs")) {
-                       found = true;
-                       break;
-               }
-       }
-
-       fclose(fp);
-
-       if (!found)
-               return NULL;
-
-       return path;
-}
diff --git a/src/shared/debugfs.h b/src/shared/debugfs.h
deleted file mode 100644 (file)
index 7f41ca7..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *
- *  Connection Manager
- *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
- *
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-const char *debugfs_get_path(void);
diff --git a/src/shared/netlink.c b/src/shared/netlink.c
new file mode 100644 (file)
index 0000000..d72294c
--- /dev/null
@@ -0,0 +1,666 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2011-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2013  BWM CarIT GmbH.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License version 2.1 as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+/*
+ * This file is a copy from ELL which has been ported to use GLib's
+ * data structures.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <linux/netlink.h>
+
+#include <gdbus.h>
+
+#include "src/shared/util.h"
+#include "src/shared/netlink.h"
+
+#ifndef SOL_NETLINK
+#define SOL_NETLINK 270
+#endif
+
+struct command {
+       unsigned int id;
+       uint32_t seq;
+       uint32_t len;
+       netlink_command_func_t handler;
+       netlink_destroy_func_t destroy;
+       void *user_data;
+};
+
+struct notify {
+       uint32_t group;
+       netlink_notify_func_t handler;
+       netlink_destroy_func_t destroy;
+       void *user_data;
+};
+
+struct netlink_info {
+       uint32_t pid;
+       GIOChannel *channel;
+       uint32_t next_seq;
+       GQueue *command_queue;
+       GHashTable *command_pending;
+       GHashTable *command_lookup;
+       unsigned int next_command_id;
+       GHashTable *notify_groups;
+       GHashTable *notify_lookup;
+       unsigned int next_notify_id;
+       netlink_debug_func_t debug_handler;
+       netlink_destroy_func_t debug_destroy;
+       void *debug_data;
+};
+
+
+static void destroy_command(struct command *command)
+{
+       if (command->destroy)
+               command->destroy(command->user_data);
+
+       g_free(command);
+}
+
+static void destroy_notify(struct notify *notify)
+{
+       if (notify->destroy)
+               notify->destroy(notify->user_data);
+
+       g_free(notify);
+}
+
+static gboolean can_write_data(GIOChannel *chan,
+                               GIOCondition cond, gpointer user_data)
+{
+       struct netlink_info *netlink = user_data;
+       struct command *command;
+       struct sockaddr_nl addr;
+       const void *data;
+       ssize_t written;
+       int sk;
+
+       command = g_queue_pop_head(netlink->command_queue);
+       if (!command)
+               return FALSE;
+
+       sk = g_io_channel_unix_get_fd(chan);
+
+       memset(&addr, 0, sizeof(addr));
+       addr.nl_family = AF_NETLINK;
+       addr.nl_pid = 0;
+
+       data = ((void *) command) + NLMSG_ALIGN(sizeof(struct command));
+
+       written = sendto(sk, data, command->len, 0,
+                               (struct sockaddr *) &addr, sizeof(addr));
+       if (written < 0 || (uint32_t) written != command->len) {
+               g_hash_table_remove(netlink->command_lookup,
+                                       GUINT_TO_POINTER(command->id));
+               destroy_command(command);
+               return FALSE;
+       }
+
+       util_hexdump('<', data, command->len,
+                               netlink->debug_handler, netlink->debug_data);
+
+       g_hash_table_replace(netlink->command_pending,
+                               GUINT_TO_POINTER(command->seq), command);
+
+       return g_queue_get_length(netlink->command_queue) > 0;
+}
+
+static void do_notify(gpointer key, gpointer value, gpointer user_data)
+{
+       struct nlmsghdr *nlmsg = user_data;
+       struct notify *notify = value;
+
+       if (notify->handler) {
+               notify->handler(nlmsg->nlmsg_type, NLMSG_DATA(nlmsg),
+                       nlmsg->nlmsg_len - NLMSG_HDRLEN, notify->user_data);
+       }
+}
+
+static void process_broadcast(struct netlink_info *netlink, uint32_t group,
+                                               struct nlmsghdr *nlmsg)
+{
+       GHashTable *notify_list;
+
+       notify_list = g_hash_table_lookup(netlink->notify_groups,
+                                              GUINT_TO_POINTER(group));
+       if (!notify_list)
+               return;
+
+       g_hash_table_foreach(notify_list, do_notify, nlmsg);
+}
+
+static void process_message(struct netlink_info *netlink,
+                               struct nlmsghdr *nlmsg)
+{
+       const void *data = nlmsg;
+       struct command *command;
+
+       command = g_hash_table_lookup(netlink->command_pending,
+                                       GUINT_TO_POINTER(nlmsg->nlmsg_seq));
+       if (!command)
+               return;
+
+       g_hash_table_remove(netlink->command_pending,
+                                       GUINT_TO_POINTER(nlmsg->nlmsg_seq));
+
+       if (!command->handler)
+               goto done;
+
+       if (nlmsg->nlmsg_type < NLMSG_MIN_TYPE) {
+               const struct nlmsgerr *err;
+
+               switch (nlmsg->nlmsg_type) {
+               case NLMSG_ERROR:
+                       err = data + NLMSG_HDRLEN;
+
+                       command->handler(-err->error, 0, NULL, 0,
+                                                       command->user_data);
+                       break;
+               }
+       } else {
+               command->handler(0, nlmsg->nlmsg_type, data + NLMSG_HDRLEN,
+                                       nlmsg->nlmsg_len - NLMSG_HDRLEN,
+                                       command->user_data);
+       }
+
+done:
+       g_hash_table_remove(netlink->command_lookup,
+                               GUINT_TO_POINTER(command->id));
+
+       destroy_command(command);
+}
+
+static void process_multi(struct netlink_info *netlink, struct nlmsghdr *nlmsg)
+{
+       const void *data = nlmsg;
+       struct command *command;
+
+       command = g_hash_table_lookup(netlink->command_pending,
+                                       GUINT_TO_POINTER(nlmsg->nlmsg_seq));
+       if (!command)
+               return;
+
+       if (!command->handler)
+               goto done;
+
+       if (nlmsg->nlmsg_type < NLMSG_MIN_TYPE) {
+               const struct nlmsgerr *err;
+
+               switch (nlmsg->nlmsg_type) {
+               case NLMSG_DONE:
+               case NLMSG_ERROR:
+                       err = data + NLMSG_HDRLEN;
+
+                       command->handler(-err->error, 0, NULL, 0,
+                                                       command->user_data);
+                       break;
+               }
+       } else {
+               command->handler(0, nlmsg->nlmsg_type, data + NLMSG_HDRLEN,
+                                       nlmsg->nlmsg_len - NLMSG_HDRLEN,
+                                       command->user_data);
+               return;
+       }
+
+done:
+       g_hash_table_remove(netlink->command_pending,
+                       GUINT_TO_POINTER(nlmsg->nlmsg_seq));
+
+       g_hash_table_remove(netlink->command_lookup,
+                       GUINT_TO_POINTER(command->id));
+
+       destroy_command(command);
+}
+
+static gboolean can_read_data(GIOChannel *chan,
+                               GIOCondition cond, gpointer data)
+{
+       struct netlink_info *netlink = data;
+       struct cmsghdr *cmsg;
+       struct msghdr msg;
+       struct iovec iov;
+       struct nlmsghdr *nlmsg;
+       unsigned char buffer[4096];
+       unsigned char control[32];
+       uint32_t group = 0;
+       ssize_t len;
+       int sk;
+
+       sk = g_io_channel_unix_get_fd(chan);
+
+       iov.iov_base = buffer;
+       iov.iov_len = sizeof(buffer);
+
+       memset(&msg, 0, sizeof(msg));
+       msg.msg_iov = &iov;
+       msg.msg_iovlen = 1;
+       msg.msg_control = control;
+       msg.msg_controllen = sizeof(control);
+
+       len = recvmsg(sk, &msg, 0);
+       if (len < 0)
+               return FALSE;
+
+       util_hexdump('>', buffer, len, netlink->debug_handler,
+                       netlink->debug_data);
+
+       for (cmsg = CMSG_FIRSTHDR(&msg); cmsg;
+                                       cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+               struct nl_pktinfo *pktinfo;
+
+               if (cmsg->cmsg_level != SOL_NETLINK)
+                       continue;
+
+               if (cmsg->cmsg_type != NETLINK_PKTINFO)
+                       continue;
+
+               pktinfo = (void *) CMSG_DATA(cmsg);
+
+               group = pktinfo->group;
+       }
+
+       for (nlmsg = iov.iov_base; NLMSG_OK(nlmsg, (uint32_t) len);
+                                       nlmsg = NLMSG_NEXT(nlmsg, len)) {
+               if (group > 0 && nlmsg->nlmsg_seq == 0) {
+                       process_broadcast(netlink, group, nlmsg);
+                       continue;
+               }
+
+               if (nlmsg->nlmsg_pid != netlink->pid)
+                       continue;
+
+               if (nlmsg->nlmsg_flags & NLM_F_MULTI)
+                       process_multi(netlink, nlmsg);
+               else
+                       process_message(netlink, nlmsg);
+       }
+
+       return TRUE;
+}
+
+static gboolean netlink_event(GIOChannel *chan,
+                               GIOCondition cond, gpointer data)
+{
+       if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
+               return FALSE;
+
+       return TRUE;
+}
+
+static int create_netlink_socket(int protocol, uint32_t *pid)
+{
+       struct sockaddr_nl addr;
+       socklen_t addrlen = sizeof(addr);
+       int sk, pktinfo = 1;
+
+       sk = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
+                                                               protocol);
+       if (sk < 0)
+               return -1;
+
+       memset(&addr, 0, sizeof(addr));
+       addr.nl_family = AF_NETLINK;
+
+       if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               close(sk);
+               return -1;
+       }
+
+       if (getsockname(sk, (struct sockaddr *) &addr, &addrlen) < 0) {
+               close(sk);
+               return -1;
+       }
+
+       if (setsockopt(sk, SOL_NETLINK, NETLINK_PKTINFO,
+                                       &pktinfo, sizeof(pktinfo)) < 0) {
+               close(sk);
+               return -1;
+       }
+
+       if (pid)
+               *pid = addr.nl_pid;
+
+       return sk;
+}
+
+struct netlink_info *netlink_new(int protocol)
+{
+       struct netlink_info *netlink;
+       int sk;
+
+       netlink = g_try_new0(struct netlink_info, 1);
+       if (!netlink)
+               return NULL;
+
+       netlink->next_seq = 1;
+       netlink->next_command_id = 1;
+       netlink->next_notify_id = 1;
+
+       sk = create_netlink_socket(protocol, &netlink->pid);
+       if (sk < 0) {
+               g_free(netlink);
+               return NULL;
+       }
+
+       netlink->channel = g_io_channel_unix_new(sk);
+       g_io_channel_set_close_on_unref(netlink->channel, TRUE);
+
+       g_io_channel_set_encoding(netlink->channel, NULL, NULL);
+       g_io_channel_set_buffered(netlink->channel, FALSE);
+
+       g_io_add_watch(netlink->channel, G_IO_IN, can_read_data, netlink);
+       g_io_add_watch(netlink->channel, G_IO_NVAL | G_IO_HUP | G_IO_ERR,
+                       netlink_event, netlink);
+
+       netlink->command_queue = g_queue_new();
+       netlink->command_pending = g_hash_table_new(g_direct_hash,
+                                                       g_direct_equal);
+       netlink->command_lookup = g_hash_table_new(g_direct_hash,
+                                                       g_direct_equal);
+
+       netlink->notify_groups = g_hash_table_new(g_direct_hash,
+                                                       g_direct_equal);
+       netlink->notify_lookup = g_hash_table_new(g_direct_hash,
+                                                       g_direct_equal);
+
+       return netlink;
+}
+
+static gboolean cleanup_notify(gpointer key, gpointer value, gpointer user_data)
+{
+       struct notify *notify = value;
+
+       destroy_notify(notify);
+
+       return TRUE;
+
+}
+
+static gboolean cleanup_notify_group(gpointer key, gpointer value,
+                                       gpointer user_data)
+{
+       GHashTable *notify_list = value;
+
+       g_hash_table_foreach_remove(notify_list, cleanup_notify, user_data);
+       g_hash_table_destroy(notify_list);
+
+       return TRUE;
+}
+
+static gboolean cleanup_command(gpointer key, gpointer value,
+                                       gpointer user_data)
+{
+       struct command *command = value;
+
+       destroy_command(command);
+
+       return TRUE;
+}
+
+void netlink_destroy(struct netlink_info *netlink)
+{
+       g_hash_table_destroy(netlink->notify_lookup);
+
+       g_hash_table_foreach_remove(netlink->notify_groups,
+                               cleanup_notify_group, NULL);
+       g_hash_table_destroy(netlink->notify_groups);
+
+       g_queue_free(netlink->command_queue);
+
+       g_hash_table_destroy(netlink->command_pending);
+
+       g_hash_table_foreach_remove(netlink->command_lookup,
+                               cleanup_command, NULL);
+       g_hash_table_destroy(netlink->command_lookup);
+
+       g_io_channel_shutdown(netlink->channel, TRUE, NULL);
+       g_io_channel_unref(netlink->channel);
+
+       g_free(netlink);
+}
+
+unsigned int netlink_send(struct netlink_info *netlink,
+                       uint16_t type, uint16_t flags, const void *data,
+                       uint32_t len, netlink_command_func_t function,
+                       void *user_data, netlink_destroy_func_t destroy)
+{
+       struct command *command;
+       struct nlmsghdr *nlmsg;
+       size_t size;
+
+       if (!netlink)
+               return 0;
+
+       if (!netlink->command_queue ||
+                       !netlink->command_pending ||
+                       !netlink->command_lookup)
+               return 0;
+
+       size = NLMSG_ALIGN(sizeof(struct command)) +
+                                       NLMSG_HDRLEN + NLMSG_ALIGN(len);
+
+       command = g_try_malloc0(size);
+       if (!command)
+               return 0;
+
+       command->handler = function;
+       command->destroy = destroy;
+       command->user_data = user_data;
+
+       command->id = netlink->next_command_id;
+
+       g_hash_table_replace(netlink->command_lookup,
+                               GUINT_TO_POINTER(command->id), command);
+
+       command->seq = netlink->next_seq++;
+       command->len = NLMSG_HDRLEN + NLMSG_ALIGN(len);
+
+       nlmsg = ((void *) command) + NLMSG_ALIGN(sizeof(struct command));
+
+       nlmsg->nlmsg_len = command->len;
+       nlmsg->nlmsg_type = type;
+       nlmsg->nlmsg_flags = NLM_F_REQUEST | flags;
+       nlmsg->nlmsg_seq = command->seq;
+       nlmsg->nlmsg_pid = netlink->pid;
+
+       if (data && len > 0)
+               memcpy(((void *) nlmsg) + NLMSG_HDRLEN, data, len);
+
+       g_queue_push_tail(netlink->command_queue, command);
+
+       netlink->next_command_id++;
+
+       /* Arm IOChannel to call can_write_data in case it is not armed yet. */
+       if (g_queue_get_length(netlink->command_queue) == 1)
+               g_io_add_watch(netlink->channel, G_IO_OUT, can_write_data,
+                               netlink);
+
+       return command->id;
+}
+
+bool netlink_cancel(struct netlink_info *netlink, unsigned int id)
+{
+       struct command *command;
+
+       if (!netlink || id == 0)
+               return false;
+
+       if (!netlink->command_queue ||
+                       !netlink->command_pending ||
+                       !netlink->command_lookup)
+               return false;
+
+       command = g_hash_table_lookup(netlink->command_lookup,
+                                       GUINT_TO_POINTER(id));
+       if (!command)
+               return false;
+
+       g_hash_table_remove(netlink->command_lookup, GUINT_TO_POINTER(id));
+
+       if (!g_queue_remove(netlink->command_queue, command)) {
+               g_hash_table_remove(netlink->command_pending,
+                                       GUINT_TO_POINTER(command->seq));
+       }
+
+       destroy_command(command);
+
+       return true;
+}
+
+static bool add_membership(struct netlink_info *netlink, uint32_t group)
+{
+       int sk, value = group;
+
+       sk = g_io_channel_unix_get_fd(netlink->channel);
+
+       if (setsockopt(sk, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP,
+                                               &value, sizeof(value)) < 0)
+               return false;
+
+       return true;
+}
+
+static bool drop_membership(struct netlink_info *netlink, uint32_t group)
+{
+       int sk, value = group;
+
+       sk = g_io_channel_unix_get_fd(netlink->channel);
+
+       if (setsockopt(sk, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP,
+                                               &value, sizeof(value)) < 0)
+               return false;
+
+       return true;
+}
+
+unsigned int netlink_register(struct netlink_info *netlink,
+                       uint32_t group, netlink_notify_func_t function,
+                       void *user_data, netlink_destroy_func_t destroy)
+{
+       GHashTable *notify_list;
+       struct notify *notify;
+       unsigned int id;
+
+       if (!netlink)
+               return 0;
+
+       if (!netlink->notify_groups || !netlink->notify_lookup)
+               return 0;
+
+       notify_list = g_hash_table_lookup(netlink->notify_groups,
+                                               GUINT_TO_POINTER(group));
+       if (!notify_list) {
+               notify_list = g_hash_table_new(g_direct_hash, g_direct_equal);
+               if (!notify_list)
+                       return 0;
+
+               g_hash_table_replace(netlink->notify_groups,
+                                       GUINT_TO_POINTER(group), notify_list);
+       }
+
+       notify = g_new(struct notify, 1);
+
+       notify->group = group;
+       notify->handler = function;
+       notify->destroy = destroy;
+       notify->user_data = user_data;
+
+       id = netlink->next_notify_id;
+
+       g_hash_table_replace(netlink->notify_lookup,
+                               GUINT_TO_POINTER(id), notify_list);
+       g_hash_table_replace(notify_list, GUINT_TO_POINTER(id), notify);
+
+       if (g_hash_table_size(notify_list) == 1) {
+               if (add_membership(netlink, notify->group) == false)
+                       goto remove_notify;
+       }
+
+       netlink->next_notify_id++;
+
+       return id;
+
+remove_notify:
+       g_hash_table_remove(notify_list, GUINT_TO_POINTER(id));
+       g_hash_table_remove(netlink->notify_lookup, GUINT_TO_POINTER(id));
+       g_free(notify);
+
+       return 0;
+}
+
+bool netlink_unregister(struct netlink_info *netlink, unsigned int id)
+{
+       GHashTable *notify_list;
+       struct notify *notify;
+
+       if (!netlink || id == 0)
+               return false;
+
+       if (!netlink->notify_groups || !netlink->notify_lookup)
+               return false;
+
+       notify_list = g_hash_table_lookup(netlink->notify_lookup,
+                                               GUINT_TO_POINTER(id));
+
+       if (!notify_list)
+               return false;
+
+       g_hash_table_remove(netlink->notify_lookup, GUINT_TO_POINTER(id));
+
+       notify = g_hash_table_lookup(notify_list, GUINT_TO_POINTER(id));
+       if (!notify)
+               return false;
+
+       g_hash_table_remove(notify_list, GUINT_TO_POINTER(id));
+
+       if (g_hash_table_size(notify_list) == 0)
+               drop_membership(netlink, notify->group);
+
+       destroy_notify(notify);
+
+       return true;
+}
+
+bool netlink_set_debug(struct netlink_info *netlink,
+                       netlink_debug_func_t function,
+                       void *user_data, netlink_destroy_func_t destroy)
+{
+       if (!netlink)
+               return false;
+
+       if (netlink->debug_destroy)
+               netlink->debug_destroy(netlink->debug_data);
+
+       netlink->debug_handler = function;
+       netlink->debug_destroy = destroy;
+       netlink->debug_data = user_data;
+
+       return true;
+}
diff --git a/src/shared/netlink.h b/src/shared/netlink.h
new file mode 100644 (file)
index 0000000..62bb3e0
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2011-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2013  BMW Car IT GbmH.
+ *
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License version 2.1 as published by the Free Software Foundation.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef void (*netlink_debug_func_t) (const char *str, void *user_data);
+typedef void (*netlink_command_func_t) (unsigned int error,
+                                               uint16_t type, const void *data,
+                                               uint32_t len, void *user_data);
+typedef void (*netlink_notify_func_t) (uint16_t type, const void *data,
+                                               uint32_t len, void *user_data);
+typedef void (*netlink_destroy_func_t) (void *user_data);
+
+struct netlink_info;
+
+struct netlink_info *netlink_new(int protocol);
+void netlink_destroy(struct netlink_info *netlink);
+
+unsigned int netlink_send(struct netlink_info *netlink,
+                       uint16_t type, uint16_t flags, const void *data,
+                       uint32_t len, netlink_command_func_t function,
+                       void *user_data, netlink_destroy_func_t destroy);
+bool netlink_cancel(struct netlink_info *netlink, unsigned int id);
+
+unsigned int netlink_register(struct netlink_info *netlink,
+                       uint32_t group, netlink_notify_func_t function,
+                       void *user_data, netlink_destroy_func_t destroy);
+bool netlink_unregister(struct netlink_info *netlink, unsigned int id);
+
+bool netlink_set_debug(struct netlink_info *netlink,
+                       netlink_debug_func_t function,
+                       void *user_data, netlink_destroy_func_t destroy);
index cb81fc5..293fb3a 100644 (file)
@@ -21,6 +21,8 @@
  *
  */
 
+#include <glib.h>
+
 typedef void (*util_debug_func_t)(const char *str, void *user_data);
 
 void util_debug(util_debug_func_t function, void *user_data,
@@ -29,3 +31,20 @@ void util_debug(util_debug_func_t function, void *user_data,
 
 void util_hexdump(const char dir, const unsigned char *buf, size_t len,
                                util_debug_func_t function, void *user_data);
+
+struct cb_data {
+       void *cb;
+       void *user_data;
+       void *data;
+};
+
+static inline struct cb_data *cb_data_new(void *cb, void *user_data)
+{
+       struct cb_data *ret;
+
+       ret = g_new0(struct cb_data, 1);
+       ret->cb = cb;
+       ret->user_data = user_data;
+
+       return ret;
+}
index 828c1ef..df5ab4e 100644 (file)
@@ -125,7 +125,7 @@ struct stats_iter {
        struct stats_record *it;
 };
 
-GHashTable *stats_hash = NULL;
+static GHashTable *stats_hash = NULL;
 
 static struct stats_file_header *get_hdr(struct stats_file *file)
 {
@@ -219,7 +219,7 @@ static void stats_free(gpointer user_data)
 {
        struct stats_file *file = user_data;
 
-       if (file == NULL)
+       if (!file)
                return;
 
        msync(file->addr, file->len, MS_SYNC);
@@ -230,12 +230,12 @@ static void stats_free(gpointer user_data)
        TFR(close(file->fd));
        file->fd = -1;
 
-       if (file->history_name != NULL) {
+       if (file->history_name) {
                g_free(file->history_name);
                file->history_name = NULL;
        }
 
-       if (file->name != NULL) {
+       if (file->name) {
                g_free(file->name);
                file->name = NULL;
        }
@@ -295,7 +295,7 @@ static int stats_file_remap(struct stats_file *file, size_t size)
                return -errno;
        }
 
-       if (file->addr == NULL) {
+       if (!file->addr) {
                /*
                 * Though the buffer is not shared between processes, we still
                 * have to take MAP_SHARED because MAP_PRIVATE does not
@@ -472,18 +472,18 @@ static struct stats_record *process_file(struct stats_iter *iter,
        home = NULL;
        roaming = NULL;
 
-       if (cur == NULL)
+       if (!cur)
                cur = get_next_record(iter);
        next = get_next_record(iter);
 
-       while (next != NULL) {
+       while (next) {
                GDate date_cur;
                GDate date_next;
-               int append;
+               bool append;
 
-               append = FALSE;
+               append = false;
 
-               if (cur->roaming == TRUE)
+               if (cur->roaming)
                        roaming = cur;
                else
                        home = cur;
@@ -503,24 +503,24 @@ static struct stats_record *process_file(struct stats_iter *iter,
                        day_next = g_date_get_day(&date_next);
 
                        if (day_cur == day_next && month_cur != month_next) {
-                               append = TRUE;
+                               append = true;
                        } else if (day_cur < account_period_offset &&
                                        day_next >= account_period_offset) {
-                               append = TRUE;
+                               append = true;
                        }
                } else {
                        /* day period size */
                        if (g_date_days_between(&date_cur, &date_next) > 0)
-                               append = TRUE;
+                               append = true;
                }
 
-               if (append == TRUE) {
-                       if (home != NULL) {
+               if (append) {
+                       if (home) {
                                append_record(temp_file, home);
                                home = NULL;
                        }
 
-                       if (roaming != NULL) {
+                       if (roaming) {
                                append_record(temp_file, roaming);
                                roaming = NULL;
                        }
@@ -562,7 +562,7 @@ static int summarize(struct stats_file *data_file,
        /* Now process history file */
        cur = NULL;
 
-       if (history_file != NULL) {
+       if (history_file) {
                history_iter.file = history_file;
                history_iter.begin = get_iterator_begin(history_iter.file);
                history_iter.end = get_iterator_end(history_iter.file);
@@ -582,9 +582,9 @@ static int summarize(struct stats_file *data_file,
         * Ensure date_file records are newer than the history_file
         * record
         */
-       if (cur != NULL) {
+       if (cur) {
                next = get_next_record(&data_iter);
-               while (next != NULL && cur->ts > next->ts)
+               while (next && cur->ts > next->ts)
                        next = get_next_record(&data_iter);
        }
 
@@ -593,7 +593,7 @@ static int summarize(struct stats_file *data_file,
                                &date_change_step_size,
                                data_file->account_period_offset);
 
-       if (cur != NULL)
+       if (cur)
                append_record(temp_file, cur);
 
        return 0;
@@ -677,9 +677,9 @@ int __connman_stats_service_register(struct connman_service *service)
        DBG("service %p", service);
 
        file = g_hash_table_lookup(stats_hash, service);
-       if (file == NULL) {
+       if (!file) {
                file = g_try_new0(struct stats_file, 1);
-               if (file == NULL)
+               if (!file)
                        return -ENOMEM;
 
                g_hash_table_insert(stats_hash, service, file);
@@ -692,7 +692,7 @@ int __connman_stats_service_register(struct connman_service *service)
 
        /* If the dir doesn't exist, create it */
        if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) {
-               if(mkdir(dir, MODE) < 0) {
+               if (mkdir(dir, MODE) < 0) {
                        if (errno != EEXIST) {
                                g_free(dir);
 
@@ -737,7 +737,7 @@ void __connman_stats_service_unregister(struct connman_service *service)
 }
 
 int  __connman_stats_update(struct connman_service *service,
-                               connman_bool_t roaming,
+                               bool roaming,
                                struct connman_stats_data *data)
 {
        struct stats_file *file;
@@ -745,7 +745,7 @@ int  __connman_stats_update(struct connman_service *service,
        int err;
 
        file = g_hash_table_lookup(stats_hash, service);
-       if (file == NULL)
+       if (!file)
                return -EEXIST;
 
        if (file->len < file->max_len &&
@@ -772,7 +772,7 @@ int  __connman_stats_update(struct connman_service *service,
        next->roaming = roaming;
        memcpy(&next->data, data, sizeof(struct connman_stats_data));
 
-       if (roaming != TRUE)
+       if (!roaming)
                set_home(file, next);
        else
                set_roaming(file, next);
@@ -783,22 +783,22 @@ int  __connman_stats_update(struct connman_service *service,
 }
 
 int __connman_stats_get(struct connman_service *service,
-                               connman_bool_t roaming,
+                               bool roaming,
                                struct connman_stats_data *data)
 {
        struct stats_file *file;
        struct stats_record *rec;
 
        file = g_hash_table_lookup(stats_hash, service);
-       if (file == NULL)
+       if (!file)
                return -EEXIST;
 
-       if (roaming != TRUE)
+       if (!roaming)
                rec = file->home;
        else
                rec = file->roaming;
 
-       if (rec != NULL) {
+       if (rec) {
                memcpy(data, &rec->data,
                        sizeof(struct connman_stats_data));
        }
index 1ceafb9..7d03130 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -92,7 +92,7 @@ GKeyFile *__connman_storage_load_global(void)
        GKeyFile *keyfile = NULL;
 
        pathname = g_strdup_printf("%s/%s", STORAGEDIR, SETTINGS);
-       if(pathname == NULL)
+       if (!pathname)
                return NULL;
 
        keyfile = storage_load(pathname);
@@ -108,7 +108,7 @@ int __connman_storage_save_global(GKeyFile *keyfile)
        int ret;
 
        pathname = g_strdup_printf("%s/%s", STORAGEDIR, SETTINGS);
-       if(pathname == NULL)
+       if (!pathname)
                return -ENOMEM;
 
        ret = storage_save(keyfile, pathname);
@@ -123,7 +123,7 @@ void __connman_storage_delete_global(void)
        gchar *pathname;
 
        pathname = g_strdup_printf("%s/%s", STORAGEDIR, SETTINGS);
-       if(pathname == NULL)
+       if (!pathname)
                return;
 
        storage_delete(pathname);
@@ -137,7 +137,7 @@ GKeyFile *__connman_storage_load_config(const char *ident)
        GKeyFile *keyfile = NULL;
 
        pathname = g_strdup_printf("%s/%s.config", STORAGEDIR, ident);
-       if(pathname == NULL)
+       if (!pathname)
                return NULL;
 
        keyfile = storage_load(pathname);
@@ -153,7 +153,7 @@ GKeyFile *__connman_storage_load_provider_config(const char *ident)
        GKeyFile *keyfile = NULL;
 
        pathname = g_strdup_printf("%s/%s.config", VPN_STORAGEDIR, ident);
-       if (pathname == NULL)
+       if (!pathname)
                return NULL;
 
        keyfile = storage_load(pathname);
@@ -169,7 +169,7 @@ GKeyFile *__connman_storage_open_service(const char *service_id)
        GKeyFile *keyfile = NULL;
 
        pathname = g_strdup_printf("%s/%s/%s", STORAGEDIR, service_id, SETTINGS);
-       if(pathname == NULL)
+       if (!pathname)
                return NULL;
 
        keyfile =  storage_load(pathname);
@@ -196,7 +196,7 @@ gchar **connman_storage_get_services(void)
        int ret;
 
        dir = opendir(STORAGEDIR);
-       if (dir == NULL)
+       if (!dir)
                return NULL;
 
        result = g_string_new(NULL);
@@ -248,7 +248,7 @@ GKeyFile *connman_storage_load_service(const char *service_id)
        GKeyFile *keyfile = NULL;
 
        pathname = g_strdup_printf("%s/%s/%s", STORAGEDIR, service_id, SETTINGS);
-       if(pathname == NULL)
+       if (!pathname)
                return NULL;
 
        keyfile =  storage_load(pathname);
@@ -263,12 +263,12 @@ int __connman_storage_save_service(GKeyFile *keyfile, const char *service_id)
        gchar *pathname, *dirname;
 
        dirname = g_strdup_printf("%s/%s", STORAGEDIR, service_id);
-       if(dirname == NULL)
+       if (!dirname)
                return -ENOMEM;
 
        /* If the dir doesn't exist, create it */
        if (!g_file_test(dirname, G_FILE_TEST_IS_DIR)) {
-               if(mkdir(dirname, MODE) < 0) {
+               if (mkdir(dirname, MODE) < 0) {
                        if (errno != EEXIST) {
                                g_free(dirname);
                                return -errno;
@@ -287,67 +287,67 @@ int __connman_storage_save_service(GKeyFile *keyfile, const char *service_id)
        return ret;
 }
 
-static gboolean remove_file(const char *service_id, const char *file)
+static bool remove_file(const char *service_id, const char *file)
 {
        gchar *pathname;
-       gboolean ret = FALSE;
+       bool ret = false;
 
        pathname = g_strdup_printf("%s/%s/%s", STORAGEDIR, service_id, file);
-       if(pathname == NULL)
-               return FALSE;
+       if (!pathname)
+               return false;
 
-       if (g_file_test(pathname, G_FILE_TEST_EXISTS) == FALSE) {
-               ret = TRUE;
-       } else if (g_file_test(pathname, G_FILE_TEST_IS_REGULAR) == TRUE) {
+       if (!g_file_test(pathname, G_FILE_TEST_EXISTS)) {
+               ret = true;
+       } else if (g_file_test(pathname, G_FILE_TEST_IS_REGULAR)) {
                unlink(pathname);
-               ret = TRUE;
+               ret = true;
        }
 
        g_free(pathname);
        return ret;
 }
 
-static gboolean remove_dir(const char *service_id)
+static bool remove_dir(const char *service_id)
 {
        gchar *pathname;
-       gboolean ret = FALSE;
+       bool ret = false;
 
        pathname = g_strdup_printf("%s/%s", STORAGEDIR, service_id);
-       if(pathname == NULL)
-               return FALSE;
+       if (!pathname)
+               return false;
 
-       if (g_file_test(pathname, G_FILE_TEST_EXISTS) == FALSE) {
-               ret = TRUE;
-       } else if (g_file_test(pathname, G_FILE_TEST_IS_DIR) == TRUE) {
+       if (!g_file_test(pathname, G_FILE_TEST_EXISTS)) {
+               ret = true;
+       } else if (g_file_test(pathname, G_FILE_TEST_IS_DIR)) {
                rmdir(pathname);
-               ret = TRUE;
+               ret = true;
        }
 
        g_free(pathname);
        return ret;
 }
 
-gboolean __connman_storage_remove_service(const char *service_id)
+bool __connman_storage_remove_service(const char *service_id)
 {
-       gboolean removed;
+       bool removed;
 
        /* Remove service configuration file */
        removed = remove_file(service_id, SETTINGS);
-       if (removed == FALSE)
-               return FALSE;
+       if (!removed)
+               return false;
 
        /* Remove the statistics file also */
        removed = remove_file(service_id, "data");
-       if (removed == FALSE)
-               return FALSE;
+       if (!removed)
+               return false;
 
        removed = remove_dir(service_id);
-       if (removed == FALSE)
-               return FALSE;
+       if (!removed)
+               return false;
 
        DBG("Removed service dir %s/%s", STORAGEDIR, service_id);
 
-       return TRUE;
+       return true;
 }
 
 GKeyFile *__connman_storage_load_provider(const char *identifier)
@@ -357,7 +357,7 @@ GKeyFile *__connman_storage_load_provider(const char *identifier)
 
        pathname = g_strdup_printf("%s/%s_%s/%s", STORAGEDIR, "provider",
                        identifier, SETTINGS);
-       if (pathname == NULL)
+       if (!pathname)
                return NULL;
 
        keyfile = storage_load(pathname);
@@ -372,10 +372,10 @@ void __connman_storage_save_provider(GKeyFile *keyfile, const char *identifier)
 
        dirname = g_strdup_printf("%s/%s_%s", STORAGEDIR,
                        "provider", identifier);
-       if (dirname == NULL)
+       if (!dirname)
                return;
 
-       if (g_file_test(dirname, G_FILE_TEST_IS_DIR) == FALSE &&
+       if (!g_file_test(dirname, G_FILE_TEST_IS_DIR) &&
                        mkdir(dirname, MODE) < 0) {
                g_free(dirname);
                return;
@@ -388,39 +388,39 @@ void __connman_storage_save_provider(GKeyFile *keyfile, const char *identifier)
        g_free(pathname);
 }
 
-static gboolean remove_all(const char *id)
+static bool remove_all(const char *id)
 {
-       gboolean removed;
+       bool removed;
 
        remove_file(id, SETTINGS);
        remove_file(id, "data");
 
        removed = remove_dir(id);
-       if (removed == FALSE)
-               return FALSE;
+       if (!removed)
+               return false;
 
-       return TRUE;
+       return true;
 }
 
-gboolean __connman_storage_remove_provider(const char *identifier)
+bool __connman_storage_remove_provider(const char *identifier)
 {
-       gboolean removed;
+       bool removed;
        gchar *id;
 
        id = g_strdup_printf("%s_%s", "provider", identifier);
-       if (id == NULL)
-               return FALSE;
+       if (!id)
+               return false;
 
-       if (remove_all(id) == TRUE)
+       if (remove_all(id))
                DBG("Removed provider dir %s/%s", STORAGEDIR, id);
 
        g_free(id);
 
        id = g_strdup_printf("%s_%s", "vpn", identifier);
-       if (id == NULL)
-               return FALSE;
+       if (!id)
+               return false;
 
-       if ((removed = remove_all(id)) == TRUE)
+       if ((removed = remove_all(id)))
                DBG("Removed vpn dir %s/%s", STORAGEDIR, id);
 
        g_free(id);
@@ -441,7 +441,7 @@ gchar **__connman_storage_get_providers(void)
        GSList *iter;
 
        dir = opendir(STORAGEDIR);
-       if (dir == NULL)
+       if (!dir)
                return NULL;
 
        while ((d = readdir(dir))) {
@@ -465,8 +465,8 @@ gchar **__connman_storage_get_providers(void)
        closedir(dir);
 
        providers = g_try_new0(char *, num + 1);
-       for (iter = list; iter != NULL; iter = g_slist_next(iter)) {
-               if (providers != NULL)
+       for (iter = list; iter; iter = g_slist_next(iter)) {
+               if (providers)
                        providers[i] = iter->data;
                else
                        g_free(iter->data);
index 60e336a..8b9e1d9 100644 (file)
@@ -102,7 +102,7 @@ struct connman_task *connman_task_create(const char *program)
        DBG("");
 
        task = g_try_new0(struct connman_task, 1);
-       if (task == NULL)
+       if (!task)
                return NULL;
 
        counter = __sync_fetch_and_add(&task_counter, 1);
@@ -167,7 +167,7 @@ int connman_task_add_argument(struct connman_task *task,
 
        DBG("task %p arg %s", task, name);
 
-       if (name == NULL)
+       if (!name)
                return -EINVAL;
 
        str = g_strdup(name);
@@ -175,7 +175,7 @@ int connman_task_add_argument(struct connman_task *task,
 
        va_start(ap, format);
 
-       if (format != NULL) {
+       if (format) {
                str = g_strdup_vprintf(format, ap);
                g_ptr_array_add(task->argv, str);
        }
@@ -202,7 +202,7 @@ int connman_task_add_variable(struct connman_task *task,
 
        DBG("task %p key %s", task, key);
 
-       if (key == NULL)
+       if (!key)
                return -EINVAL;
 
        va_start(ap, format);
@@ -234,7 +234,7 @@ int connman_task_set_notify(struct connman_task *task, const char *member,
        DBG("task %p", task);
 
        notify = g_try_new0(struct notify_data, 1);
-       if (notify == NULL)
+       if (!notify)
                return -ENOMEM;
 
        notify->func = function;
@@ -293,7 +293,7 @@ int connman_task_run(struct connman_task *task,
                        int *stdin_fd, int *stdout_fd, int *stderr_fd)
 {
        GSpawnFlags flags = G_SPAWN_DO_NOT_REAP_CHILD;
-       gboolean result;
+       bool result;
        char **argv, **envp;
 
        DBG("task %p", task);
@@ -301,20 +301,20 @@ int connman_task_run(struct connman_task *task,
        if (task->pid > 0)
                return -EALREADY;
 
-       if (stdout_fd == NULL)
+       if (!stdout_fd)
                flags |= G_SPAWN_STDOUT_TO_DEV_NULL;
 
-       if (stderr_fd == NULL)
+       if (!stderr_fd)
                flags |= G_SPAWN_STDERR_TO_DEV_NULL;
 
        task->exit_func = function;
        task->exit_data = user_data;
 
-       if (g_ptr_array_index(task->argv, task->argv->len - 1) != NULL)
+       if (g_ptr_array_index(task->argv, task->argv->len - 1))
                g_ptr_array_add(task->argv, NULL);
 
-       if (task->envp->len == 0 || g_ptr_array_index(task->envp,
-                                       task->envp->len - 1) != NULL) {
+       if (task->envp->len == 0 ||
+                       g_ptr_array_index(task->envp, task->envp->len - 1)) {
                if (g_hash_table_size(task->notify) > 0) {
                        const char *busname;
                        char *str;
@@ -340,7 +340,7 @@ int connman_task_run(struct connman_task *task,
        result = g_spawn_async_with_pipes(NULL, argv, envp, flags,
                                        task_setup, task, &task->pid,
                                        stdin_fd, stdout_fd, stderr_fd, NULL);
-       if (result == FALSE) {
+       if (!result) {
                connman_error("Failed to spawn %s", argv[0]);
                return -EIO;
        }
@@ -419,39 +419,38 @@ static DBusHandlerResult task_filter(DBusConnection *conn,
        if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       if (dbus_message_has_interface(message,
-                                       CONNMAN_TASK_INTERFACE) == FALSE)
+       if (!dbus_message_has_interface(message, CONNMAN_TASK_INTERFACE))
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
        path = dbus_message_get_path(message);
-       if (path == NULL)
+       if (!path)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
        task = g_hash_table_lookup(task_hash, path);
-       if (task == NULL)
+       if (!task)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
        member = dbus_message_get_member(message);
-       if (member == NULL)
+       if (!member)
                goto send_reply;
 
        notify = g_hash_table_lookup(task->notify, member);
-       if (notify == NULL)
+       if (!notify)
                goto send_reply;
 
        if (notify->func)
                reply = notify->func(task, message, notify->data);
 
 send_reply:
-       if (dbus_message_get_no_reply(message) == FALSE &&
-                                               reply == NULL) {
+       if (!dbus_message_get_no_reply(message) &&
+                                               !reply) {
 
                reply = dbus_message_new_method_return(message);
-               if (reply == NULL)
+               if (!reply)
                        return DBUS_HANDLER_RESULT_NEED_MEMORY;
        }
 
-       if (reply != NULL) {
+       if (reply) {
                dbus_connection_send(conn, reply, NULL);
 
                dbus_message_unref(reply);
index 632f716..d80d9e6 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -41,13 +41,13 @@ static GSList *technology_list = NULL;
 static GSList *techless_device_list = NULL;
 static GHashTable *rfkill_list;
 
-static connman_bool_t global_offlinemode;
+static bool global_offlinemode;
 
 struct connman_rfkill {
        unsigned int index;
        enum connman_service_type type;
-       connman_bool_t softblock;
-       connman_bool_t hardblock;
+       bool softblock;
+       bool hardblock;
 };
 
 struct connman_technology {
@@ -55,19 +55,19 @@ struct connman_technology {
        enum connman_service_type type;
        char *path;
        GSList *device_list;
-       connman_bool_t enabled;
+       bool enabled;
        char *regdom;
-       connman_bool_t connected;
+       bool connected;
 
-       connman_bool_t tethering;
-       connman_bool_t tethering_persistent; /* Tells the save status, needed
+       bool tethering;
+       bool tethering_persistent; /* Tells the save status, needed
                                              * as offline mode might set
                                              * tethering OFF.
                                              */
        char *tethering_ident;
        char *tethering_passphrase;
 
-       connman_bool_t enable_persistent; /* Save the tech state */
+       bool enable_persistent; /* Save the tech state */
 
        GSList *driver_list;
 
@@ -76,10 +76,10 @@ struct connman_technology {
 
        GSList *scan_pending;
 
-       connman_bool_t rfkill_driven;
-       connman_bool_t softblocked;
-       connman_bool_t hardblocked;
-       connman_bool_t dbus_registered;
+       bool rfkill_driven;
+       bool softblocked;
+       bool hardblocked;
+       bool dbus_registered;
 };
 
 static GSList *driver_list = NULL;
@@ -103,7 +103,7 @@ static void rfkill_check(gpointer key, gpointer value, gpointer user_data)
                                rfkill->softblock, rfkill->hardblock);
 }
 
-connman_bool_t
+bool
 connman_technology_is_tethering_allowed(enum connman_service_type type)
 {
        static char *allowed_default[] = { "wifi", "bluetooth", "gadget",
@@ -112,100 +112,19 @@ connman_technology_is_tethering_allowed(enum connman_service_type type)
        char **allowed;
        int i;
 
-       if (type_str == NULL)
-               return FALSE;
+       if (!type_str)
+               return false;
 
        allowed = connman_setting_get_string_list("TetheringTechnologies");
-       if (allowed == NULL)
+       if (!allowed)
                allowed = allowed_default;
 
-       for (i = 0; allowed[i] != NULL; i++) {
+       for (i = 0; allowed[i]; i++) {
                if (g_strcmp0(allowed[i], type_str) == 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
-}
-
-/**
- * connman_technology_driver_register:
- * @driver: Technology driver definition
- *
- * Register a new technology driver
- *
- * Returns: %0 on success
- */
-int connman_technology_driver_register(struct connman_technology_driver *driver)
-{
-       GSList *list;
-       struct connman_device *device;
-       enum connman_service_type type;
-
-       DBG("Registering %s driver", driver->name);
-
-       driver_list = g_slist_insert_sorted(driver_list, driver,
-                                                       compare_priority);
-
-       /*
-        * Check for technology less devices if this driver
-        * can service any of them.
-       */
-       for (list = techless_device_list; list != NULL; list = list->next) {
-               device = list->data;
-
-               type = __connman_device_get_service_type(device);
-               if (type != driver->type)
-                       continue;
-
-               techless_device_list = g_slist_remove(techless_device_list,
-                                                               device);
-
-               __connman_technology_add_device(device);
-       }
-
-       /* Check for orphaned rfkill switches. */
-       g_hash_table_foreach(rfkill_list, rfkill_check,
-                                       GINT_TO_POINTER(driver->type));
-
-       return 0;
-}
-
-/**
- * connman_technology_driver_unregister:
- * @driver: Technology driver definition
- *
- * Remove a previously registered technology driver
- */
-void connman_technology_driver_unregister(struct connman_technology_driver *driver)
-{
-       GSList *list, *tech_drivers;
-       struct connman_technology *technology;
-       struct connman_technology_driver *current;
-
-       DBG("Unregistering driver %p name %s", driver, driver->name);
-
-       for (list = technology_list; list; list = list->next) {
-               technology = list->data;
-
-               for (tech_drivers = technology->driver_list;
-                    tech_drivers != NULL;
-                    tech_drivers = g_slist_next(tech_drivers)) {
-
-                       current = tech_drivers->data;
-                       if (driver != current)
-                               continue;
-
-                       if (driver->remove != NULL)
-                               driver->remove(technology);
-
-                       technology->driver_list =
-                               g_slist_remove(technology->driver_list, driver);
-
-                       break;
-               }
-       }
-
-       driver_list = g_slist_remove(driver_list, driver);
+       return false;
 }
 
 static const char *get_name(enum connman_service_type type)
@@ -215,8 +134,9 @@ static const char *get_name(enum connman_service_type type)
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
                break;
+       case CONNMAN_SERVICE_TYPE_GADGET:
+               return "Gadget";
        case CONNMAN_SERVICE_TYPE_ETHERNET:
                return "Wired";
        case CONNMAN_SERVICE_TYPE_WIFI:
@@ -225,6 +145,8 @@ static const char *get_name(enum connman_service_type type)
                return "Bluetooth";
        case CONNMAN_SERVICE_TYPE_CELLULAR:
                return "Cellular";
+       case CONNMAN_SERVICE_TYPE_P2P:
+               return "P2P";
        }
 
        return NULL;
@@ -234,15 +156,19 @@ static void technology_save(struct connman_technology *technology)
 {
        GKeyFile *keyfile;
        gchar *identifier;
+       const char *name = get_name(technology->type);
 
-       DBG("technology %p", technology);
+       DBG("technology %p type %d name %s", technology, technology->type,
+                                                                       name);
+       if (!name)
+               return;
 
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
+       if (!keyfile)
                keyfile = g_key_file_new();
 
-       identifier = g_strdup_printf("%s", get_name(technology->type));
-       if (identifier == NULL)
+       identifier = g_strdup_printf("%s", name);
+       if (!identifier)
                goto done;
 
        g_key_file_set_boolean(keyfile, identifier, "Enable",
@@ -251,12 +177,12 @@ static void technology_save(struct connman_technology *technology)
        g_key_file_set_boolean(keyfile, identifier, "Tethering",
                                technology->tethering_persistent);
 
-       if (technology->tethering_ident != NULL)
+       if (technology->tethering_ident)
                g_key_file_set_string(keyfile, identifier,
                                        "Tethering.Identifier",
                                        technology->tethering_ident);
 
-       if (technology->tethering_passphrase != NULL)
+       if (technology->tethering_passphrase)
                g_key_file_set_string(keyfile, identifier,
                                        "Tethering.Passphrase",
                                        technology->tethering_passphrase);
@@ -273,7 +199,7 @@ done:
 
 static void tethering_changed(struct connman_technology *technology)
 {
-       connman_bool_t tethering = technology->tethering;
+       dbus_bool_t tethering = technology->tethering;
 
        connman_dbus_property_changed_basic(technology->path,
                                CONNMAN_TECHNOLOGY_INTERFACE, "Tethering",
@@ -283,10 +209,8 @@ static void tethering_changed(struct connman_technology *technology)
 }
 
 void connman_technology_tethering_notify(struct connman_technology *technology,
-                                                       connman_bool_t enabled)
+                                                       bool enabled)
 {
-       GSList *list;
-
        DBG("technology %p enabled %u", technology, enabled);
 
        if (technology->tethering == enabled)
@@ -296,21 +220,14 @@ void connman_technology_tethering_notify(struct connman_technology *technology,
 
        tethering_changed(technology);
 
-       if (enabled == TRUE)
+       if (enabled)
                __connman_tethering_set_enabled();
-       else {
-               for (list = technology_list; list; list = list->next) {
-                       struct connman_technology *other_tech = list->data;
-                       if (other_tech->tethering == TRUE)
-                               break;
-               }
-               if (list == NULL)
-                       __connman_tethering_set_disabled();
-       }
+       else
+               __connman_tethering_set_disabled();
 }
 
 static int set_tethering(struct connman_technology *technology,
-                               connman_bool_t enabled)
+                               bool enabled)
 {
        int result = -EOPNOTSUPP;
        int err;
@@ -321,22 +238,22 @@ static int set_tethering(struct connman_technology *technology,
        passphrase = technology->tethering_passphrase;
 
        __sync_synchronize();
-       if (technology->enabled == FALSE)
+       if (!technology->enabled)
                return -EACCES;
 
        bridge = __connman_tethering_get_bridge();
-       if (bridge == NULL)
+       if (!bridge)
                return -EOPNOTSUPP;
 
        if (technology->type == CONNMAN_SERVICE_TYPE_WIFI &&
-           (ident == NULL || passphrase == NULL))
+           (!ident || !passphrase))
                return -EINVAL;
 
-       for (tech_drivers = technology->driver_list; tech_drivers != NULL;
+       for (tech_drivers = technology->driver_list; tech_drivers;
             tech_drivers = g_slist_next(tech_drivers)) {
                struct connman_technology_driver *driver = tech_drivers->data;
 
-               if (driver == NULL || driver->set_tethering == NULL)
+               if (!driver || !driver->set_tethering)
                        continue;
 
                err = driver->set_tethering(technology, ident, passphrase,
@@ -359,7 +276,7 @@ void connman_technology_regdom_notify(struct connman_technology *technology,
 {
        DBG("");
 
-       if (alpha2 == NULL)
+       if (!alpha2)
                connman_error("Failed to set regulatory domain");
        else
                DBG("Regulatory domain set to %s", alpha2);
@@ -393,13 +310,13 @@ int connman_technology_set_regdom(const char *alpha2)
                if (set_regdom_by_device(technology, alpha2) != 0) {
 
                        for (tech_drivers = technology->driver_list;
-                            tech_drivers != NULL;
+                            tech_drivers;
                             tech_drivers = g_slist_next(tech_drivers)) {
 
                                struct connman_technology_driver *driver =
                                        tech_drivers->data;
 
-                               if (driver->set_regdom != NULL)
+                               if (driver->set_regdom)
                                        driver->set_regdom(technology, alpha2);
                        }
                }
@@ -424,27 +341,27 @@ static struct connman_technology *technology_find(enum connman_service_type type
        return NULL;
 }
 
-connman_bool_t connman_technology_get_wifi_tethering(const char **ssid,
+bool connman_technology_get_wifi_tethering(const char **ssid,
                                                        const char **psk)
 {
        struct connman_technology *technology;
 
-       if (ssid == NULL || psk == NULL)
-               return FALSE;
+       if (!ssid || !psk)
+               return false;
 
        *ssid = *psk = NULL;
 
        technology = technology_find(CONNMAN_SERVICE_TYPE_WIFI);
-       if (technology == NULL)
-               return FALSE;
+       if (!technology)
+               return false;
 
-       if (technology->tethering == FALSE)
-               return FALSE;
+       if (!technology->tethering)
+               return false;
 
        *ssid = technology->tethering_ident;
        *psk = technology->tethering_passphrase;
 
-       return TRUE;
+       return true;
 }
 
 static void free_rfkill(gpointer data)
@@ -459,48 +376,48 @@ static void technology_load(struct connman_technology *technology)
        GKeyFile *keyfile;
        gchar *identifier;
        GError *error = NULL;
-       connman_bool_t enable, need_saving = FALSE;
+       bool enable, need_saving = false;
 
        DBG("technology %p", technology);
 
        keyfile = __connman_storage_load_global();
        /* Fallback on disabling technology if file not found. */
-       if (keyfile == NULL) {
+       if (!keyfile) {
                if (technology->type == CONNMAN_SERVICE_TYPE_ETHERNET)
                        /* We enable ethernet by default */
-                       technology->enable_persistent = TRUE;
+                       technology->enable_persistent = true;
                else
-                       technology->enable_persistent = FALSE;
+                       technology->enable_persistent = false;
                return;
        }
 
        identifier = g_strdup_printf("%s", get_name(technology->type));
-       if (identifier == NULL)
+       if (!identifier)
                goto done;
 
        enable = g_key_file_get_boolean(keyfile, identifier, "Enable", &error);
-       if (error == NULL)
+       if (!error)
                technology->enable_persistent = enable;
        else {
                if (technology->type == CONNMAN_SERVICE_TYPE_ETHERNET)
-                       technology->enable_persistent = TRUE;
+                       technology->enable_persistent = true;
                else
-                       technology->enable_persistent = FALSE;
+                       technology->enable_persistent = false;
 
-               need_saving = TRUE;
+               need_saving = true;
                g_clear_error(&error);
        }
 
        enable = g_key_file_get_boolean(keyfile, identifier,
                                        "Tethering", &error);
-       if (error == NULL)
+       if (!error)
                technology->tethering_persistent = enable;
        else {
-               need_saving = TRUE;
+               need_saving = true;
                g_clear_error(&error);
        }
 
-       if (need_saving == TRUE)
+       if (need_saving)
                technology_save(technology);
 
        technology->tethering_ident = g_key_file_get_string(keyfile,
@@ -516,17 +433,17 @@ done:
        return;
 }
 
-connman_bool_t __connman_technology_get_offlinemode(void)
+bool __connman_technology_get_offlinemode(void)
 {
        return global_offlinemode;
 }
 
-static void connman_technology_save_offlinemode()
+static void connman_technology_save_offlinemode(void)
 {
        GKeyFile *keyfile;
 
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
+       if (!keyfile)
                keyfile = g_key_file_new();
 
        g_key_file_set_boolean(keyfile, "global",
@@ -539,21 +456,21 @@ static void connman_technology_save_offlinemode()
        return;
 }
 
-static connman_bool_t connman_technology_load_offlinemode()
+static bool connman_technology_load_offlinemode(void)
 {
        GKeyFile *keyfile;
        GError *error = NULL;
-       connman_bool_t offlinemode;
+       bool offlinemode;
 
        /* If there is a error, we enable offlinemode */
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
-               return FALSE;
+       if (!keyfile)
+               return false;
 
        offlinemode = g_key_file_get_boolean(keyfile, "global",
                                                "OfflineMode", &error);
-       if (error != NULL) {
-               offlinemode = FALSE;
+       if (error) {
+               offlinemode = false;
                g_clear_error(&error);
        }
 
@@ -566,39 +483,43 @@ static void append_properties(DBusMessageIter *iter,
                struct connman_technology *technology)
 {
        DBusMessageIter dict;
+       dbus_bool_t val;
        const char *str;
 
        connman_dbus_dict_open(iter, &dict);
 
        str = get_name(technology->type);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(&dict, "Name",
                                                DBUS_TYPE_STRING, &str);
 
        str = __connman_service_type2string(technology->type);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(&dict, "Type",
                                                DBUS_TYPE_STRING, &str);
 
        __sync_synchronize();
+       val = technology->enabled;
        connman_dbus_dict_append_basic(&dict, "Powered",
                                        DBUS_TYPE_BOOLEAN,
-                                       &technology->enabled);
+                                       &val);
 
+       val = technology->connected;
        connman_dbus_dict_append_basic(&dict, "Connected",
                                        DBUS_TYPE_BOOLEAN,
-                                       &technology->connected);
+                                       &val);
 
+       val = technology->tethering;
        connman_dbus_dict_append_basic(&dict, "Tethering",
                                        DBUS_TYPE_BOOLEAN,
-                                       &technology->tethering);
+                                       &val);
 
-       if (technology->tethering_ident != NULL)
+       if (technology->tethering_ident)
                connman_dbus_dict_append_basic(&dict, "TetheringIdentifier",
                                        DBUS_TYPE_STRING,
                                        &technology->tethering_ident);
 
-       if (technology->tethering_passphrase != NULL)
+       if (technology->tethering_passphrase)
                connman_dbus_dict_append_basic(&dict, "TetheringPassphrase",
                                        DBUS_TYPE_STRING,
                                        &technology->tethering_passphrase);
@@ -613,7 +534,7 @@ static void technology_added_signal(struct connman_technology *technology)
 
        signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
                        CONNMAN_MANAGER_INTERFACE, "TechnologyAdded");
-       if (signal == NULL)
+       if (!signal)
                return;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -641,7 +562,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
        DBusMessageIter iter;
 
        reply = dbus_message_new_method_return(message);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_iter_init_append(reply, &iter);
@@ -658,9 +579,9 @@ void __connman_technology_list_struct(DBusMessageIter *array)
        for (list = technology_list; list; list = list->next) {
                struct connman_technology *technology = list->data;
 
-               if (technology->path == NULL ||
-                               (technology->rfkill_driven == TRUE &&
-                                technology->hardblocked == TRUE))
+               if (!technology->path ||
+                               (technology->rfkill_driven &&
+                                technology->hardblocked))
                        continue;
 
                dbus_message_iter_open_container(array, DBUS_TYPE_STRUCT,
@@ -678,9 +599,9 @@ static gboolean technology_pending_reply(gpointer user_data)
        DBusMessage *reply;
 
        /* Power request timedout, send ETIMEDOUT. */
-       if (technology->pending_reply != NULL) {
+       if (technology->pending_reply) {
                reply = __connman_error_failed(technology->pending_reply, ETIMEDOUT);
-               if (reply != NULL)
+               if (reply)
                        g_dbus_send_message(connection, reply);
 
                dbus_message_unref(technology->pending_reply);
@@ -692,15 +613,18 @@ static gboolean technology_pending_reply(gpointer user_data)
 }
 
 static int technology_affect_devices(struct connman_technology *technology,
-                                               connman_bool_t enable_device)
+                                               bool enable_device)
 {
        GSList *list;
-       int err = 0;
+       int err = -ENXIO;
+
+       if (technology->type == CONNMAN_SERVICE_TYPE_P2P)
+               return 0;
 
        for (list = technology->device_list; list; list = list->next) {
                struct connman_device *device = list->data;
 
-               if (enable_device == TRUE)
+               if (enable_device)
                        err = __connman_device_enable(device);
                else
                        err = __connman_device_disable(device);
@@ -709,6 +633,68 @@ static int technology_affect_devices(struct connman_technology *technology,
        return err;
 }
 
+static void powered_changed(struct connman_technology *technology)
+{
+       dbus_bool_t enabled;
+
+       if (!technology->dbus_registered)
+               return;
+
+       if (technology->pending_reply) {
+               g_dbus_send_reply(connection,
+                               technology->pending_reply, DBUS_TYPE_INVALID);
+               dbus_message_unref(technology->pending_reply);
+               technology->pending_reply = NULL;
+
+               g_source_remove(technology->pending_timeout);
+               technology->pending_timeout = 0;
+       }
+
+       __sync_synchronize();
+       enabled = technology->enabled;
+       connman_dbus_property_changed_basic(technology->path,
+                       CONNMAN_TECHNOLOGY_INTERFACE, "Powered",
+                       DBUS_TYPE_BOOLEAN, &enabled);
+}
+
+static void enable_tethering(struct connman_technology *technology)
+{
+       int ret;
+
+       if (!connman_setting_get_bool("PersistentTetheringMode"))
+               return;
+
+       ret = set_tethering(technology, true);
+       if (ret < 0 && ret != -EALREADY)
+               DBG("Cannot enable tethering yet for %s (%d/%s)",
+                       get_name(technology->type),
+                       -ret, strerror(-ret));
+}
+
+static int technology_enabled(struct connman_technology *technology)
+{
+       __sync_synchronize();
+       if (technology->enabled)
+               return -EALREADY;
+
+       technology->enabled = true;
+
+       if (technology->type == CONNMAN_SERVICE_TYPE_WIFI) {
+               struct connman_technology *p2p;
+
+               p2p = technology_find(CONNMAN_SERVICE_TYPE_P2P);
+               if (p2p && !p2p->enabled && p2p->enable_persistent)
+                       technology_enabled(p2p);
+       }
+
+       if (technology->tethering_persistent)
+               enable_tethering(technology);
+
+       powered_changed(technology);
+
+       return 0;
+}
+
 static int technology_enable(struct connman_technology *technology)
 {
        int err = 0;
@@ -717,27 +703,50 @@ static int technology_enable(struct connman_technology *technology)
        DBG("technology %p enable", technology);
 
        __sync_synchronize();
-       if (technology->enabled == TRUE)
+
+       if (technology->type == CONNMAN_SERVICE_TYPE_P2P) {
+               struct connman_technology *wifi;
+
+               wifi = technology_find(CONNMAN_SERVICE_TYPE_WIFI);
+               if (wifi && wifi->enabled)
+                       return technology_enabled(technology);
+               return 0;
+       }
+
+       if (technology->enabled)
                return -EALREADY;
 
-       if (technology->pending_reply != NULL)
+       if (technology->pending_reply)
                return -EBUSY;
 
-       if (connman_setting_get_bool("PersistentTetheringMode") == TRUE &&
-                                       technology->tethering == TRUE)
-               set_tethering(technology, TRUE);
+       if (connman_setting_get_bool("PersistentTetheringMode") &&
+                                       technology->tethering)
+               set_tethering(technology, true);
 
-       if (technology->rfkill_driven == TRUE)
-               err = __connman_rfkill_block(technology->type, FALSE);
+       if (technology->rfkill_driven)
+               err = __connman_rfkill_block(technology->type, false);
 
-       err_dev = technology_affect_devices(technology, TRUE);
+       err_dev = technology_affect_devices(technology, true);
 
-       if (technology->rfkill_driven == FALSE)
+       if (!technology->rfkill_driven)
                err = err_dev;
 
        return err;
 }
 
+static int technology_disabled(struct connman_technology *technology)
+{
+       __sync_synchronize();
+       if (!technology->enabled)
+               return -EALREADY;
+
+       technology->enabled = false;
+
+       powered_changed(technology);
+
+       return 0;
+}
+
 static int technology_disable(struct connman_technology *technology)
 {
        int err;
@@ -745,35 +754,49 @@ static int technology_disable(struct connman_technology *technology)
        DBG("technology %p disable", technology);
 
        __sync_synchronize();
-       if (technology->enabled == FALSE)
+
+       if (technology->type == CONNMAN_SERVICE_TYPE_P2P) {
+               technology->enable_persistent = false;
+               return technology_disabled(technology);
+       } else if (technology->type == CONNMAN_SERVICE_TYPE_WIFI) {
+               struct connman_technology *p2p;
+
+               p2p = technology_find(CONNMAN_SERVICE_TYPE_P2P);
+               if (p2p && p2p->enabled) {
+                       p2p->enable_persistent = true;
+                       technology_disabled(p2p);
+               }
+       }
+
+       if (!technology->enabled)
                return -EALREADY;
 
-       if (technology->pending_reply != NULL)
+       if (technology->pending_reply)
                return -EBUSY;
 
-       if (technology->tethering == TRUE)
-               set_tethering(technology, FALSE);
+       if (technology->tethering)
+               set_tethering(technology, false);
 
-       err = technology_affect_devices(technology, FALSE);
+       err = technology_affect_devices(technology, false);
 
-       if (technology->rfkill_driven == TRUE)
-               err = __connman_rfkill_block(technology->type, TRUE);
+       if (technology->rfkill_driven)
+               err = __connman_rfkill_block(technology->type, true);
 
        return err;
 }
 
 static DBusMessage *set_powered(struct connman_technology *technology,
-                               DBusMessage *msg, connman_bool_t powered)
+                               DBusMessage *msg, bool powered)
 {
        DBusMessage *reply = NULL;
        int err = 0;
 
-       if (technology->rfkill_driven && technology->hardblocked == TRUE) {
+       if (technology->rfkill_driven && technology->hardblocked) {
                err = -EACCES;
                goto make_reply;
        }
 
-       if (powered == TRUE)
+       if (powered)
                err = technology_enable(technology);
        else
                err = technology_disable(technology);
@@ -789,7 +812,7 @@ make_reply:
                technology->pending_timeout = g_timeout_add_seconds(10,
                                        technology_pending_reply, technology);
        } else if (err == -EALREADY) {
-               if (powered == TRUE)
+               if (powered)
                        reply = __connman_error_already_enabled(msg);
                else
                        reply = __connman_error_already_disabled(msg);
@@ -811,7 +834,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -829,15 +852,14 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        DBG("property %s", name);
 
-       if (g_str_equal(name, "Tethering") == TRUE) {
+       if (g_str_equal(name, "Tethering")) {
+               dbus_bool_t tethering;
                int err;
-               connman_bool_t tethering;
 
                if (type != DBUS_TYPE_BOOLEAN)
                        return __connman_error_invalid_arguments(msg);
 
-               if (connman_technology_is_tethering_allowed(technology->type)
-                                                               == FALSE) {
+               if (!connman_technology_is_tethering_allowed(technology->type)) {
                        DBG("%s tethering not allowed by config file",
                                __connman_service_type2string(technology->type));
                        return __connman_error_not_supported(msg);
@@ -846,7 +868,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                dbus_message_iter_get_basic(&value, &tethering);
 
                if (technology->tethering == tethering) {
-                       if (tethering == FALSE)
+                       if (!tethering)
                                return __connman_error_already_disabled(msg);
                        else
                                return __connman_error_already_enabled(msg);
@@ -860,7 +882,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                technology_save(technology);
 
-       } else if (g_str_equal(name, "TetheringIdentifier") == TRUE) {
+       } else if (g_str_equal(name, "TetheringIdentifier")) {
                const char *str;
 
                dbus_message_iter_get_basic(&value, &str);
@@ -882,7 +904,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                                                DBUS_TYPE_STRING,
                                                &technology->tethering_ident);
                }
-       } else if (g_str_equal(name, "TetheringPassphrase") == TRUE) {
+       } else if (g_str_equal(name, "TetheringPassphrase")) {
                const char *str;
 
                dbus_message_iter_get_basic(&value, &str);
@@ -904,8 +926,8 @@ static DBusMessage *set_property(DBusConnection *conn,
                                        DBUS_TYPE_STRING,
                                        &technology->tethering_passphrase);
                }
-       } else if (g_str_equal(name, "Powered") == TRUE) {
-               connman_bool_t enable;
+       } else if (g_str_equal(name, "Powered")) {
+               dbus_bool_t enable;
 
                if (type != DBUS_TYPE_BOOLEAN)
                        return __connman_error_invalid_arguments(msg);
@@ -925,7 +947,7 @@ static void reply_scan_pending(struct connman_technology *technology, int err)
 
        DBG("technology %p err %d", technology, err);
 
-       while (technology->scan_pending != NULL) {
+       while (technology->scan_pending) {
                DBusMessage *msg = technology->scan_pending->data;
 
                DBG("reply to %s", dbus_message_get_sender(msg));
@@ -948,22 +970,21 @@ void __connman_technology_scan_started(struct connman_device *device)
        DBG("device %p", device);
 }
 
-void __connman_technology_scan_stopped(struct connman_device *device)
+void __connman_technology_scan_stopped(struct connman_device *device,
+                                       enum connman_service_type type)
 {
        int count = 0;
        struct connman_technology *technology;
-       enum connman_service_type type;
        GSList *list;
 
-       type = __connman_device_get_service_type(device);
        technology = technology_find(type);
 
        DBG("technology %p device %p", technology, device);
 
-       if (technology == NULL)
+       if (!technology)
                return;
 
-       for (list = technology->device_list; list != NULL; list = list->next) {
+       for (list = technology->device_list; list; list = list->next) {
                struct connman_device *other_device = list->data;
 
                if (device == other_device)
@@ -972,7 +993,7 @@ void __connman_technology_scan_stopped(struct connman_device *device)
                if (__connman_device_get_service_type(other_device) != type)
                        continue;
 
-               if (connman_device_get_scanning(other_device) == TRUE)
+               if (connman_device_get_scanning(other_device))
                        count += 1;
        }
 
@@ -983,7 +1004,7 @@ void __connman_technology_scan_stopped(struct connman_device *device)
 void __connman_technology_notify_regdom_by_device(struct connman_device *device,
                                                int result, const char *alpha2)
 {
-       connman_bool_t regdom_set = FALSE;
+       bool regdom_set = false;
        struct connman_technology *technology;
        enum connman_service_type type;
        GSList *tech_drivers;
@@ -991,25 +1012,25 @@ void __connman_technology_notify_regdom_by_device(struct connman_device *device,
        type = __connman_device_get_service_type(device);
        technology = technology_find(type);
 
-       if (technology == NULL)
+       if (!technology)
                return;
 
        if (result < 0) {
 
                for (tech_drivers = technology->driver_list;
-                    tech_drivers != NULL;
+                    tech_drivers;
                     tech_drivers = g_slist_next(tech_drivers)) {
                        struct connman_technology_driver *driver =
                                tech_drivers->data;
 
-                       if (driver->set_regdom != NULL) {
+                       if (driver->set_regdom) {
                                driver->set_regdom(technology, alpha2);
-                               regdom_set = TRUE;
+                               regdom_set = true;
                        }
 
                }
 
-               if (regdom_set == FALSE)
+               if (!regdom_set)
                        alpha2 = NULL;
        }
 
@@ -1021,7 +1042,7 @@ static DBusMessage *scan(DBusConnection *conn, DBusMessage *msg, void *data)
        struct connman_technology *technology = data;
        int err;
 
-       DBG ("technology %p request from %s", technology,
+       DBG("technology %p request from %s", technology,
                        dbus_message_get_sender(msg));
 
        dbus_message_ref(msg);
@@ -1052,25 +1073,72 @@ static const GDBusSignalTable technology_signals[] = {
        { },
 };
 
-static gboolean technology_dbus_register(struct connman_technology *technology)
+static bool technology_dbus_register(struct connman_technology *technology)
 {
-       if (technology->dbus_registered == TRUE ||
-                               (technology->rfkill_driven == TRUE &&
-                                technology->hardblocked == TRUE))
-               return TRUE;
-
-       if (g_dbus_register_interface(connection, technology->path,
-                               CONNMAN_TECHNOLOGY_INTERFACE,
-                               technology_methods, technology_signals,
-                               NULL, technology, NULL) == FALSE) {
+       if (technology->dbus_registered ||
+                               (technology->rfkill_driven &&
+                                technology->hardblocked))
+               return true;
+
+       if (!g_dbus_register_interface(connection, technology->path,
+                                       CONNMAN_TECHNOLOGY_INTERFACE,
+                                       technology_methods, technology_signals,
+                                       NULL, technology, NULL)) {
                connman_error("Failed to register %s", technology->path);
-               return FALSE;
+               return false;
        }
 
        technology_added_signal(technology);
-       technology->dbus_registered = TRUE;
+       technology->dbus_registered = true;
+
+       return true;
+}
+
+static void technology_dbus_unregister(struct connman_technology *technology)
+{
+       if (!technology->dbus_registered)
+               return;
+
+       technology_removed_signal(technology);
+       g_dbus_unregister_interface(connection, technology->path,
+               CONNMAN_TECHNOLOGY_INTERFACE);
 
-       return TRUE;
+       technology->dbus_registered = false;
+}
+
+static void technology_put(struct connman_technology *technology)
+{
+       DBG("technology %p", technology);
+
+       if (__sync_sub_and_fetch(&technology->refcount, 1) > 0)
+               return;
+
+       reply_scan_pending(technology, -EINTR);
+
+       while (technology->driver_list) {
+               struct connman_technology_driver *driver;
+
+               driver = technology->driver_list->data;
+
+               if (driver->remove)
+                       driver->remove(technology);
+
+               technology->driver_list =
+                       g_slist_delete_link(technology->driver_list,
+                                       technology->driver_list);
+       }
+
+       technology_list = g_slist_remove(technology_list, technology);
+
+       technology_dbus_unregister(technology);
+
+       g_slist_free(technology->device_list);
+
+       g_free(technology->path);
+       g_free(technology->regdom);
+       g_free(technology->tethering_ident);
+       g_free(technology->tethering_passphrase);
+       g_free(technology);
 }
 
 static struct connman_technology *technology_get(enum connman_service_type type)
@@ -1084,12 +1152,13 @@ static struct connman_technology *technology_get(enum connman_service_type type)
        DBG("type %d", type);
 
        str = __connman_service_type2string(type);
-       if (str == NULL)
+       if (!str)
                return NULL;
 
        technology = technology_find(type);
-       if (technology != NULL) {
-               __sync_fetch_and_add(&technology->refcount, 1);
+       if (technology) {
+               if (type != CONNMAN_SERVICE_TYPE_P2P)
+                       __sync_fetch_and_add(&technology->refcount, 1);
                return technology;
        }
 
@@ -1103,121 +1172,139 @@ static struct connman_technology *technology_get(enum connman_service_type type)
                }
        }
 
-       if (tech_drivers == NULL) {
+       if (!tech_drivers) {
                DBG("No matching drivers found for %s.",
                                __connman_service_type2string(type));
                return NULL;
        }
 
        technology = g_try_new0(struct connman_technology, 1);
-       if (technology == NULL)
+       if (!technology)
                return NULL;
 
        technology->refcount = 1;
-
-       technology->rfkill_driven = FALSE;
-       technology->softblocked = FALSE;
-       technology->hardblocked = FALSE;
-
        technology->type = type;
        technology->path = g_strdup_printf("%s/technology/%s",
                                                        CONNMAN_PATH, str);
+       if (type == CONNMAN_SERVICE_TYPE_P2P) {
+               struct connman_technology *wifi;
 
-       technology->device_list = NULL;
-
-       technology->pending_reply = NULL;
-
-       technology_load(technology);
-
-       if (technology_dbus_register(technology) == FALSE) {
-               g_free(technology);
-               return NULL;
+               wifi = technology_find(CONNMAN_SERVICE_TYPE_WIFI);
+               if (wifi)
+                       technology->enabled = wifi->enabled;
        }
 
+       technology_load(technology);
        technology_list = g_slist_prepend(technology_list, technology);
-
        technology->driver_list = tech_drivers;
 
-       for (list = tech_drivers; list != NULL; list = g_slist_next(list)) {
+       for (list = tech_drivers; list; list = list->next) {
                driver = list->data;
 
-               if (driver->probe != NULL && driver->probe(technology) < 0)
+               if (driver->probe && driver->probe(technology) < 0)
                        DBG("Driver probe failed for technology %p",
                                        technology);
        }
 
+       if (!technology_dbus_register(technology)) {
+               technology_put(technology);
+               return NULL;
+       }
+
        DBG("technology %p", technology);
 
        return technology;
 }
 
-static void technology_dbus_unregister(struct connman_technology *technology)
+int connman_technology_driver_register(struct connman_technology_driver *driver)
 {
-       if (technology->dbus_registered == FALSE)
-               return;
+       GSList *list;
+       struct connman_device *device;
+       enum connman_service_type type;
 
-       technology_removed_signal(technology);
-       g_dbus_unregister_interface(connection, technology->path,
-               CONNMAN_TECHNOLOGY_INTERFACE);
+       for (list = driver_list; list; list = list->next) {
+               if (list->data == driver)
+                       goto exist;
+       }
 
-       technology->dbus_registered = FALSE;
-}
+       DBG("Registering %s driver", driver->name);
 
-static void technology_put(struct connman_technology *technology)
-{
-       DBG("technology %p", technology);
+       driver_list = g_slist_insert_sorted(driver_list, driver,
+                                                       compare_priority);
 
-       if (__sync_sub_and_fetch(&technology->refcount, 1) > 0)
-               return;
+       /*
+        * Check for technology less devices if this driver
+        * can service any of them.
+       */
+       for (list = techless_device_list; list; list = list->next) {
+               device = list->data;
 
-       reply_scan_pending(technology, -EINTR);
+               type = __connman_device_get_service_type(device);
+               if (type != driver->type)
+                       continue;
 
-       while (technology->driver_list != NULL) {
-               struct connman_technology_driver *driver;
+               techless_device_list = g_slist_remove(techless_device_list,
+                                                               device);
 
-               driver = technology->driver_list->data;
+               __connman_technology_add_device(device);
+       }
 
-               if (driver->remove != NULL)
-                       driver->remove(technology);
+       /* Check for orphaned rfkill switches. */
+       g_hash_table_foreach(rfkill_list, rfkill_check,
+                                       GINT_TO_POINTER(driver->type));
 
-               technology->driver_list =
-                       g_slist_delete_link(technology->driver_list,
-                                       technology->driver_list);
+exist:
+       if (driver->type == CONNMAN_SERVICE_TYPE_P2P) {
+               if (!technology_get(CONNMAN_SERVICE_TYPE_P2P))
+                       return -ENOMEM;
        }
 
-       technology_list = g_slist_remove(technology_list, technology);
+       return 0;
+}
 
-       technology_dbus_unregister(technology);
+void connman_technology_driver_unregister(struct connman_technology_driver *driver)
+{
+       GSList *list, *tech_drivers;
+       struct connman_technology *technology;
+       struct connman_technology_driver *current;
 
-       g_slist_free(technology->device_list);
+       DBG("Unregistering driver %p name %s", driver, driver->name);
 
-       g_free(technology->path);
-       g_free(technology->regdom);
-       g_free(technology->tethering_ident);
-       g_free(technology->tethering_passphrase);
-       g_free(technology);
-}
+       for (list = technology_list; list; list = list->next) {
+               technology = list->data;
 
-static void enable_tethering(struct connman_technology *technology)
-{
-       int ret;
+               for (tech_drivers = technology->driver_list; tech_drivers;
+                               tech_drivers = g_slist_next(tech_drivers)) {
+                       current = tech_drivers->data;
+                       if (driver != current)
+                               continue;
 
-       if (connman_setting_get_bool("PersistentTetheringMode") == FALSE)
-               return;
+                       if (driver->remove)
+                               driver->remove(technology);
 
-       ret = set_tethering(technology, TRUE);
-       if (ret < 0 && ret != -EALREADY)
-               DBG("Cannot enable tethering yet for %s (%d/%s)",
-                       get_name(technology->type),
-                       -ret, strerror(-ret));
+                       technology->driver_list =
+                               g_slist_remove(technology->driver_list,
+                                                               driver);
+                       break;
+               }
+       }
+
+       driver_list = g_slist_remove(driver_list, driver);
+
+       if (driver->type == CONNMAN_SERVICE_TYPE_P2P) {
+               technology = technology_find(CONNMAN_SERVICE_TYPE_P2P);
+               if (technology)
+                       technology_put(technology);
+       }
 }
 
 void __connman_technology_add_interface(enum connman_service_type type,
-                               int index, const char *name, const char *ident)
+                               int index, const char *ident)
 {
        struct connman_technology *technology;
        GSList *tech_drivers;
        struct connman_technology_driver *driver;
+       char *name;
 
        switch (type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
@@ -1230,22 +1317,24 @@ void __connman_technology_add_interface(enum connman_service_type type,
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
        case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        }
 
+       name = connman_inet_ifname(index);
        connman_info("Adding interface %s [ %s ]", name,
                                __connman_service_type2string(type));
 
        technology = technology_find(type);
 
-       if (technology == NULL)
-               return;
+       if (!technology)
+               goto out;
 
-       for (tech_drivers = technology->driver_list; tech_drivers != NULL;
+       for (tech_drivers = technology->driver_list; tech_drivers;
             tech_drivers = g_slist_next(tech_drivers)) {
                driver = tech_drivers->data;
 
-               if(driver->add_interface != NULL)
+               if (driver->add_interface)
                        driver->add_interface(technology, index, name, ident);
        }
 
@@ -1253,16 +1342,20 @@ void __connman_technology_add_interface(enum connman_service_type type,
         * At this point we can try to enable tethering automatically as
         * now the interfaces are set properly.
         */
-       if (technology->tethering_persistent == TRUE)
+       if (technology->tethering_persistent)
                enable_tethering(technology);
+
+out:
+       g_free(name);
 }
 
 void __connman_technology_remove_interface(enum connman_service_type type,
-                               int index, const char *name, const char *ident)
+                               int index, const char *ident)
 {
        struct connman_technology *technology;
        GSList *tech_drivers;
        struct connman_technology_driver *driver;
+       char *name;
 
        switch (type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
@@ -1275,22 +1368,25 @@ void __connman_technology_remove_interface(enum connman_service_type type,
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
        case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                break;
        }
 
+       name = connman_inet_ifname(index);
        connman_info("Remove interface %s [ %s ]", name,
                                __connman_service_type2string(type));
+       g_free(name);
 
        technology = technology_find(type);
 
-       if (technology == NULL)
+       if (!technology)
                return;
 
-       for (tech_drivers = technology->driver_list; tech_drivers != NULL;
+       for (tech_drivers = technology->driver_list; tech_drivers;
             tech_drivers = g_slist_next(tech_drivers)) {
                driver = tech_drivers->data;
 
-               if(driver->remove_interface != NULL)
+               if (driver->remove_interface)
                        driver->remove_interface(technology, index);
        }
 }
@@ -1305,7 +1401,7 @@ int __connman_technology_add_device(struct connman_device *device)
        DBG("device %p type %s", device, get_name(type));
 
        technology = technology_get(type);
-       if (technology == NULL) {
+       if (!technology) {
                /*
                 * Since no driver can be found for this device at the moment we
                 * add it to the techless device list.
@@ -1317,8 +1413,8 @@ int __connman_technology_add_device(struct connman_device *device)
        }
 
        __sync_synchronize();
-       if (technology->rfkill_driven == TRUE) {
-               if (technology->enabled == TRUE)
+       if (technology->rfkill_driven) {
+               if (technology->enabled)
                        __connman_device_enable(device);
                else
                        __connman_device_disable(device);
@@ -1326,8 +1422,8 @@ int __connman_technology_add_device(struct connman_device *device)
                goto done;
        }
 
-       if (technology->enable_persistent == TRUE &&
-                                       global_offlinemode == FALSE) {
+       if (technology->enable_persistent &&
+                                       !global_offlinemode) {
                int err = __connman_device_enable(device);
                /*
                 * connman_technology_add_device() calls __connman_device_enable()
@@ -1339,7 +1435,7 @@ int __connman_technology_add_device(struct connman_device *device)
                        __connman_technology_enabled(type);
        }
        /* if technology persistent state is offline */
-       if (technology->enable_persistent == FALSE)
+       if (!technology->enable_persistent)
                __connman_device_disable(device);
 
 done:
@@ -1359,7 +1455,7 @@ int __connman_technology_remove_device(struct connman_device *device)
        type = __connman_device_get_service_type(device);
 
        technology = technology_find(type);
-       if (technology == NULL) {
+       if (!technology) {
                techless_device_list = g_slist_remove(techless_device_list,
                                                                device);
                return -ENXIO;
@@ -1368,65 +1464,28 @@ int __connman_technology_remove_device(struct connman_device *device)
        technology->device_list = g_slist_remove(technology->device_list,
                                                                device);
 
-       if (technology->tethering == TRUE)
-               set_tethering(technology, FALSE);
+       if (technology->tethering)
+               set_tethering(technology, false);
 
        technology_put(technology);
 
        return 0;
 }
 
-static void powered_changed(struct connman_technology *technology)
-{
-       if (technology->dbus_registered == FALSE)
-               return;
-
-       if (technology->pending_reply != NULL) {
-               g_dbus_send_reply(connection,
-                               technology->pending_reply, DBUS_TYPE_INVALID);
-               dbus_message_unref(technology->pending_reply);
-               technology->pending_reply = NULL;
-
-               g_source_remove(technology->pending_timeout);
-               technology->pending_timeout = 0;
-       }
-
-       __sync_synchronize();
-       connman_dbus_property_changed_basic(technology->path,
-                       CONNMAN_TECHNOLOGY_INTERFACE, "Powered",
-                       DBUS_TYPE_BOOLEAN, &technology->enabled);
-}
-
-static int technology_enabled(struct connman_technology *technology)
-{
-       __sync_synchronize();
-       if (technology->enabled == TRUE)
-               return -EALREADY;
-
-       technology->enabled = TRUE;
-
-       if (technology->tethering_persistent == TRUE)
-               enable_tethering(technology);
-
-       powered_changed(technology);
-
-       return 0;
-}
-
 int __connman_technology_enabled(enum connman_service_type type)
 {
        struct connman_technology *technology;
 
        technology = technology_find(type);
-       if (technology == NULL)
+       if (!technology)
                return -ENXIO;
 
        DBG("technology %p type %s rfkill %d enabled %d", technology,
                get_name(type), technology->rfkill_driven,
                technology->enabled);
 
-       if (technology->rfkill_driven == TRUE) {
-               if (technology->tethering_persistent == TRUE)
+       if (technology->rfkill_driven) {
+               if (technology->tethering_persistent)
                        enable_tethering(technology);
                return 0;
        }
@@ -1434,42 +1493,29 @@ int __connman_technology_enabled(enum connman_service_type type)
        return technology_enabled(technology);
 }
 
-static int technology_disabled(struct connman_technology *technology)
-{
-       __sync_synchronize();
-       if (technology->enabled == FALSE)
-               return -EALREADY;
-
-       technology->enabled = FALSE;
-
-       powered_changed(technology);
-
-       return 0;
-}
-
 int __connman_technology_disabled(enum connman_service_type type)
 {
        struct connman_technology *technology;
        GSList *list;
 
        technology = technology_find(type);
-       if (technology == NULL)
+       if (!technology)
                return -ENXIO;
 
-       if (technology->rfkill_driven == TRUE)
+       if (technology->rfkill_driven)
                return 0;
 
-       for (list = technology->device_list; list != NULL; list = list->next) {
+       for (list = technology->device_list; list; list = list->next) {
                struct connman_device *device = list->data;
 
-               if (connman_device_get_powered(device) == TRUE)
+               if (connman_device_get_powered(device))
                        return 0;
        }
 
        return technology_disabled(technology);
 }
 
-int __connman_technology_set_offlinemode(connman_bool_t offlinemode)
+int __connman_technology_set_offlinemode(bool offlinemode)
 {
        GSList *list;
        int err = -EINVAL, enabled_tech_count = 0;
@@ -1497,6 +1543,9 @@ int __connman_technology_set_offlinemode(connman_bool_t offlinemode)
                if (offlinemode)
                        err = technology_disable(technology);
                else {
+                       if (technology->hardblocked)
+                               continue;
+
                        if (technology->enable_persistent) {
                                err = technology_enable(technology);
                                enabled_tech_count++;
@@ -1515,30 +1564,32 @@ int __connman_technology_set_offlinemode(connman_bool_t offlinemode)
 }
 
 void __connman_technology_set_connected(enum connman_service_type type,
-               connman_bool_t connected)
+               bool connected)
 {
        struct connman_technology *technology;
+       dbus_bool_t val;
 
        technology = technology_find(type);
-       if (technology == NULL)
+       if (!technology)
                return;
 
        DBG("technology %p connected %d", technology, connected);
 
        technology->connected = connected;
 
+       val = connected;
        connman_dbus_property_changed_basic(technology->path,
                        CONNMAN_TECHNOLOGY_INTERFACE, "Connected",
-                       DBUS_TYPE_BOOLEAN, &connected);
+                       DBUS_TYPE_BOOLEAN, &val);
 }
 
-static connman_bool_t technology_apply_rfkill_change(struct connman_technology *technology,
-                                               connman_bool_t softblock,
-                                               connman_bool_t hardblock,
-                                               connman_bool_t new_rfkill)
+static bool technology_apply_rfkill_change(struct connman_technology *technology,
+                                               bool softblock,
+                                               bool hardblock,
+                                               bool new_rfkill)
 {
-       gboolean hardblock_changed = FALSE;
-       gboolean apply = TRUE;
+       bool hardblock_changed = false;
+       bool apply = true;
        GList *start, *list;
 
        DBG("technology %p --> %d/%d vs %d/%d",
@@ -1548,53 +1599,58 @@ static connman_bool_t technology_apply_rfkill_change(struct connman_technology *
        if (technology->hardblocked == hardblock)
                goto softblock_change;
 
-       if (!(new_rfkill == TRUE && hardblock == FALSE)) {
+       if (!(new_rfkill && !hardblock)) {
                start = g_hash_table_get_values(rfkill_list);
 
-               for (list = start; list != NULL; list = list->next) {
+               for (list = start; list; list = list->next) {
                        struct connman_rfkill *rfkill = list->data;
 
                        if (rfkill->type != technology->type)
                                continue;
 
                        if (rfkill->hardblock != hardblock)
-                               apply = FALSE;
+                               apply = false;
                }
 
                g_list_free(start);
        }
 
-       if (apply == FALSE)
+       if (!apply)
                goto softblock_change;
 
        technology->hardblocked = hardblock;
-       hardblock_changed = TRUE;
+       hardblock_changed = true;
 
 softblock_change:
-       if (apply == FALSE && technology->softblocked != softblock)
-               apply = TRUE;
+       if (!apply && technology->softblocked != softblock)
+               apply = true;
 
-       if (apply == FALSE)
+       if (!apply)
                return technology->hardblocked;
 
        technology->softblocked = softblock;
 
-       if (technology->hardblocked == TRUE ||
-                                       technology->softblocked == TRUE) {
+       if (technology->hardblocked ||
+                                       technology->softblocked) {
                if (technology_disabled(technology) != -EALREADY)
-                       technology_affect_devices(technology, FALSE);
-       } else if (technology->hardblocked == FALSE &&
-                                       technology->softblocked == FALSE) {
+                       technology_affect_devices(technology, false);
+       } else if (!technology->hardblocked &&
+                                       !technology->softblocked) {
                if (technology_enabled(technology) != -EALREADY)
-                       technology_affect_devices(technology, TRUE);
+                       technology_affect_devices(technology, true);
        }
 
-       if (hardblock_changed == TRUE) {
-               if (technology->hardblocked == TRUE) {
+       if (hardblock_changed) {
+               if (technology->hardblocked) {
                        DBG("%s is switched off.", get_name(technology->type));
                        technology_dbus_unregister(technology);
-               } else
+               } else {
+                       DBG("%s is switched on.", get_name(technology->type));
                        technology_dbus_register(technology);
+
+                       if (global_offlinemode)
+                               __connman_rfkill_block(technology->type, true);
+               }
        }
 
        return technology->hardblocked;
@@ -1602,8 +1658,8 @@ softblock_change:
 
 int __connman_technology_add_rfkill(unsigned int index,
                                        enum connman_service_type type,
-                                               connman_bool_t softblock,
-                                               connman_bool_t hardblock)
+                                               bool softblock,
+                                               bool hardblock)
 {
        struct connman_technology *technology;
        struct connman_rfkill *rfkill;
@@ -1612,11 +1668,11 @@ int __connman_technology_add_rfkill(unsigned int index,
                                                        softblock, hardblock);
 
        rfkill = g_hash_table_lookup(rfkill_list, GINT_TO_POINTER(index));
-       if (rfkill != NULL)
+       if (rfkill)
                goto done;
 
        rfkill = g_try_new0(struct connman_rfkill, 1);
-       if (rfkill == NULL)
+       if (!rfkill)
                return -ENOMEM;
 
        rfkill->index = index;
@@ -1629,36 +1685,37 @@ int __connman_technology_add_rfkill(unsigned int index,
 done:
        technology = technology_get(type);
        /* If there is no driver for this type, ignore it. */
-       if (technology == NULL)
+       if (!technology)
                return -ENXIO;
 
-       technology->rfkill_driven = TRUE;
+       technology->rfkill_driven = true;
 
        /* If hardblocked, there is no need to handle softblocked state */
        if (technology_apply_rfkill_change(technology,
-                               softblock, hardblock, TRUE) == TRUE)
+                               softblock, hardblock, true))
+               return 0;
+
+       if (global_offlinemode)
                return 0;
 
        /*
         * Depending on softblocked state we unblock/block according to
         * offlinemode and persistente state.
         */
-       if (technology->softblocked == TRUE &&
-                               global_offlinemode == FALSE &&
-                               technology->enable_persistent == TRUE)
-               return __connman_rfkill_block(type, FALSE);
-       else if (technology->softblocked == FALSE &&
-                       (global_offlinemode == TRUE ||
-                               technology->enable_persistent == FALSE))
-               return __connman_rfkill_block(type, TRUE);
+       if (technology->softblocked &&
+                               technology->enable_persistent)
+               return __connman_rfkill_block(type, false);
+       else if (!technology->softblocked &&
+                               !technology->enable_persistent)
+               return __connman_rfkill_block(type, true);
 
        return 0;
 }
 
 int __connman_technology_update_rfkill(unsigned int index,
                                        enum connman_service_type type,
-                                               connman_bool_t softblock,
-                                               connman_bool_t hardblock)
+                                               bool softblock,
+                                               bool hardblock)
 {
        struct connman_technology *technology;
        struct connman_rfkill *rfkill;
@@ -1666,7 +1723,7 @@ int __connman_technology_update_rfkill(unsigned int index,
        DBG("index %u soft %u hard %u", index, softblock, hardblock);
 
        rfkill = g_hash_table_lookup(rfkill_list, GINT_TO_POINTER(index));
-       if (rfkill == NULL)
+       if (!rfkill)
                return -ENXIO;
 
        if (rfkill->softblock == softblock &&
@@ -1678,27 +1735,17 @@ int __connman_technology_update_rfkill(unsigned int index,
 
        technology = technology_find(type);
        /* If there is no driver for this type, ignore it. */
-       if (technology == NULL)
+       if (!technology)
                return -ENXIO;
 
-       /* If hardblocked, there is no need to handle softblocked state */
-       if (technology_apply_rfkill_change(technology,
-                               softblock, hardblock, FALSE) == TRUE)
-               return 0;
+       technology_apply_rfkill_change(technology, softblock, hardblock,
+                                                               false);
 
-       if (global_offlinemode == TRUE)
-               return 0;
-
-       /*
-        * Depending on softblocked state we unblock/block according to
-        * persistent state.
-        */
-       if (technology->softblocked == TRUE &&
-                               technology->enable_persistent == TRUE)
-               return __connman_rfkill_block(type, FALSE);
-       else if (technology->softblocked == FALSE &&
-                               technology->enable_persistent == FALSE)
-               return __connman_rfkill_block(type, TRUE);
+       if (technology->hardblocked)
+               DBG("%s hardblocked", get_name(technology->type));
+       else
+               DBG("%s is%s softblocked", get_name(technology->type),
+                       technology->softblocked ? "" : " not");
 
        return 0;
 }
@@ -1712,17 +1759,17 @@ int __connman_technology_remove_rfkill(unsigned int index,
        DBG("index %u", index);
 
        rfkill = g_hash_table_lookup(rfkill_list, GINT_TO_POINTER(index));
-       if (rfkill == NULL)
+       if (!rfkill)
                return -ENXIO;
 
        g_hash_table_remove(rfkill_list, GINT_TO_POINTER(index));
 
        technology = technology_find(type);
-       if (technology == NULL)
+       if (!technology)
                return -ENXIO;
 
        technology_apply_rfkill_change(technology,
-               technology->softblocked, !technology->hardblocked, FALSE);
+               technology->softblocked, !technology->hardblocked, false);
 
        technology_put(technology);
 
index 7042040..c7e17f5 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *  Copyright (C) 2011 ProFUSION embedded systems
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -133,7 +133,7 @@ static void dhcp_server_error(GDHCPServerError error)
 }
 
 static GDHCPServer *dhcp_server_start(const char *bridge,
-                               const char *router, const charsubnet,
+                               const char *router, const char *subnet,
                                const char *start_ip, const char *end_ip,
                                unsigned int lease_time, const char *dns)
 {
@@ -148,7 +148,7 @@ static GDHCPServer *dhcp_server_start(const char *bridge,
                return NULL;
 
        dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &error);
-       if (dhcp_server == NULL) {
+       if (!dhcp_server) {
                dhcp_server_error(error);
                return NULL;
        }
@@ -168,7 +168,7 @@ static GDHCPServer *dhcp_server_start(const char *bridge,
 
 static void dhcp_server_stop(GDHCPServer *server)
 {
-       if (server == NULL)
+       if (!server)
                return;
 
        g_dhcp_server_unref(server);
@@ -176,6 +176,7 @@ static void dhcp_server_stop(GDHCPServer *server)
 
 static void tethering_restart(struct connman_ippool *pool, void *user_data)
 {
+       DBG("pool %p", pool);
        __connman_tethering_set_disabled();
        __connman_tethering_set_enabled();
 }
@@ -207,7 +208,7 @@ void __connman_tethering_set_enabled(void)
        index = connman_inet_ifindex(BRIDGE_NAME);
        dhcp_ippool = __connman_ippool_create(index, 2, 252,
                                                tethering_restart, NULL);
-       if (dhcp_ippool == NULL) {
+       if (!dhcp_ippool) {
                connman_error("Fail to create IP pool");
                __connman_bridge_remove(BRIDGE_NAME);
                __sync_fetch_and_sub(&tethering_enabled, 1);
@@ -220,7 +221,9 @@ void __connman_tethering_set_enabled(void)
        start_ip = __connman_ippool_get_start_ip(dhcp_ippool);
        end_ip = __connman_ippool_get_end_ip(dhcp_ippool);
 
-       err = __connman_bridge_enable(BRIDGE_NAME, gateway, broadcast);
+       err = __connman_bridge_enable(BRIDGE_NAME, gateway,
+                       __connman_ipaddress_netmask_prefix_len(subnet_mask),
+                       broadcast);
        if (err < 0 && err != -EALREADY) {
                __connman_ippool_unref(dhcp_ippool);
                __connman_bridge_remove(BRIDGE_NAME);
@@ -229,12 +232,12 @@ void __connman_tethering_set_enabled(void)
        }
 
        ns = connman_setting_get_string_list("FallbackNameservers");
-       if (ns != NULL) {
-               if (ns[0] != NULL) {
+       if (ns) {
+               if (ns[0]) {
                        g_free(private_network_primary_dns);
                        private_network_primary_dns = g_strdup(ns[0]);
                }
-               if (ns[1] != NULL) {
+               if (ns[1]) {
                        g_free(private_network_secondary_dns);
                        private_network_secondary_dns = g_strdup(ns[1]);
                }
@@ -256,7 +259,7 @@ void __connman_tethering_set_enabled(void)
                                                gateway, subnet_mask,
                                                start_ip, end_ip,
                                                24 * 3600, dns);
-       if (tethering_dhcp_server == NULL) {
+       if (!tethering_dhcp_server) {
                __connman_bridge_disable(BRIDGE_NAME);
                __connman_ippool_unref(dhcp_ippool);
                __connman_bridge_remove(BRIDGE_NAME);
@@ -264,9 +267,22 @@ void __connman_tethering_set_enabled(void)
                return;
        }
 
-       prefixlen =
-               __connman_ipaddress_netmask_prefix_len(subnet_mask);
-       __connman_nat_enable(BRIDGE_NAME, start_ip, prefixlen);
+       prefixlen = __connman_ipaddress_netmask_prefix_len(subnet_mask);
+       err = __connman_nat_enable(BRIDGE_NAME, start_ip, prefixlen);
+       if (err < 0) {
+               connman_error("Cannot enable NAT %d/%s", err, strerror(-err));
+               dhcp_server_stop(tethering_dhcp_server);
+               __connman_bridge_disable(BRIDGE_NAME);
+               __connman_ippool_unref(dhcp_ippool);
+               __connman_bridge_remove(BRIDGE_NAME);
+               __sync_fetch_and_sub(&tethering_enabled, 1);
+               return;
+       }
+
+       err = __connman_ipv6pd_setup(BRIDGE_NAME);
+       if (err < 0 && err != -EINPROGRESS)
+               DBG("Cannot setup IPv6 prefix delegation %d/%s", err,
+                       strerror(-err));
 
        DBG("tethering started");
 }
@@ -277,12 +293,14 @@ void __connman_tethering_set_disabled(void)
 
        DBG("enabled %d", tethering_enabled - 1);
 
-       index = connman_inet_ifindex(BRIDGE_NAME);
-       __connman_dnsproxy_remove_listener(index);
-
        if (__sync_fetch_and_sub(&tethering_enabled, 1) != 1)
                return;
 
+       __connman_ipv6pd_cleanup();
+
+       index = connman_inet_ifindex(BRIDGE_NAME);
+       __connman_dnsproxy_remove_listener(index);
+
        __connman_nat_disable(BRIDGE_NAME);
 
        dhcp_server_stop(tethering_dhcp_server);
@@ -351,11 +369,11 @@ static void setup_tun_interface(unsigned int flags, unsigned change,
                                        DBUS_TYPE_STRING, &server_ip);
        connman_dbus_dict_append_basic(&dict, "PeerIPv4",
                                        DBUS_TYPE_STRING, &peer_ip);
-       if (pn->primary_dns != NULL)
+       if (pn->primary_dns)
                connman_dbus_dict_append_basic(&dict, "PrimaryDNS",
                                        DBUS_TYPE_STRING, &pn->primary_dns);
 
-       if (pn->secondary_dns != NULL)
+       if (pn->secondary_dns)
                connman_dbus_dict_append_basic(&dict, "SecondaryDNS",
                                        DBUS_TYPE_STRING, &pn->secondary_dns);
 
@@ -451,7 +469,7 @@ int __connman_private_network_request(DBusMessage *msg, const char *owner)
        err = connman_inet_set_mtu(index, DEFAULT_MTU);
 
        pn = g_try_new0(struct connman_private_network, 1);
-       if (pn == NULL) {
+       if (!pn) {
                err = -ENOMEM;
                goto error;
        }
@@ -462,14 +480,14 @@ int __connman_private_network_request(DBusMessage *msg, const char *owner)
                                        owner_disconnect, pn, NULL);
        pn->msg = msg;
        pn->reply = dbus_message_new_method_return(pn->msg);
-       if (pn->reply == NULL)
+       if (!pn->reply)
                goto error;
 
        pn->fd = fd;
        pn->interface = iface;
        pn->index = index;
        pn->pool = __connman_ippool_create(pn->index, 1, 1, ippool_disconnect, pn);
-       if (pn->pool == NULL) {
+       if (!pn->pool) {
                errno = -ENOMEM;
                goto error;
        }
@@ -497,7 +515,7 @@ int __connman_private_network_release(const char *path)
        struct connman_private_network *pn;
 
        pn = g_hash_table_lookup(pn_hash, path);
-       if (pn == NULL)
+       if (!pn)
                return -EACCES;
 
        g_hash_table_remove(pn_hash, path);
@@ -511,7 +529,7 @@ int __connman_tethering_init(void)
        tethering_enabled = 0;
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -EFAULT;
 
        pn_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -522,10 +540,10 @@ int __connman_tethering_init(void)
 
 void __connman_tethering_cleanup(void)
 {
-       DBG("");
+       DBG("enabled %d", tethering_enabled);
 
        __sync_synchronize();
-       if (tethering_enabled == 0) {
+       if (tethering_enabled > 0) {
                if (tethering_dhcp_server)
                        dhcp_server_stop(tethering_dhcp_server);
                __connman_bridge_disable(BRIDGE_NAME);
@@ -533,7 +551,7 @@ void __connman_tethering_cleanup(void)
                __connman_nat_disable(BRIDGE_NAME);
        }
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        g_hash_table_destroy(pn_hash);
index f3c1220..d41fa40 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -51,10 +51,10 @@ static void save_timeservers(char **servers)
        int cnt;
 
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
+       if (!keyfile)
                keyfile = g_key_file_new();
 
-       for (cnt = 0; servers != NULL && servers[cnt] != NULL; cnt++);
+       for (cnt = 0; servers && servers[cnt]; cnt++);
 
        g_key_file_set_string_list(keyfile, "global", "Timeservers",
                           (const gchar **)servers, cnt);
@@ -66,13 +66,13 @@ static void save_timeservers(char **servers)
        return;
 }
 
-static char **load_timeservers()
+static char **load_timeservers(void)
 {
        GKeyFile *keyfile;
        char **servers = NULL;
 
        keyfile = __connman_storage_load_global();
-       if (keyfile == NULL)
+       if (!keyfile)
                return NULL;
 
        servers = g_key_file_get_string_list(keyfile, "global",
@@ -83,14 +83,15 @@ static char **load_timeservers()
        return servers;
 }
 
-static void resolv_result(GResolvResultStatus status, char **results, gpointer user_data)
+static void resolv_result(GResolvResultStatus status, char **results,
+                               gpointer user_data)
 {
        int i;
 
        DBG("status %d", status);
 
        if (status == G_RESOLV_RESULT_STATUS_SUCCESS) {
-               if (results != NULL) {
+               if (results) {
                        for (i = 0; results[i]; i++) {
                                DBG("result[%d]: %s", i, results[i]);
                                if (i == 0)
@@ -121,7 +122,7 @@ static void resolv_result(GResolvResultStatus status, char **results, gpointer u
  */
 void __connman_timeserver_sync_next()
 {
-       if (ts_current != NULL) {
+       if (ts_current) {
                g_free(ts_current);
                ts_current = NULL;
        }
@@ -129,7 +130,7 @@ void __connman_timeserver_sync_next()
        __connman_ntp_stop();
 
        /* Get the 1st server in the list */
-       if (ts_list == NULL)
+       if (!ts_list)
                return;
 
        ts_current = ts_list->data;
@@ -158,10 +159,10 @@ GSList *__connman_timeserver_add_list(GSList *server_list,
 {
        GSList *list = server_list;
 
-       if (timeserver == NULL)
+       if (!timeserver)
                return server_list;
 
-       while (list != NULL) {
+       while (list) {
                char *existing_server = list->data;
                if (strcmp(timeserver, existing_server) == 0)
                        return server_list;
@@ -192,7 +193,7 @@ GSList *__connman_timeserver_get_all(struct connman_service *service)
        service_ts_config = connman_service_get_timeservers_config(service);
 
        /* First add Service Timeservers.Configuration to the list */
-       for (i = 0; service_ts_config != NULL && service_ts_config[i] != NULL;
+       for (i = 0; service_ts_config && service_ts_config[i];
                        i++)
                list = __connman_timeserver_add_list(list,
                                service_ts_config[i]);
@@ -200,24 +201,24 @@ GSList *__connman_timeserver_get_all(struct connman_service *service)
        service_ts = connman_service_get_timeservers(service);
 
        /* First add Service Timeservers via DHCP to the list */
-       for (i = 0; service_ts != NULL && service_ts[i] != NULL; i++)
+       for (i = 0; service_ts && service_ts[i]; i++)
                list = __connman_timeserver_add_list(list, service_ts[i]);
 
        network = __connman_service_get_network(service);
-       if (network != NULL) {
+       if (network) {
                index = connman_network_get_index(network);
                service_gw = __connman_ipconfig_get_gateway_from_index(index,
                        CONNMAN_IPCONFIG_TYPE_ALL);
 
                /* Then add Service Gateway to the list */
-               if (service_gw != NULL)
+               if (service_gw)
                        list = __connman_timeserver_add_list(list, service_gw);
        }
 
        /* Then add Global Timeservers to the list */
        timeservers = load_timeservers();
 
-       for (i = 0; timeservers != NULL && timeservers[i] != NULL; i++)
+       for (i = 0; timeservers && timeservers[i]; i++)
                list = __connman_timeserver_add_list(list, timeservers[i]);
 
        g_strfreev(timeservers);
@@ -225,19 +226,19 @@ GSList *__connman_timeserver_get_all(struct connman_service *service)
        fallback_ts = connman_setting_get_string_list("FallbackTimeservers");
 
        /* Lastly add the fallback servers */
-       for (i = 0; fallback_ts != NULL && fallback_ts[i] != NULL; i++)
+       for (i = 0; fallback_ts && fallback_ts[i]; i++)
                list = __connman_timeserver_add_list(list, fallback_ts[i]);
 
        return g_slist_reverse(list);
 }
 
-static gboolean ts_recheck(void *user_data)
+static gboolean ts_recheck(gpointer user_data)
 {
        GSList *ts;
 
        ts = __connman_timeserver_get_all(__connman_service_get_default());
 
-       if (ts == NULL) {
+       if (!ts) {
                DBG("timeservers disabled");
 
                return TRUE;
@@ -268,7 +269,7 @@ static void ts_recheck_disable(void)
        g_source_remove(ts_recheck_id);
        ts_recheck_id = 0;
 
-       if (ts_current != NULL) {
+       if (ts_current) {
                g_free(ts_current);
                ts_current = NULL;
        }
@@ -291,15 +292,15 @@ int __connman_timeserver_sync(struct connman_service *default_service)
 {
        struct connman_service *service;
 
-       if (default_service != NULL)
+       if (default_service)
                service = default_service;
        else
                service = __connman_service_get_default();
 
-       if (service == NULL)
+       if (!service)
                return -EINVAL;
 
-       if (resolv == NULL)
+       if (!resolv)
                return 0;
        /*
         * Before we start creating the new timeserver list we must stop
@@ -319,14 +320,14 @@ int __connman_timeserver_sync(struct connman_service *default_service)
 
        __connman_service_timeserver_changed(service, ts_list);
 
-       if (ts_list == NULL) {
+       if (!ts_list) {
                DBG("No timeservers set.");
                return 0;
        }
 
        ts_recheck_enable();
 
-        __connman_timeserver_sync_next();
+       __connman_timeserver_sync_next();
 
        return 0;
 }
@@ -343,21 +344,21 @@ static int timeserver_start(struct connman_service *service)
                return -EINVAL;
 
        nameservers = connman_service_get_nameservers(service);
-       if (nameservers == NULL)
+       if (!nameservers)
                return -EINVAL;
 
        /* Stop an already ongoing resolution, if there is one */
-       if (resolv != NULL && resolv_id > 0)
+       if (resolv && resolv_id > 0)
                g_resolv_cancel_lookup(resolv, resolv_id);
 
        /* get rid of the old resolver */
-       if (resolv != NULL) {
+       if (resolv) {
                g_resolv_unref(resolv);
                resolv = NULL;
        }
 
        resolv = g_resolv_new(i);
-       if (resolv == NULL) {
+       if (!resolv) {
                g_strfreev(nameservers);
                return -ENOMEM;
        }
@@ -365,7 +366,7 @@ static int timeserver_start(struct connman_service *service)
        if (getenv("CONNMAN_RESOLV_DEBUG"))
                g_resolv_set_debug(resolv, resolv_debug, "RESOLV");
 
-       for (i = 0; nameservers[i] != NULL; i++)
+       for (i = 0; nameservers[i]; i++)
                g_resolv_add_nameserver(resolv, nameservers[i], 53, 0);
 
        g_strfreev(nameservers);
@@ -373,11 +374,11 @@ static int timeserver_start(struct connman_service *service)
        return __connman_timeserver_sync(service);
 }
 
-static void timeserver_stop()
+static void timeserver_stop(void)
 {
        DBG(" ");
 
-       if (resolv != NULL) {
+       if (resolv) {
                g_resolv_unref(resolv);
                resolv = NULL;
        }
@@ -410,7 +411,7 @@ char **__connman_timeserver_system_get()
 
 static void default_changed(struct connman_service *default_service)
 {
-       if (default_service != NULL)
+       if (default_service)
                timeserver_start(default_service);
        else
                timeserver_stop();
index 2b556c2..e346b11 100644 (file)
@@ -60,7 +60,7 @@ static char *read_key_file(const char *pathname, const char *key)
        }
 
        map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (map == NULL || map == MAP_FAILED) {
+       if (!map || map == MAP_FAILED) {
                close(fd);
                return NULL;
        }
@@ -81,25 +81,25 @@ static char *read_key_file(const char *pathname, const char *key)
                }
 
                ptr = memchr(ptr + 1, key[0], ptrlen - 1);
-               if (ptr == NULL)
+               if (!ptr)
                        break;
 
                ptrlen = st.st_size - (ptr - map);
        }
 
-       if (ptr != NULL) {
+       if (ptr) {
                char *end, *val;
 
                ptrlen = st.st_size - (ptr - map);
 
                end = memchr(ptr, '\n', ptrlen);
-               if (end != NULL)
+               if (end)
                        ptrlen = end - ptr;
 
                val = memchr(ptr, '"', ptrlen);
-               if (val != NULL) {
+               if (val) {
                        end = memchr(val + 1, '"', end - val - 1);
-                       if (end != NULL)
+                       if (end)
                                str = g_strndup(val + 1, end - val - 1);
                        else
                                str = NULL;
@@ -137,10 +137,10 @@ static int compare_file(void *src_map, struct stat *src_st,
        }
 
        dst_map = mmap(0, dst_st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (dst_map == NULL || dst_map == MAP_FAILED) {
+       if (!dst_map || dst_map == MAP_FAILED) {
                close(fd);
                return -1;
-        }
+       }
 
        result = memcmp(src_map, dst_map, src_st->st_size);
 
@@ -160,14 +160,14 @@ static char *find_origin(void *src_map, struct stat *src_st,
        struct stat buf;
        int ret;
 
-       if (subpath == NULL)
-               strncpy(pathname, basepath, sizeof(pathname));
+       if (!subpath)
+               strncpy(pathname, basepath, sizeof(pathname) - 1);
        else
                snprintf(pathname, sizeof(pathname),
                                        "%s/%s", basepath, subpath);
 
        dir = opendir(pathname);
-       if (dir == NULL)
+       if (!dir)
                return NULL;
 
        while ((d = readdir(dir))) {
@@ -179,7 +179,7 @@ static char *find_origin(void *src_map, struct stat *src_st,
 
                switch (d->d_type) {
                case DT_REG:
-                       if (subpath == NULL)
+                       if (!subpath)
                                snprintf(pathname, PATH_MAX,
                                                "%s/%s", basepath, d->d_name);
                        else
@@ -206,14 +206,14 @@ static char *find_origin(void *src_map, struct stat *src_st,
                                continue;
                        /* fall through */
                case DT_DIR:
-                       if (subpath == NULL)
+                       if (!subpath)
                                strncpy(pathname, d->d_name, sizeof(pathname));
                        else
                                snprintf(pathname, sizeof(pathname),
                                                "%s/%s", subpath, d->d_name);
 
                        str = find_origin(src_map, src_st, basepath, pathname);
-                       if (str != NULL) {
+                       if (str) {
                                closedir(dir);
                                return str;
                        }
@@ -248,14 +248,14 @@ char *__connman_timezone_lookup(void)
 
        if (S_ISREG(st.st_mode)) {
                map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-               if (map == NULL || map == MAP_FAILED) {
+               if (!map || map == MAP_FAILED) {
                        g_free(zone);
                        zone = NULL;
 
                        goto done;
                }
 
-               if (zone != NULL) {
+               if (zone) {
                        char pathname[PATH_MAX];
 
                        snprintf(pathname, PATH_MAX, "%s/%s",
@@ -267,7 +267,7 @@ char *__connman_timezone_lookup(void)
                        }
                }
 
-               if (zone == NULL)
+               if (!zone)
                        zone = find_origin(map, &st, USR_SHARE_ZONEINFO, NULL);
 
                munmap(map, st.st_size);
@@ -331,7 +331,7 @@ int __connman_timezone_change(const char *zone)
        }
 
        map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-       if (map == NULL || map == MAP_FAILED) {
+       if (!map || map == MAP_FAILED) {
                close(fd);
                return -EIO;
        }
@@ -415,7 +415,7 @@ int __connman_timezone_init(void)
                return -EIO;
 
        channel = g_io_channel_unix_new(fd);
-       if (channel == NULL) {
+       if (!channel) {
                close(fd);
                return -EIO;
        }
index 1451c74..1dd5e0f 100644 (file)
@@ -85,11 +85,11 @@ const char *connman_utsname_get_hostname(void)
 
                DBG("driver %p name %s", driver, driver->name);
 
-               if (driver->get_hostname == NULL)
+               if (!driver->get_hostname)
                        continue;
 
                hostname = driver->get_hostname();
-               if (hostname != NULL)
+               if (hostname)
                        return hostname;
        }
 
@@ -107,7 +107,7 @@ int __connman_utsname_set_hostname(const char *hostname)
 
                DBG("driver %p name %s", driver, driver->name);
 
-               if (driver->set_hostname == NULL)
+               if (!driver->set_hostname)
                        continue;
 
                if (driver->set_hostname(hostname) == 0)
@@ -128,7 +128,7 @@ int __connman_utsname_set_domainname(const char *domainname)
 
                DBG("driver %p name %s", driver, driver->name);
 
-               if (driver->set_domainname == NULL)
+               if (!driver->set_domainname)
                        continue;
 
                if (driver->set_domainname(domainname) == 0)
index 9480094..dcce93c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -34,7 +34,7 @@
 #define STATUS_URL_IPV6  "http://ipv6.connman.net/online/status.html"
 
 struct connman_wispr_message {
-       gboolean has_error;
+       bool has_error;
        const char *current_element;
        int message_type;
        int response_code;
@@ -92,7 +92,7 @@ struct connman_wispr_portal {
        struct connman_wispr_portal_context *ipv6_context;
 };
 
-static gboolean wispr_portal_web_result(GWebResult *result, gpointer user_data);
+static bool wispr_portal_web_result(GWebResult *result, gpointer user_data);
 
 static GHashTable *wispr_portal_list = NULL;
 
@@ -100,7 +100,7 @@ static void connman_wispr_message_init(struct connman_wispr_message *msg)
 {
        DBG("");
 
-       msg->has_error = FALSE;
+       msg->has_error = false;
        msg->current_element = NULL;
 
        msg->message_type = -1;
@@ -127,13 +127,13 @@ static void connman_wispr_message_init(struct connman_wispr_message *msg)
 
 static void free_wispr_routes(struct connman_wispr_portal_context *wp_context)
 {
-       while (wp_context->route_list != NULL) {
+       while (wp_context->route_list) {
                struct wispr_route *route = wp_context->route_list->data;
 
                DBG("free route to %s if %d type %d", route->address,
                                route->if_index, wp_context->type);
 
-               switch(wp_context->type) {
+               switch (wp_context->type) {
                case CONNMAN_IPCONFIG_TYPE_IPV4:
                        connman_inet_del_host_route(route->if_index,
                                        route->address);
@@ -155,14 +155,15 @@ static void free_wispr_routes(struct connman_wispr_portal_context *wp_context)
        }
 }
 
-static void free_connman_wispr_portal_context(struct connman_wispr_portal_context *wp_context)
+static void free_connman_wispr_portal_context(
+               struct connman_wispr_portal_context *wp_context)
 {
        DBG("context %p", wp_context);
 
-       if (wp_context == NULL)
+       if (!wp_context)
                return;
 
-       if (wp_context->wispr_portal != NULL) {
+       if (wp_context->wispr_portal) {
                if (wp_context->wispr_portal->ipv4_context == wp_context)
                        wp_context->wispr_portal->ipv4_context = NULL;
 
@@ -179,12 +180,12 @@ static void free_connman_wispr_portal_context(struct connman_wispr_portal_contex
        if (wp_context->timeout > 0)
                g_source_remove(wp_context->timeout);
 
-       if (wp_context->web != NULL)
+       if (wp_context->web)
                g_web_unref(wp_context->web);
 
        g_free(wp_context->redirect_url);
 
-       if (wp_context->wispr_parser != NULL)
+       if (wp_context->wispr_parser)
                g_web_parser_unref(wp_context->wispr_parser);
 
        connman_wispr_message_init(&wp_context->wispr_msg);
@@ -209,7 +210,7 @@ static void free_connman_wispr_portal(gpointer data)
 
        DBG("");
 
-       if (wispr_portal == NULL)
+       if (!wispr_portal)
                return;
 
        free_connman_wispr_portal_context(wispr_portal->ipv4_context);
@@ -326,12 +327,11 @@ static void xml_wispr_text_handler(GMarkupParseContext *context,
        struct connman_wispr_message *msg = user_data;
        int i;
 
-       if (msg->current_element == NULL)
+       if (!msg->current_element)
                return;
 
        for (i = 0; wispr_element_map[i].str; i++) {
-               if (g_str_equal(wispr_element_map[i].str,
-                                       msg->current_element) == FALSE)
+               if (!g_str_equal(wispr_element_map[i].str, msg->current_element))
                        continue;
 
                switch (wispr_element_map[i].element) {
@@ -380,7 +380,7 @@ static void xml_wispr_error_handler(GMarkupParseContext *context,
 {
        struct connman_wispr_message *msg = user_data;
 
-       msg->has_error = TRUE;
+       msg->has_error = true;
 }
 
 static const GMarkupParser xml_wispr_parser_handlers = {
@@ -395,7 +395,7 @@ static void xml_wispr_parser_callback(const char *str, gpointer user_data)
 {
        struct connman_wispr_portal_context *wp_context = user_data;
        GMarkupParseContext *parser_context = NULL;
-       gboolean result;
+       bool result;
 
        DBG("");
 
@@ -405,7 +405,7 @@ static void xml_wispr_parser_callback(const char *str, gpointer user_data)
 
        result = g_markup_parse_context_parse(parser_context,
                                        str, strlen(str), NULL);
-       if (result == TRUE)
+       if (result)
                g_markup_parse_context_end_parse(parser_context, NULL);
 
        g_markup_parse_context_free(parser_context);
@@ -434,19 +434,19 @@ static void portal_manage_status(GWebResult *result,
 
        /* We currently don't do anything with this info */
        if (g_web_result_get_header(result, "X-ConnMan-Client-IP",
-                               &str) == TRUE)
+                               &str))
                connman_info("Client-IP: %s", str);
 
        if (g_web_result_get_header(result, "X-ConnMan-Client-Country",
-                               &str) == TRUE)
+                               &str))
                connman_info("Client-Country: %s", str);
 
        if (g_web_result_get_header(result, "X-ConnMan-Client-Region",
-                               &str) == TRUE)
+                               &str))
                connman_info("Client-Region: %s", str);
 
        if (g_web_result_get_header(result, "X-ConnMan-Client-Timezone",
-                               &str) == TRUE)
+                               &str))
                connman_info("Client-Timezone: %s", str);
 
        free_connman_wispr_portal_context(wp_context);
@@ -455,7 +455,7 @@ static void portal_manage_status(GWebResult *result,
                                        CONNMAN_SERVICE_STATE_ONLINE, type);
 }
 
-static gboolean wispr_route_request(const char *address, int ai_family,
+static bool wispr_route_request(const char *address, int ai_family,
                int if_index, gpointer user_data)
 {
        int result = -1;
@@ -468,16 +468,16 @@ static gboolean wispr_route_request(const char *address, int ai_family,
 
        DBG("address %s if %d gw %s", address, if_index, gateway);
 
-       if (gateway == NULL)
-               return FALSE;
+       if (!gateway)
+               return false;
 
        route = g_try_new0(struct wispr_route, 1);
        if (route == 0) {
                DBG("could not create struct");
-               return FALSE;
+               return false;
        }
 
-       switch(wp_context->type) {
+       switch (wp_context->type) {
        case CONNMAN_IPCONFIG_TYPE_IPV4:
                result = connman_inet_add_host_route(if_index, address,
                                gateway);
@@ -492,17 +492,18 @@ static gboolean wispr_route_request(const char *address, int ai_family,
 
        if (result < 0) {
                g_free(route);
-               return FALSE;
+               return false;
        }
 
        route->address = g_strdup(address);
        route->if_index = if_index;
        wp_context->route_list = g_slist_prepend(wp_context->route_list, route);
 
-       return TRUE;
+       return true;
 }
 
-static void wispr_portal_request_portal(struct connman_wispr_portal_context *wp_context)
+static void wispr_portal_request_portal(
+               struct connman_wispr_portal_context *wp_context)
 {
        DBG("");
 
@@ -516,7 +517,7 @@ static void wispr_portal_request_portal(struct connman_wispr_portal_context *wp_
                wispr_portal_error(wp_context);
 }
 
-static gboolean wispr_input(const guint8 **data, gsize *length,
+static bool wispr_input(const guint8 **data, gsize *length,
                                                gpointer user_data)
 {
        struct connman_wispr_portal_context *wp_context = user_data;
@@ -544,21 +545,21 @@ static gboolean wispr_input(const guint8 **data, gsize *length,
        *data = (guint8 *) wp_context->wispr_formdata;
        *length = count;
 
-       return FALSE;
+       return false;
 }
 
 static void wispr_portal_browser_reply_cb(struct connman_service *service,
-                                       connman_bool_t authentication_done,
+                                       bool authentication_done,
                                        const char *error, void *user_data)
 {
        struct connman_wispr_portal_context *wp_context = user_data;
 
        DBG("");
 
-       if (service == NULL || wp_context == NULL)
+       if (!service || !wp_context)
                return;
 
-       if (authentication_done == FALSE) {
+       if (!authentication_done) {
                wispr_portal_error(wp_context);
                free_wispr_routes(wp_context);
                return;
@@ -569,17 +570,17 @@ static void wispr_portal_browser_reply_cb(struct connman_service *service,
 }
 
 static void wispr_portal_request_wispr_login(struct connman_service *service,
-                               connman_bool_t success,
+                               bool success,
                                const char *ssid, int ssid_len,
                                const char *username, const char *password,
-                               gboolean wps, const char *wpspin,
+                               bool wps, const char *wpspin,
                                const char *error, void *user_data)
 {
        struct connman_wispr_portal_context *wp_context = user_data;
 
        DBG("");
 
-       if (error != NULL) {
+       if (error) {
                if (g_strcmp0(error,
                        "net.connman.Agent.Error.LaunchBrowser") == 0) {
                        if (__connman_agent_request_browser(service,
@@ -608,7 +609,7 @@ static void wispr_portal_request_wispr_login(struct connman_service *service,
        connman_wispr_message_init(&wp_context->wispr_msg);
 }
 
-static gboolean wispr_manage_message(GWebResult *result,
+static bool wispr_manage_message(GWebResult *result,
                        struct connman_wispr_portal_context *wp_context)
 {
        DBG("Message type: %s (%d)",
@@ -618,21 +619,21 @@ static gboolean wispr_manage_message(GWebResult *result,
                response_code_to_string(wp_context->wispr_msg.response_code),
                                        wp_context->wispr_msg.response_code);
 
-       if (wp_context->wispr_msg.access_procedure != NULL)
+       if (wp_context->wispr_msg.access_procedure)
                DBG("Access procedure: %s",
                        wp_context->wispr_msg.access_procedure);
-       if (wp_context->wispr_msg.access_location != NULL)
+       if (wp_context->wispr_msg.access_location)
                DBG("Access location: %s",
                        wp_context->wispr_msg.access_location);
-       if (wp_context->wispr_msg.location_name != NULL)
+       if (wp_context->wispr_msg.location_name)
                DBG("Location name: %s",
                        wp_context->wispr_msg.location_name);
-       if (wp_context->wispr_msg.login_url != NULL)
+       if (wp_context->wispr_msg.login_url)
                DBG("Login URL: %s", wp_context->wispr_msg.login_url);
-       if (wp_context->wispr_msg.abort_login_url != NULL)
+       if (wp_context->wispr_msg.abort_login_url)
                DBG("Abort login URL: %s",
                        wp_context->wispr_msg.abort_login_url);
-       if (wp_context->wispr_msg.logoff_url != NULL)
+       if (wp_context->wispr_msg.logoff_url)
                DBG("Logoff URL: %s", wp_context->wispr_msg.logoff_url);
 
        switch (wp_context->wispr_msg.message_type) {
@@ -645,6 +646,8 @@ static gboolean wispr_manage_message(GWebResult *result,
                                        wispr_portal_request_wispr_login,
                                        wp_context) != -EINPROGRESS)
                        wispr_portal_error(wp_context);
+               else
+                       return true;
 
                break;
        case 120: /* Falling down */
@@ -663,7 +666,7 @@ static gboolean wispr_manage_message(GWebResult *result,
 
                        wispr_portal_request_portal(wp_context);
 
-                       return TRUE;
+                       return true;
                } else
                        wispr_portal_error(wp_context);
 
@@ -672,10 +675,10 @@ static gboolean wispr_manage_message(GWebResult *result,
                break;
        }
 
-       return FALSE;
+       return false;
 }
 
-static gboolean wispr_portal_web_result(GWebResult *result, gpointer user_data)
+static bool wispr_portal_web_result(GWebResult *result, gpointer user_data)
 {
        struct connman_wispr_portal_context *wp_context = user_data;
        const char *redirect = NULL;
@@ -692,13 +695,13 @@ static gboolean wispr_portal_web_result(GWebResult *result, gpointer user_data)
                if (length > 0) {
                        g_web_parser_feed_data(wp_context->wispr_parser,
                                                                chunk, length);
-                       return TRUE;
+                       return true;
                }
 
                g_web_parser_end_data(wp_context->wispr_parser);
 
                if (wp_context->wispr_msg.message_type >= 0) {
-                       if (wispr_manage_message(result, wp_context) == TRUE)
+                       if (wispr_manage_message(result, wp_context))
                                goto done;
                }
        }
@@ -713,20 +716,19 @@ static gboolean wispr_portal_web_result(GWebResult *result, gpointer user_data)
                        break;
 
                if (g_web_result_get_header(result, "X-ConnMan-Status",
-                                               &str) == TRUE) {
+                                               &str)) {
                        portal_manage_status(result, wp_context);
-                       return FALSE;
-               }
-               else
+                       return false;
+               } else
                        __connman_agent_request_browser(wp_context->service,
                                        wispr_portal_browser_reply_cb,
                                        wp_context->redirect_url, wp_context);
 
                break;
        case 302:
-               if (g_web_supports_tls() == FALSE ||
-                               g_web_result_get_header(result, "Location",
-                                                       &redirect) == FALSE) {
+               if (!g_web_supports_tls() ||
+                       !g_web_result_get_header(result, "Location",
+                                                       &redirect)) {
 
                        __connman_agent_request_browser(wp_context->service,
                                        wispr_portal_browser_reply_cb,
@@ -749,7 +751,7 @@ static gboolean wispr_portal_web_result(GWebResult *result, gpointer user_data)
                                                wp_context->type) == 0) {
                        wispr_portal_error(wp_context);
                        free_connman_wispr_portal_context(wp_context);
-                       return FALSE;
+                       return false;
                }
 
                break;
@@ -761,7 +763,7 @@ static gboolean wispr_portal_web_result(GWebResult *result, gpointer user_data)
        wp_context->request_id = 0;
 done:
        wp_context->wispr_msg.message_type = -1;
-       return FALSE;
+       return false;
 }
 
 static void proxy_callback(const char *proxy, void *user_data)
@@ -770,13 +772,18 @@ static void proxy_callback(const char *proxy, void *user_data)
 
        DBG("proxy %s", proxy);
 
-       if (wp_context == NULL)
+       if (!wp_context)
                return;
 
        wp_context->token = 0;
 
-       if (proxy != NULL && g_strcmp0(proxy, "DIRECT") != 0)
+       if (proxy && g_strcmp0(proxy, "DIRECT") != 0) {
+               if (g_str_has_prefix(proxy, "PROXY")) {
+                       proxy += 5;
+                       for (; *proxy == ' ' && *proxy != '\0'; proxy++);
+               }
                g_web_set_proxy(wp_context->web, proxy);
+       }
 
        g_web_set_accept(wp_context->web, NULL);
        g_web_set_user_agent(wp_context->web, "ConnMan/%s wispr", VERSION);
@@ -823,17 +830,18 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context)
        case CONNMAN_SERVICE_TYPE_WIFI:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_GADGET:
                break;
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
-       case CONNMAN_SERVICE_TYPE_GADGET:
+       case CONNMAN_SERVICE_TYPE_P2P:
                return -EOPNOTSUPP;
        }
 
        interface = connman_service_get_interface(wp_context->service);
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
        DBG("interface %s", interface);
@@ -846,14 +854,14 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context)
        }
 
        nameservers = connman_service_get_nameservers(wp_context->service);
-       if (nameservers == NULL) {
+       if (!nameservers) {
                DBG("Could not get nameservers");
                err = -EINVAL;
                goto done;
        }
 
        wp_context->web = g_web_new(if_index);
-       if (wp_context->web == NULL) {
+       if (!wp_context->web) {
                DBG("Could not set up GWeb");
                err = -ENOMEM;
                goto done;
@@ -870,7 +878,7 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context)
                wp_context->status_url = STATUS_URL_IPV6;
        }
 
-       for (i = 0; nameservers[i] != NULL; i++)
+       for (i = 0; nameservers[i]; i++)
                g_web_add_nameserver(wp_context->web, nameservers[i]);
 
        proxy_method = connman_service_get_proxy_method(wp_context->service);
@@ -906,7 +914,7 @@ int __connman_wispr_start(struct connman_service *service,
 
        DBG("service %p", service);
 
-       if (wispr_portal_list == NULL)
+       if (!wispr_portal_list)
                return -EINVAL;
 
        index = __connman_service_get_index(service);
@@ -915,9 +923,9 @@ int __connman_wispr_start(struct connman_service *service,
 
        wispr_portal = g_hash_table_lookup(wispr_portal_list,
                                        GINT_TO_POINTER(index));
-       if (wispr_portal == NULL) {
+       if (!wispr_portal) {
                wispr_portal = g_try_new0(struct connman_wispr_portal, 1);
-               if (wispr_portal == NULL)
+               if (!wispr_portal)
                        return -ENOMEM;
 
                g_hash_table_replace(wispr_portal_list,
@@ -932,11 +940,11 @@ int __connman_wispr_start(struct connman_service *service,
                return -EINVAL;
 
        /* If there is already an existing context, we wipe it */
-       if (wp_context != NULL)
+       if (wp_context)
                free_connman_wispr_portal_context(wp_context);
 
        wp_context = create_wispr_portal_context();
-       if (wp_context == NULL)
+       if (!wp_context)
                return -ENOMEM;
 
        wp_context->service = service;
@@ -957,7 +965,7 @@ void __connman_wispr_stop(struct connman_service *service)
 
        DBG("service %p", service);
 
-       if (wispr_portal_list == NULL)
+       if (!wispr_portal_list)
                return;
 
        index = __connman_service_get_index(service);
index 4e5834e..d40959b 100644 (file)
@@ -53,7 +53,7 @@ static void free_wpad(gpointer data)
 
        g_strfreev(wpad->addrlist);
        g_free(wpad->hostname);
-        g_free(wpad);
+       g_free(wpad);
 }
 
 static void download_pac(struct connman_wpad *wpad, const char *target)
@@ -72,7 +72,7 @@ static void wpad_result(GResolvResultStatus status,
        if (status == G_RESOLV_RESULT_STATUS_SUCCESS) {
                char *url;
 
-               if (results == NULL || g_strv_length(results) == 0)
+               if (!results || g_strv_length(results) == 0)
                        goto failed;
 
                url = g_strdup_printf("http://%s/wpad.dat", wpad->hostname);
@@ -80,7 +80,7 @@ static void wpad_result(GResolvResultStatus status,
                __connman_service_set_proxy_autoconfig(wpad->service, url);
 
                wpad->addrlist = g_strdupv(results);
-               if (wpad->addrlist != NULL)
+               if (wpad->addrlist)
                        download_pac(wpad, "wpad.dat");
 
                g_free(url);
@@ -97,10 +97,10 @@ static void wpad_result(GResolvResultStatus status,
                goto failed;
 
        ptr = strchr(hostname + 5, '.');
-       if (ptr == NULL || strlen(ptr) < 2)
+       if (!ptr || strlen(ptr) < 2)
                goto failed;
 
-       if (strchr(ptr + 1, '.') == NULL)
+       if (!strchr(ptr + 1, '.'))
                goto failed;
 
        wpad->hostname = g_strdup_printf("wpad.%s", ptr + 1);
@@ -131,7 +131,7 @@ int __connman_wpad_start(struct connman_service *service)
 
        DBG("service %p", service);
 
-       if (wpad_list == NULL)
+       if (!wpad_list)
                return -EINVAL;
 
        index = __connman_service_get_index(service);
@@ -139,22 +139,22 @@ int __connman_wpad_start(struct connman_service *service)
                return -EINVAL;
 
        domainname = connman_service_get_domainname(service);
-       if (domainname == NULL)
+       if (!domainname)
                return -EINVAL;
 
        nameservers = connman_service_get_nameservers(service);
-       if (nameservers == NULL)
+       if (!nameservers)
                return -EINVAL;
 
        wpad = g_try_new0(struct connman_wpad, 1);
-       if (wpad == NULL) {
+       if (!wpad) {
                g_strfreev(nameservers);
                return -ENOMEM;
        }
 
        wpad->service = service;
        wpad->resolv = g_resolv_new(index);
-       if (wpad->resolv == NULL) {
+       if (!wpad->resolv) {
                g_strfreev(nameservers);
                g_free(wpad);
                return -ENOMEM;
@@ -163,7 +163,7 @@ int __connman_wpad_start(struct connman_service *service)
        if (getenv("CONNMAN_RESOLV_DEBUG"))
                g_resolv_set_debug(wpad->resolv, resolv_debug, "RESOLV");
 
-       for (i = 0; nameservers[i] != NULL; i++)
+       for (i = 0; nameservers[i]; i++)
                g_resolv_add_nameserver(wpad->resolv, nameservers[i], 53, 0);
 
        g_strfreev(nameservers);
@@ -187,14 +187,14 @@ void __connman_wpad_stop(struct connman_service *service)
 
        DBG("service %p", service);
 
-       if (wpad_list == NULL)
+       if (!wpad_list)
                return;
 
        index = __connman_service_get_index(service);
        if (index < 0)
                return;
 
-       if (g_hash_table_remove(wpad_list, GINT_TO_POINTER(index)) == TRUE)
+       if (g_hash_table_remove(wpad_list, GINT_TO_POINTER(index)))
                connman_service_unref(service);
 }
 
diff --git a/test/p2p-on-supplicant b/test/p2p-on-supplicant
new file mode 100755 (executable)
index 0000000..826656e
--- /dev/null
@@ -0,0 +1,636 @@
+#!/usr/bin/python
+
+from os import O_NONBLOCK
+from sys import stdin, stdout, exit, version_info, argv
+from fcntl import fcntl, F_GETFL, F_SETFL
+import glib
+import dbus
+import dbus.mainloop.glib
+import gobject
+import argparse
+
+WPA_NAME='fi.w1.wpa_supplicant1'
+WPA_INTF='fi.w1.wpa_supplicant1'
+WPA_PATH='/fi/w1/wpa_supplicant1'
+WPA_IF_INTF = WPA_INTF + '.Interface'
+WPA_P2P_INTF = WPA_IF_INTF + '.P2PDevice'
+WPA_GROUP_INTF = WPA_INTF + '.Group'
+WPA_PEER_INTF = WPA_INTF + '.Peer'
+DBUS_PROPERTIES_INTF = 'org.freedesktop.DBus.Properties'
+
+P2P_GROUP_CAPAB_GROUP_OWNER = 1 << 0
+
+class ArgFields:
+    for field in ('help', 'metavar'):
+        exec('{}="{}"'.format(field, field))
+
+class InputLine:
+    def __init__(self, handler):
+        self.line = ''
+        self.handler = handler
+
+        flags = fcntl(stdin.fileno(), F_GETFL)
+        flags |= O_NONBLOCK
+        fcntl(stdin.fileno(), F_SETFL, flags)
+        glib.io_add_watch(stdin, glib.IO_IN, self.input_cb)
+
+        self.prompt()
+
+    def prompt(self):
+        self.line = ''
+        print '> ',
+        stdout.flush()
+
+    def input_cb(self, fd, event):
+        if event != glib.IO_IN:
+            return
+
+        self.line += fd.read();
+        for line in self.line.split('\n'):
+            line = line.strip()
+            if len(line) == 0:
+                break
+
+            self.handler(line.strip())
+
+        self.prompt()
+
+        return True
+
+def error_print(ex):
+    print 'Command Error: %s' % ex
+
+def checkarg(nb_args = 0, min_args = False):
+    def under(function):
+        def wrapper(*args, **kwargs):
+            resuls = True
+
+            if min_args:
+                result = len(args[1]) < nb_args
+            else:
+                result = len(args[1]) != nb_args
+
+            if result:
+                raise Exception('Command %s takes %s arguments' %
+                                    (function.__name__, nb_args))
+            return function(*args, **kwargs)
+        return wrapper
+    return under
+
+def print_dict(d):
+    for k in d:
+        try:
+            if type(d[k]) is dbus.Byte:
+                print 'Key %s --> 0x%x' % (k, d[k])
+            else:
+                print 'Key %s --> %s' % (k, d[k])
+        except:
+            print "Error: Key %s content cannot be printed" % k
+            pass
+
+def print_tuple(t):
+    for e in t:
+        if type(e) is dbus.Dictionary:
+            print_dict(e)
+        else:
+            print 'Element: %s' % e
+
+class Wpa_s:
+    def __init__(self, bus, iface_name, command):
+        self.wpa = dbus.Interface(bus.get_object(WPA_NAME, WPA_PATH), WPA_INTF)
+        bus.add_signal_receiver(self.__wpa_property_changed, path=WPA_PATH,
+                                member_keyword='signal')
+        bus.add_signal_receiver(self.__InterfaceAdded, path=WPA_PATH,
+                                signal_name='InterfaceAdded')
+        bus.add_signal_receiver(self.__InterfaceRemoved, path=WPA_PATH,
+                                signal_name='InterfaceRemoved')
+        self.__reset()
+
+        self.bus = bus
+
+        self.debug = False
+
+        self.line_in = InputLine(self.__command)
+
+        if iface_name:
+            try:
+                self.create_if([iface_name])
+            except:
+                print "Error creating interface: %s" % iface_name
+
+        if len(command.strip(' ')):
+            self.__command(command)
+
+    def help(self, args):
+        list = self.command_list.keys()
+        list.sort()
+        for key in list:
+            help = ''
+            if (self.command_list[key].has_key(ArgFields.help)):
+                help = self.command_list[key][ArgFields.help]
+
+            print "%s\t%s" % (key.rjust(25), help.ljust(50))
+
+    def __command(self, cmd_line):
+        cmd = cmd_line.split(' ')
+
+        try:
+            func = getattr(self, cmd[0])
+        except Exception, e:
+            print 'Error: command unknown - %s' % e
+            return
+
+        try:
+            func(cmd[1:])
+        except Exception, e:
+            error_print(e)
+
+    def __wpa_property_changed(*args, **kwargs):
+        print 'WPA - Signal:  %s' % kwargs.get('signal')
+
+    def __if_property_changed(*args, **kwargs):
+        signal = kwargs.get('signal')
+        print 'IF - Signal:  %s' % signal
+
+        if signal == 'BSSAdded':
+            return
+
+        if args[0].debug:
+            print_tuple(args[1:])
+
+    def __p2p_property_changed(*args, **kwargs):
+        print 'IF P2P - Signal:  %s' % kwargs.get('signal')
+        if args[0].debug:
+            print_tuple(args[1:])
+
+    """
+        It should be: __DeviceFound(self, object_path, properties)
+        wpa_supplicant's DBus API is buggy here:
+            - no properties are given
+    """
+    def __DeviceFound(self, object_path):
+        self.peers[object_path] = None
+
+        peer = self.bus.get_object(WPA_INTF, object_path)
+        peer_if = dbus.Interface(peer, DBUS_PROPERTIES_INTF)
+
+        self.peers[object_path] = peer_if.GetAll(WPA_PEER_INTF)
+
+    def __DeviceLost(self, object_path):
+        if object_path in self.peers:
+            del self.peers[object_path]
+
+    def __PeerJoined(self, object_path):
+        print 'Peer %s joined' % object_path
+
+    def __PeerDisconnected(self, object_path):
+        print 'Peer %s disconnected' % object_path
+
+    def __group_if_property_changed(*args, **kwargs):
+        print 'Group - ',
+        args[0].__if_property_changed(*args, **kwargs)
+
+    def __group_if_p2p_property_changed(*args, **kwargs):
+        print 'Group - ',
+        args[0].__p2p_property_changed(*args, **kwargs)
+
+    def __GroupFinished(self, ifname, role):
+        print 'Group running on %s is being removed' % ifname
+        self.group_obj = self.group_if = self.group_iface_path = None
+
+    def __InvitationResult(self, response):
+        print 'Invitation result status: %d ' % response['status']
+
+        if response.has_key('bssid'):
+            print 'bssid: %s' % response['bssid']
+
+        if self.debug:
+            print_dict(response)
+
+    def __GroupStarted(self, properties):
+        self.group_obj = properties['group_object']
+        self.bus.add_signal_receiver(self.__PeerJoined,
+                                dbus_interface=WPA_GROUP_INTF,
+                                path=self.group_obj,
+                                signal_name='PeerJoined')
+        self.bus.add_signal_receiver(self.__PeerDisconnected,
+                                dbus_interface=WPA_GROUP_INTF,
+                                path=self.group_obj,
+                                signal_name='PeerDisconnected')
+
+        self.group_iface_path = properties['interface_object']
+        self.group_if = dbus.Interface(self.bus.get_object(WPA_INTF,
+                                       self.group_iface_path),
+                                       WPA_P2P_INTF)
+        self.bus.add_signal_receiver(self.__group_if_property_changed,
+                                dbus_interface=WPA_IF_INTF,
+                                path=self.group_iface_path,
+                                member_keyword='signal')
+        self.bus.add_signal_receiver(self.__group_if_p2p_property_changed,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.group_iface_path,
+                                member_keyword='signal')
+        self.bus.add_signal_receiver(self.__GroupFinished,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.group_iface_path,
+                                member_keyword='signal')
+        self.bus.add_signal_receiver(self.__InvitationResult,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.iface_path,
+                                signal_name='InvitationResult')
+
+        if self.debug:
+            group = dbus.Interface(self.bus.get_object(WPA_INTF,
+                                                       self.group_obj),
+                                                       DBUS_PROPERTIES_INTF)
+            print_dict(group.GetAll(WPA_GROUP_INTF))
+
+    def __ServiceDiscoveryResponse(self, response):
+        peer = response['peer_object']
+        if peer in self.peers:
+            print 'Peer %s has this TLVs:' % (self.peers[peer]['DeviceName'])
+            print response['tlvs']
+
+    def __InterfaceAdded(self, path, properties):
+        print 'Interface %s Added (%s)' % (properties['Ifname'], path)
+        if self.debug:
+            print_dict(properties)
+            p2p = dbus.Interface(self.bus.get_object(WPA_INTF,
+                                 path), DBUS_PROPERTIES_INTF)
+            print_dict(p2p.GetAll(WPA_P2P_INTF))
+
+    def __InterfaceRemoved(self, path):
+        print 'Interface Removed (%s)' % (path)
+
+    def __listen_if_signals(self):
+        self.bus.add_signal_receiver(self.__if_property_changed,
+                                dbus_interface=WPA_IF_INTF,
+                                path=self.iface_path,
+                                member_keyword='signal')
+        self.bus.add_signal_receiver(self.__p2p_property_changed,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.iface_path,
+                                member_keyword='signal')
+        self.bus.add_signal_receiver(self.__GroupStarted,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.iface_path,
+                                signal_name='GroupStarted')
+        self.bus.add_signal_receiver(self.__DeviceFound,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.iface_path,
+                                signal_name='DeviceFound')
+        self.bus.add_signal_receiver(self.__DeviceLost,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.iface_path,
+                                signal_name='DeviceLost')
+        self.bus.add_signal_receiver(self.__ServiceDiscoveryResponse,
+                                dbus_interface=WPA_P2P_INTF,
+                                path=self.iface_path,
+                                signal_name='ServiceDiscoveryResponse')
+
+    def __reset(self):
+        self.iface_path = self.iface_name = self.iface = None
+        self.p2p = self.group_if = self.group_obj = None
+        self.peers = {}
+
+    def __set_if(self, iface_name):
+        self.iface = dbus.Interface(self.bus.get_object(WPA_INTF,
+                                    self.iface_path), WPA_IF_INTF)
+        self.p2p = dbus.Interface(self.bus.get_object(WPA_INTF,
+                                    self.iface_path), WPA_P2P_INTF)
+
+        p2p_if = dbus.Interface(self.p2p, DBUS_PROPERTIES_INTF)
+        p2p_if.Set(WPA_P2P_INTF, 'P2PDeviceConfig',
+                   dbus.Dictionary({ 'DeviceName' : 'ConnManP2P' },
+                                   signature='sv'))
+        print 'Interface %s: %s' % (iface_name, self.iface_path)
+        self.iface_name = iface_name
+        self.__listen_if_signals()
+
+    @checkarg()
+    def enable_debug(self, args):
+        self.debug = True
+
+    @checkarg()
+    def disable_debug(self, args):
+        self.debug = False
+
+    @checkarg(nb_args=1)
+    def create_if(self, args):
+        self.__reset()
+        self.iface_path = self.wpa.CreateInterface(({ 'Ifname' : args[0]} ))
+        self.__set_if(args[0])
+
+    @checkarg(nb_args=1)
+    def get_if(self, args):
+        self.__reset()
+        self.iface_path = self.wpa.GetInterface(args[0])
+        self.__set_if(args[0])
+
+    @checkarg()
+    def del_if(self, args = None):
+        if not self.iface_path:
+            return
+
+        self.wpa.RemoveInterface(self.iface_path)
+        print 'Interface %s removed' % self.iface_name
+        self.__reset()
+
+    @checkarg()
+    def scan(self, args = None):
+        if not self.iface:
+            return
+
+        self.iface.Scan(({ 'Type': 'passive' }))
+        print 'Scan started'
+
+    @checkarg()
+    def quit(self, args = None):
+        self.del_if(args)
+        exit(0)
+
+    @checkarg(nb_args=1)
+    def set_command_list(self, command_list):
+        self.command_list = command_list[0]
+
+    @checkarg()
+    def p2p_find(self, args = None):
+        if not self.p2p:
+            return
+
+        self.p2p.Find(({}))
+
+    @checkarg()
+    def p2p_stop_find(self, args = None):
+        if not self.p2p:
+            return
+
+        self.p2p.StopFind()
+
+    @checkarg()
+    def p2p_peers(self, args = None):
+        if not self.iface:
+            return
+
+        for p in self.peers:
+            print 'Peer Name=%s' % (self.peers[p]['DeviceName'])
+
+    def __find_peer(self, peer_name, ret_object_path = False):
+        if len(self.peers) == 0:
+            return None
+
+        peer = None
+        for p in self.peers:
+            if self.peers[p]['DeviceName'] == peer_name:
+                peer = self.peers[p]
+                break
+
+        if not peer:
+            print 'No peer found under the name: %s' % peer_name
+            p = None
+
+        if ret_object_path:
+            return p
+        else:
+            return peer
+
+    @checkarg(nb_args = 1)
+    def p2p_peer(self, args):
+        peer = self.__find_peer(args[0])
+        if peer:
+            print_dict(peer)
+
+    @checkarg(nb_args = 1)
+    def p2p_connect(self, args):
+        if not self.p2p:
+            return
+
+        peer = self.__find_peer(args[0])
+        if not peer:
+            return
+
+        peer_path = self.__find_peer(args[0], True)
+
+        if (peer['groupcapability'] & P2P_GROUP_CAPAB_GROUP_OWNER ==
+                                            P2P_GROUP_CAPAB_GROUP_OWNER):
+            print 'Joining an existing P2P group'
+            pin = self.p2p.Connect(({ 'peer' : peer_path,
+                                      'wps_method' : 'pbc',
+                                      'join' : True,
+                                      'go_intent' : 0 }))
+        else:
+            print 'Associating with another P2P device'
+            pin = self.p2p.Connect(({ 'peer' : peer_path,
+                                      'wps_method' : 'pbc',
+                                      'join' : False,
+                                      'go_intent' : 7 }))
+            if not pin:
+                print 'WPS PIN in use: %s' % pin
+
+    @checkarg(nb_args = 1)
+    def p2p_disconnect(self, args):
+        if not self.p2p:
+            return
+
+        peer = self.__find_peer(args[0])
+        if not peer:
+            return
+
+        if not self.group_if:
+            print 'Peer %s is not connected' % (peer['DeviceName'])
+            return
+
+        self.group_if.Disconnect()
+
+    @checkarg()
+    def p2p_group_add(self, args):
+        if not self.p2p:
+            return
+
+        self.p2p.GroupAdd(({ 'persistent' : dbus.Boolean(1) }))
+
+    @checkarg()
+    def p2p_group_remove(self, args):
+        if not self.group_if:
+            return
+
+        self.group_if.Disconnect()
+
+    @checkarg()
+    def p2p_group(self, args):
+        if not self.group_obj:
+            return
+
+        group = dbus.Interface(self.bus.get_object(WPA_INTF,
+                               self.group_obj), DBUS_PROPERTIES_INTF)
+        print_dict(group.GetAll(WPA_GROUP_INTF))
+
+    @checkarg()
+    def p2p_flush(self, args):
+        if not self.p2p:
+            return
+
+        self.p2p.Flush()
+
+    @checkarg()
+    def p2p_serv_disc_req(self, args = None):
+        if not self.p2p:
+            return
+
+        """ We request all kind of services """
+        sd_req = dbus.Array(signature='y', variant_level=1)
+        for a in [2,0,0,1]:
+            sd_req.append(dbus.Byte(a))
+
+        ref = self.p2p.ServiceDiscoveryRequest(({ 'tlv' : sd_req }))
+        print 'Service discovery reference: %s' % ref
+
+    @checkarg(nb_args = 1)
+    def p2p_serv_disc_cancel_req(self, args):
+        if not self.p2p:
+            return
+
+        self.p2p.ServiceDiscoveryCancelRequest(int(args[0]))
+
+    @checkarg(nb_args = 3)
+    def p2p_service_add(self, args):
+        if not self.p2p:
+            return
+
+        service = { 'service_type' : args[0] }
+        if args[0] == 'upnp':
+            service['version'] = args[1]
+            service['service'] = args[2]
+        elif args[0] == 'bonjour':
+            service['query'] = args[1]
+            service['response'] = args[2]
+        else:
+            print 'Unknown service: %s' % args[0]
+            return
+
+        self.p2p.AddService((service))
+
+    @checkarg(nb_args = 2, min_args = True)
+    def p2p_service_del(self, args):
+        if not self.p2p:
+            return
+
+        service = { 'service_type' : args[0] }
+        if args[0] == 'upnp':
+            service['version'] = args[1]
+            service['service'] = args[2]
+        elif args[0] == 'bonjour':
+            service['query'] = args[1]
+        else:
+            print 'Unknown service: %s' % args[0]
+            return
+
+        self.p2p.DeleteService((service))
+
+    @checkarg()
+    def p2p_service_flush(self, args = None):
+        if not self.p2p:
+            return
+
+        self.p2p.FlushService()
+
+    @checkarg(nb_args = 1)
+    def p2p_invite(self, args):
+        if not self.p2p or not self.group_if:
+            return
+
+        peer_path = self.__find_peer(args[0], True)
+
+        if not peer_path:
+            return
+
+        self.group_if.Invite({ 'peer' : peer_path})
+
+def build_args(parser):
+    parser.add_argument('-d', default=False, action='store_true',
+                       dest='debug', help='enable debug')
+    parser.add_argument('-i', metavar='<interface>', dest='ifname',
+                        help='interface name')
+
+    command = {}
+    command['quit'] = {}
+    command['enable_debug'] = {}
+    command['disable_debug'] = {}
+    command['create_if'] = {ArgFields.help:'<iface_name> - create interface'}
+    command['get_if'] = {ArgFields.help:'<iface_name> - get interface'}
+    command['del_if'] = {ArgFields.help:'removes current interface'}
+    command['scan'] = {}
+    command['p2p_find'] = {}
+    command['p2p_stop_find'] = {}
+    command['p2p_flush'] = {}
+    command['p2p_group_add'] = {ArgFields.help:'adds an autonomous group'}
+    command['p2p_group_remove'] = {}
+    command['p2p_group'] = {}
+    command['p2p_peers'] = {}
+    command['p2p_peer'] = {ArgFields.help:'<p2p device name> - get info for a '
+                                'peer'}
+    command['p2p_connect'] = {ArgFields.help:'<p2p device name>'}
+    command['p2p_disconnect'] = {ArgFields.help:'<p2p device name>'}
+    command['p2p_serv_disc_req'] = {}
+    command['p2p_serv_disc_cancel_req'] = {ArgFields.help:'<identifier>'}
+    command['p2p_service_add'] = {ArgFields.help:'<service type> '
+                                  '<version/query> <service/response>'}
+    command['p2p_service_del'] = {ArgFields.help:'<service type> '
+                                  '<version/query> [<service>]'}
+    command['p2p_service_flush'] = {}
+    command['p2p_invite'] = {ArgFields.help:'<p2p device name>'}
+
+    command_list = command.keys()
+    command_list.sort()
+    subparsers = parser.add_subparsers(help='commands', dest='command')
+    subparsers.add_parser('')
+    for key in command_list:
+        help=None
+        metavar=None
+        if command[key].has_key(ArgFields.help):
+            help = command[key][ArgFields.help]
+        if command[key].has_key(ArgFields.metavar):
+            metavar = command[key][ArgFields.metavar]
+        command_parser = subparsers.add_parser(key, help=help)
+        command_parser.add_argument(key, nargs='*', metavar=metavar, help=help)
+
+    return command
+
+def main():
+    if version_info.major != 2:
+        print 'You need to run this under Python 2.x'
+        exit(1)
+
+    parser = argparse.ArgumentParser(description='Connman P2P Test')
+
+    command_list = build_args(parser)
+
+    argv[1:] += ['']
+
+    args = parser.parse_args(argv[1:])
+
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+    opts = []
+    if args.command:
+        opts = getattr(args, args.command)
+
+    params = ''
+    if opts and len(opts[0]):
+        params = ' ' + ''.join(opts)
+
+    bus = dbus.SystemBus()
+
+    mainloop = gobject.MainLoop()
+
+    wpa_s = Wpa_s(bus, args.ifname, args.command + params)
+
+    if (args.debug):
+            wpa_s.enable_debug([])
+
+    wpa_s.set_command_list([command_list])
+
+    mainloop.run()
+
+if __name__ == '__main__':
+    main()
diff --git a/test/test-supplicant b/test/test-supplicant
deleted file mode 100755 (executable)
index 68ac663..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/python
-
-import dbus
-import time
-
-WPA_NAME='fi.epitest.hostap.WPASupplicant'
-WPA_INTF='fi.epitest.hostap.WPASupplicant'
-WPA_PATH='/fi/epitest/hostap/WPASupplicant'
-
-bus = dbus.SystemBus()
-
-dummy = dbus.Interface(bus.get_object(WPA_NAME, WPA_PATH),
-                               'org.freedesktop.DBus.Introspectable')
-
-#print dummy.Introspect()
-
-manager = dbus.Interface(bus.get_object(WPA_NAME, WPA_PATH), WPA_INTF)
-
-try:
-       path = manager.getInterface("wlan0")
-except:
-       path = manager.addInterface("wlan0")
-
-interface = dbus.Interface(bus.get_object(WPA_NAME, path),
-                                       WPA_INTF + ".Interface")
-
-print "state = %s" % (interface.state())
-
-try:
-       print "scanning = %s" % (interface.scanning())
-except:
-       pass
-
-print "[ %s ]" % (path)
-
-capabilities = interface.capabilities()
-
-for key in capabilities.keys():
-       list = ""
-       for value in capabilities[key]:
-               list += " " + value
-       print "    %s =%s" % (key, list)
-
-interface.scan()
-
-time.sleep(1)
-
-try:
-       print "scanning = %s" % (interface.scanning())
-except:
-       pass
-
-time.sleep(1)
-
-print "state = %s" % (interface.state())
-
-results = interface.scanResults()
-
-print results
-
-path = results[0]
-
-print "[ %s ]" % (path)
-
-bssid = dbus.Interface(bus.get_object(WPA_NAME, path),
-                                       WPA_INTF + ".BSSID")
-
-properties = bssid.properties()
-
-for key in properties.keys():
-       print "    %s = %s" % (key, properties[key])
index 94d94f0..ece5d19 100644 (file)
@@ -59,8 +59,8 @@ int main(int argc, char *argv[])
        dbus_error_init(&err);
 
        conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, &err);
-       if (conn == NULL) {
-               if (dbus_error_is_set(&err) == TRUE) {
+       if (!conn) {
+               if (dbus_error_is_set(&err)) {
                        fprintf(stderr, "%s\n", err.message);
                        dbus_error_free(&err);
                } else
index 4252e62..b7d2e54 100644 (file)
@@ -89,7 +89,7 @@ int main(int argc, char *argv[])
        printf("Create DHCP server for interface %d\n", index);
 
        dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &error);
-       if (dhcp_server == NULL) {
+       if (!dhcp_server) {
                handle_error(error);
                exit(0);
        }
index 284656b..c34e10a 100644 (file)
@@ -102,7 +102,7 @@ static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
 
        address = g_dhcp_client_get_address(dhcp_client);
        printf("address %s\n", address);
-       if (address == NULL)
+       if (!address)
                return;
 
        option_value = g_dhcp_client_get_option(dhcp_client, G_DHCP_SUBNET);
@@ -143,7 +143,7 @@ int main(int argc, char *argv[])
        printf("Create DHCP client for interface %d\n", index);
 
        dhcp_client = g_dhcp_client_new(G_DHCP_IPV4, index, &error);
-       if (dhcp_client == NULL) {
+       if (!dhcp_client) {
                handle_error(error);
                exit(0);
        }
index 418767a..551cae9 100644 (file)
@@ -147,6 +147,9 @@ static int connect_tcp_socket(char *server)
 
        if (sk >= 0 && connect(sk, rp->ai_addr, rp->ai_addrlen) < 0) {
                err = -errno;
+               close(sk);
+               sk = -1;
+
                fprintf(stderr, "Failed to connect to DNS server at %s "
                                "errno %d/%s\n",
                        server, -err, strerror(-err));
@@ -237,7 +240,7 @@ static int sendto_msg(int sk, struct sockaddr *sa, socklen_t salen,
        return 0;
 }
 
-static unsigned short get_id()
+static unsigned short get_id(void)
 {
        return random();
 }
index 1d964b9..2df53cc 100644 (file)
@@ -49,7 +49,7 @@ int main(int argc, char *argv[])
        opterr = 0;
 
        while ((c = getopt_long(argc, argv,
-                               "-A:I:D:P:N:X:F:Lt:", NULL, NULL)) != -1) {
+                               "-A:I:D:P:N:X:F:Lt:", NULL, NULL)) != -1) {
                switch (c) {
                case 'A':
                        chain = optarg;
@@ -92,11 +92,11 @@ int main(int argc, char *argv[])
        }
 
 out:
-       if (table == NULL)
+       if (!table)
                table = "filter";
 
        for (i = optind - 1; i < argc; i++) {
-               if (rule != NULL) {
+               if (rule) {
                        tmp = rule;
                        rule = g_strdup_printf("%s %s", rule,  argv[i]);
                        g_free(tmp);
@@ -129,7 +129,7 @@ out:
                err = __connman_iptables_flush_chain(table, chain);
                break;
        case IPTABLES_COMMAND_DUMP:
-               __connman_log_init(argv[0], "*", FALSE, FALSE,
+               __connman_log_init(argv[0], "*", false, false,
                        "iptables-test", "1");
                err = __connman_iptables_dump(table);
                break;
index 8ddd919..b9273ce 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "../src/connman.h"
 
-static connman_bool_t assert_rule(const char *table_name, const char *rule)
+static bool assert_rule(const char *table_name, const char *rule)
 {
        char *cmd, *output, **lines;
        GError **error = NULL;
@@ -40,17 +40,17 @@ static connman_bool_t assert_rule(const char *table_name, const char *rule)
        lines = g_strsplit(output, "\n", 0);
        g_free(output);
 
-       for (i = 0; lines[i] != NULL; i++) {
+       for (i = 0; lines[i]; i++) {
                DBG("lines[%02d]: %s\n", i, lines[i]);
                if (g_strcmp0(lines[i], rule) == 0)
                        break;
        }
        g_strfreev(lines);
 
-       if (lines[i] == NULL)
-               return FALSE;
+       if (!lines[i])
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static void assert_rule_exists(const char *table_name, const char *rule)
@@ -408,7 +408,7 @@ static void test_firewall_basic0(void)
        int err;
 
        ctx = __connman_firewall_create();
-       g_assert(ctx != NULL);
+       g_assert(ctx);
 
        err = __connman_firewall_add_rule(ctx, "filter", "INPUT",
                                        "-m mark --mark 999 -j LOG");
@@ -437,7 +437,7 @@ static void test_firewall_basic1(void)
        int err;
 
        ctx = __connman_firewall_create();
-       g_assert(ctx != NULL);
+       g_assert(ctx);
 
        err = __connman_firewall_add_rule(ctx, "filter", "INPUT",
                                        "-m mark --mark 999 -j LOG");
@@ -462,7 +462,7 @@ static void test_firewall_basic2(void)
        int err;
 
        ctx = __connman_firewall_create();
-       g_assert(ctx != NULL);
+       g_assert(ctx);
 
        err = __connman_firewall_add_rule(ctx, "mangle", "INPUT",
                                        "-j CONNMARK --restore-mark");
@@ -483,7 +483,7 @@ static void test_firewall_basic2(void)
 
 static gchar *option_debug = NULL;
 
-static gboolean parse_debug(const char *key, const char *value,
+static bool parse_debug(const char *key, const char *value,
                                        gpointer user_data, GError **error)
 {
        if (value)
@@ -491,7 +491,7 @@ static gboolean parse_debug(const char *key, const char *value,
        else
                option_debug = g_strdup("*");
 
-       return TRUE;
+       return true;
 }
 
 static GOptionEntry options[] = {
@@ -512,8 +512,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -523,7 +523,7 @@ int main(int argc, char *argv[])
 
        g_option_context_free(context);
 
-       __connman_log_init(argv[0], option_debug, FALSE, FALSE,
+       __connman_log_init(argv[0], option_debug, false, false,
                        "Unit Tests Connection Manager", VERSION);
 
        __connman_iptables_init();
index 2a182d7..9098fca 100644 (file)
@@ -38,7 +38,7 @@ static DBusMessage *set_property(DBusConnection *connection,
                                                CONNMAN_MANAGER_PATH,
                                                CONNMAN_MANAGER_INTERFACE,
                                                "SetProperty");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_message_iter_init_append(message, &iter);
@@ -48,8 +48,8 @@ static DBusMessage *set_property(DBusConnection *connection,
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
@@ -73,15 +73,15 @@ DBusMessage *manager_get_services(DBusConnection *connection)
                                                CONNMAN_MANAGER_PATH,
                                                CONNMAN_MANAGER_INTERFACE,
                                                        "GetServices");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_error_init(&error);
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
@@ -105,15 +105,15 @@ DBusMessage *manager_get_properties(DBusConnection *connection)
                                                CONNMAN_MANAGER_PATH,
                                                CONNMAN_MANAGER_INTERFACE,
                                                        "GetProperties");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_error_init(&error);
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
@@ -140,7 +140,7 @@ DBusMessage *manager_create_session(DBusConnection *connection,
                                                CONNMAN_MANAGER_PATH,
                                                CONNMAN_MANAGER_INTERFACE,
                                                        "CreateSession");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_error_init(&error);
@@ -158,8 +158,8 @@ DBusMessage *manager_create_session(DBusConnection *connection,
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
@@ -185,7 +185,7 @@ DBusMessage *manager_destroy_session(DBusConnection *connection,
                                                CONNMAN_MANAGER_PATH,
                                                CONNMAN_MANAGER_INTERFACE,
                                                        "DestroySession");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_error_init(&error);
@@ -197,8 +197,8 @@ DBusMessage *manager_destroy_session(DBusConnection *connection,
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
@@ -214,10 +214,12 @@ DBusMessage *manager_destroy_session(DBusConnection *connection,
 }
 
 DBusMessage *manager_set_session_mode(DBusConnection *connection,
-                                       connman_bool_t enable)
+                                       bool enable)
 {
+       dbus_bool_t val = enable;
+
        return set_property(connection, "SessionMode",
-                               DBUS_TYPE_BOOLEAN, &enable);
+                               DBUS_TYPE_BOOLEAN, &val);
 }
 
 int manager_parse_properties(DBusMessage *msg,
@@ -240,11 +242,11 @@ int manager_parse_properties(DBusMessage *msg,
 
                switch (dbus_message_iter_get_arg_type(&value)) {
                case DBUS_TYPE_STRING:
-                       if (g_str_equal(key, "State") == TRUE) {
+                       if (g_str_equal(key, "State")) {
                                const char *val;
                                dbus_message_iter_get_basic(&value, &val);
 
-                               if (manager->state != NULL)
+                               if (manager->state)
                                        g_free(manager->state);
 
                                LOG("State %s", val);
diff --git a/tools/netlink-test.c b/tools/netlink-test.c
new file mode 100644 (file)
index 0000000..c07806a
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2013  BWM CarIT GmbH.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/socket.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <linux/genetlink.h>
+#include <linux/netfilter/nfnetlink.h>
+#include <net/if.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include "../src/shared/netlink.h"
+
+#define NFGEN_DATA(nlh) ((void *)((char *)(nlh) +                      \
+                               NLMSG_ALIGN(sizeof(struct nfgenmsg))))
+#define NLA_DATA(nla)  ((void *)((char*)(nla) + NLA_HDRLEN))
+#define NLA_OK(nla,len) ((len) >= (int)sizeof(struct nlattr) &&                \
+                               (nla)->nla_len >= sizeof(struct nlattr) && \
+                               (nla)->nla_len <= (len))
+#define NLA_NEXT(nla,attrlen) ((attrlen) -= NLA_ALIGN((nla)->nla_len), \
+                               (struct nlattr*)(((char*)(nla)) +       \
+                                               NLA_ALIGN((nla)->nla_len)))
+
+static GMainLoop *mainloop;
+
+static void do_debug(const char *str, void *user_data)
+{
+       const char *prefix = user_data;
+
+       printf("%s%s\n", prefix, str);
+}
+
+static void getlink_callback(unsigned int error, uint16_t type, const void *data,
+                                               uint32_t len, void *user_data)
+{
+       const struct ifinfomsg *ifi = data;
+       struct rtattr *rta;
+       int bytes;
+       char ifname[IF_NAMESIZE];
+       uint32_t index, flags;
+
+       g_assert_cmpuint(error, ==, 0);
+
+       bytes = len - NLMSG_ALIGN(sizeof(struct ifinfomsg));
+
+       memset(ifname, 0, sizeof(ifname));
+
+       index = ifi->ifi_index;
+       flags = ifi->ifi_flags;
+
+       for (rta = IFLA_RTA(ifi); RTA_OK(rta, bytes);
+                                       rta = RTA_NEXT(rta, bytes)) {
+               switch (rta->rta_type) {
+               case IFLA_IFNAME:
+                       if (RTA_PAYLOAD(rta) <= IF_NAMESIZE)
+                               strcpy(ifname, RTA_DATA(rta));
+                       break;
+               }
+       }
+
+       printf("index=%d flags=0x%08x name=%s\n", index, flags, ifname);
+
+       g_main_loop_quit(mainloop);
+}
+
+static void test_case_1(void)
+{
+       struct netlink_info *netlink;
+       struct ifinfomsg msg;
+
+       netlink = netlink_new(NETLINK_ROUTE);
+
+       printf("\n");
+       netlink_set_debug(netlink, do_debug, "[NETLINK] ", NULL);
+
+       memset(&msg, 0, sizeof(msg));
+
+       netlink_send(netlink, RTM_GETLINK, NLM_F_DUMP, &msg, sizeof(msg),
+                                               getlink_callback, NULL, NULL);
+
+       mainloop = g_main_loop_new(NULL, FALSE);
+       g_main_loop_run(mainloop);
+       g_main_loop_unref(mainloop);
+
+       netlink_destroy(netlink);
+}
+
+int main(int argc, char *argv[])
+{
+       g_test_init(&argc, &argv, NULL);
+
+       g_test_add_func("/netlink/Test case 1", test_case_1);
+
+       return g_test_run();
+}
index 45e6eb8..ea1d24a 100644 (file)
@@ -142,7 +142,7 @@ static int check_authorization(DBusConnection *conn)
                return -EIO;
        }
 
-       if (dbus_message_has_signature(reply, "(bba{ss})") == TRUE) {
+       if (dbus_message_has_signature(reply, "(bba{ss})")) {
                dbus_message_iter_init(reply, &iter);
                print_arguments(&iter);
        }
index 24f9234..3dd115b 100644 (file)
@@ -101,7 +101,7 @@ static void request_private_network(DBusConnection *conn, int *out_fd,
                return;
        }
 
-       if (dbus_message_iter_init(reply, &array) == FALSE)
+       if (!dbus_message_iter_init(reply, &array))
                goto done;
 
        if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_UNIX_FD)
index 9867a4b..8953acd 100644 (file)
@@ -80,7 +80,7 @@ static void resolv_result(GResolvResultStatus status,
 
        g_print("status: %s\n", status2str(status));
 
-       if (results != NULL) {
+       if (results) {
                for (i = 0; results[i]; i++)
                        g_print("result: %s\n", results[i]);
        }
@@ -88,7 +88,7 @@ static void resolv_result(GResolvResultStatus status,
        g_main_loop_quit(main_loop);
 }
 
-static gboolean option_debug = FALSE;
+static bool option_debug = false;
 
 static GOptionEntry options[] = {
        { "debug", 'd', 0, G_OPTION_ARG_NONE, &option_debug,
@@ -107,8 +107,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -124,12 +124,12 @@ int main(int argc, char *argv[])
        }
 
        resolv = g_resolv_new(index);
-       if (resolv == NULL) {
+       if (!resolv) {
                printf("failed to create resolver\n");
                return 1;
        }
 
-       if (option_debug == TRUE)
+       if (option_debug)
                g_resolv_set_debug(resolv, resolv_debug, "RESOLV");
 
        main_loop = g_main_loop_new(NULL, FALSE);
index 72c0b09..7162ade 100644 (file)
@@ -73,7 +73,7 @@ static GSList *session_parse_allowed_bearers(DBusMessageIter *iter)
                dbus_message_iter_get_basic(&array, &bearer);
 
                info = g_try_new0(struct test_bearer_info, 1);
-               if (info == NULL) {
+               if (!info) {
                        g_slist_foreach(list, bearer_info_cleanup, NULL);
                        g_slist_free(list);
 
@@ -97,7 +97,7 @@ static DBusMessage *notify_release(DBusConnection *conn,
 
        LOG("session %p", session);
 
-       if (session->notify != NULL)
+       if (session->notify)
                session->notify(session);
 
        return NULL;
@@ -128,7 +128,7 @@ static DBusMessage *notify_update(DBusConnection *conn,
 
                switch (dbus_message_iter_get_arg_type(&value)) {
                case DBUS_TYPE_ARRAY:
-                       if (g_str_equal(key, "AllowedBearers") == TRUE) {
+                       if (g_str_equal(key, "AllowedBearers")) {
                                allowed_bearers = session_parse_allowed_bearers(&value);
 
                                g_slist_foreach(info->allowed_bearers,
@@ -137,10 +137,10 @@ static DBusMessage *notify_update(DBusConnection *conn,
 
                                info->allowed_bearers = allowed_bearers;
 
-                       } else if (g_str_equal(key, "IPv4") == TRUE) {
+                       } else if (g_str_equal(key, "IPv4")) {
                                /* XXX */
 
-                       } else if (g_str_equal(key, "IPv6") == TRUE) {
+                       } else if (g_str_equal(key, "IPv6")) {
                                /* XXX */
 
                        } else {
@@ -149,40 +149,40 @@ static DBusMessage *notify_update(DBusConnection *conn,
                        }
                        break;
                case DBUS_TYPE_STRING:
-                       if (g_str_equal(key, "State") == TRUE) {
+                       if (g_str_equal(key, "State")) {
                                const char *val;
                                dbus_message_iter_get_basic(&value, &val);
 
                                info->state = string2state(val);
-                       } else if (g_str_equal(key, "Bearer") == TRUE) {
+                       } else if (g_str_equal(key, "Bearer")) {
                                const char *val;
                                dbus_message_iter_get_basic(&value, &val);
 
-                               if (info->bearer != NULL)
+                               if (info->bearer)
                                        g_free(info->bearer);
 
                                info->bearer = g_strdup(val);
 
-                       } else if (g_str_equal(key, "Name") == TRUE) {
+                       } else if (g_str_equal(key, "Name")) {
                                const char *val;
                                dbus_message_iter_get_basic(&value, &val);
 
-                               if (info->name != NULL)
+                               if (info->name)
                                        g_free(info->name);
 
                                info->name = g_strdup(val);
 
-                       } else if (g_str_equal(key, "Interface") == TRUE) {
+                       } else if (g_str_equal(key, "Interface")) {
                                const char *val;
                                dbus_message_iter_get_basic(&value, &val);
 
-                               if (info->interface != NULL)
+                               if (info->interface)
                                        g_free(info->interface);
 
                                info->interface = g_strdup(val);
 
                        } else if (g_str_equal(key, "ConnectionType")
-                                                               == TRUE) {
+                                                               ) {
                                const char *val;
                                dbus_message_iter_get_basic(&value, &val);
 
@@ -199,7 +199,7 @@ static DBusMessage *notify_update(DBusConnection *conn,
                dbus_message_iter_next(&array);
        }
 
-       if (session->notify != NULL)
+       if (session->notify)
                session->notify(session);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
@@ -216,10 +216,7 @@ static const GDBusMethodTable notify_methods[] = {
 int session_notify_register(struct test_session *session,
                                const char *notify_path)
 {
-       if (g_dbus_register_interface(session->connection, notify_path,
-                       CONNMAN_NOTIFICATION_INTERFACE,
-                       notify_methods, NULL, NULL,
-                       session, NULL) == FALSE) {
+       if (!g_dbus_register_interface(session->connection, notify_path, CONNMAN_NOTIFICATION_INTERFACE, notify_methods, NULL, NULL, session, NULL)) {
                return -EINVAL;
        }
 
@@ -229,8 +226,7 @@ int session_notify_register(struct test_session *session,
 int session_notify_unregister(struct test_session *session,
                                const char *notify_path)
 {
-       if (g_dbus_unregister_interface(session->connection, notify_path,
-                               CONNMAN_NOTIFICATION_INTERFACE) == FALSE) {
+       if (!g_dbus_unregister_interface(session->connection, notify_path, CONNMAN_NOTIFICATION_INTERFACE)) {
                return -EINVAL;
        }
 
@@ -243,7 +239,7 @@ static void append_allowed_bearers(DBusMessageIter *iter, void *user_data)
        GSList *list;
 
        for (list = info->allowed_bearers;
-                       list != NULL; list = list->next) {
+                       list; list = list->next) {
                struct test_bearer_info *bearer_info = list->data;
 
                dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
@@ -254,7 +250,7 @@ static void append_allowed_bearers(DBusMessageIter *iter, void *user_data)
 void session_append_settings(DBusMessageIter *dict,
                                struct test_session_info *info)
 {
-       if (info->allowed_bearers == NULL)
+       if (!info->allowed_bearers)
                return;
 
        connman_dbus_dict_append_array(dict, "AllowedBearers",
@@ -273,15 +269,15 @@ DBusMessage *session_connect(DBusConnection *connection,
                                                session->session_path,
                                                CONNMAN_SESSION_INTERFACE,
                                                        "Connect");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_error_init(&error);
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
@@ -306,15 +302,15 @@ DBusMessage *session_disconnect(DBusConnection *connection,
                                                session->session_path,
                                                CONNMAN_SESSION_INTERFACE,
                                                        "Disconnect");
-       if (message == NULL)
+       if (!message)
                return NULL;
 
        dbus_error_init(&error);
 
        reply = dbus_connection_send_with_reply_and_block(connection,
                                                        message, -1, &error);
-       if (reply == NULL) {
-               if (dbus_error_is_set(&error) == TRUE) {
+       if (!reply) {
+               if (dbus_error_is_set(&error)) {
                        LOG("%s", error.message);
                        dbus_error_free(&error);
                } else {
index ac91894..18fd588 100644 (file)
@@ -58,38 +58,32 @@ static struct test_session *get_session(struct test_session *session,
        return &session->fix->session[index];
 }
 
-static gboolean test_session_create_no_notify(gpointer data)
+static void test_session_create_no_notify(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        DBusMessage *msg;
 
        util_session_create(fix, 1);
 
        msg = manager_create_session(fix->session->connection,
                                        fix->session->info, "/foo");
-       g_assert(msg != NULL);
+       g_assert(msg);
        g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
 
        dbus_message_unref(msg);
 
        util_idle_call(fix, util_quit_loop, util_session_destroy);
-
-       return FALSE;
 }
 
-static gboolean test_session_destroy_no_notify(gpointer data)
+static void test_session_destroy_no_notify(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        DBusMessage *msg;
 
        util_session_create(fix, 1);
 
        msg = manager_destroy_session(fix->session->connection, "/foo");
-       g_assert(msg == NULL);
+       g_assert(!msg);
 
        util_idle_call(fix, util_quit_loop, util_session_destroy);
-
-       return FALSE;
 }
 
 static void test_session_create_notify(struct test_session *session)
@@ -99,9 +93,8 @@ static void test_session_create_notify(struct test_session *session)
        util_idle_call(session->fix, util_quit_loop, util_session_destroy);
 }
 
-static gboolean test_session_create(gpointer data)
+static void test_session_create(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
        DBusMessage *msg;
        int err;
@@ -118,17 +111,14 @@ static gboolean test_session_create(gpointer data)
        msg = manager_create_session(session->connection,
                                        session->info,
                                        session->notify_path);
-       g_assert(msg != NULL);
+       g_assert(msg);
        g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
 
        dbus_message_unref(msg);
-
-       return FALSE;
 }
 
-static gboolean test_session_create_destroy(gpointer data)
+static void test_session_create_destroy(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
 
        util_session_create(fix, 1);
@@ -140,13 +130,10 @@ static gboolean test_session_create_destroy(gpointer data)
        util_session_cleanup(fix->session);
 
        util_idle_call(fix, util_quit_loop, util_session_destroy);
-
-       return FALSE;
 }
 
-static gboolean test_session_create_already_exists(gpointer data)
+static void test_session_create_dup_notification(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session0, *session1;
        DBusMessage *msg;
 
@@ -162,13 +149,11 @@ static gboolean test_session_create_already_exists(gpointer data)
        msg = manager_create_session(session1->connection,
                                        session1->info,
                                        session1->notify_path);
-       g_assert(msg == NULL);
+       g_assert(msg);
 
        util_session_cleanup(session0);
 
        util_idle_call(fix, util_quit_loop, util_session_destroy);
-
-       return FALSE;
 }
 
 static void test_session_create_many_notify(struct test_session *session)
@@ -187,9 +172,8 @@ static void test_session_create_many_notify(struct test_session *session)
        util_idle_call(session->fix, util_quit_loop, util_session_destroy);
 }
 
-static gboolean test_session_create_many(gpointer data)
+static void test_session_create_many(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
        unsigned int i, max;
 
@@ -207,17 +191,15 @@ static gboolean test_session_create_many(gpointer data)
 
                util_session_init(session);
        }
-
-       return FALSE;
 }
 
 static void set_session_mode(struct test_fix *fix,
-                                       connman_bool_t enable)
+                                       bool enable)
 {
        DBusMessage *msg;
 
        msg = manager_set_session_mode(fix->main_connection, enable);
-       g_assert(msg != NULL);
+       g_assert(msg);
        g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
 
        dbus_message_unref(msg);
@@ -235,9 +217,8 @@ static void test_session_connect_notify(struct test_session *session)
        util_idle_call(session->fix, util_quit_loop, util_session_destroy);
 }
 
-static gboolean test_session_connect(gpointer data)
+static void test_session_connect(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
        DBusMessage *msg;
 
@@ -249,12 +230,10 @@ static gboolean test_session_connect(gpointer data)
        util_session_init(session);
 
        msg = session_connect(session->connection, session);
-       g_assert(msg != NULL);
+       g_assert(msg);
        g_assert(dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_ERROR);
 
        dbus_message_unref(msg);
-
-       return FALSE;
 }
 
 static void test_session_disconnect_notify(struct test_session *session)
@@ -269,9 +248,8 @@ static void test_session_disconnect_notify(struct test_session *session)
        util_idle_call(session->fix, util_quit_loop, util_session_destroy);
 }
 
-static gboolean test_session_disconnect(gpointer data)
+static void test_session_disconnect(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
        DBusMessage *msg;
 
@@ -283,10 +261,8 @@ static gboolean test_session_disconnect(gpointer data)
        util_session_init(session);
 
        msg = session_disconnect(session->connection, session);
-       g_assert(msg != NULL);
+       g_assert(msg);
        dbus_message_unref(msg);
-
-       return FALSE;
 }
 
 static void test_session_connect_disconnect_notify(struct test_session *session)
@@ -302,6 +278,10 @@ static void test_session_connect_disconnect_notify(struct test_session *session)
        case TEST_SESSION_STATE_0:
                if (session->info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
                        next_state = TEST_SESSION_STATE_1;
+               if (session->info->state == CONNMAN_SESSION_STATE_CONNECTED) {
+                       LOG("state was already connected, continuing");
+                       next_state = TEST_SESSION_STATE_2;
+               }
                break;
        case TEST_SESSION_STATE_1:
                if (session->info->state >= CONNMAN_SESSION_STATE_CONNECTED)
@@ -324,12 +304,12 @@ static void test_session_connect_disconnect_notify(struct test_session *session)
        switch (next_state) {
        case TEST_SESSION_STATE_1:
                msg = session_connect(session->connection, session);
-               g_assert(msg != NULL);
+               g_assert(msg);
                dbus_message_unref(msg);
                return;
        case TEST_SESSION_STATE_2:
                msg = session_disconnect(session->connection, session);
-               g_assert(msg != NULL);
+               g_assert(msg);
                dbus_message_unref(msg);
                return;
        case TEST_SESSION_STATE_3:
@@ -342,9 +322,8 @@ static void test_session_connect_disconnect_notify(struct test_session *session)
        }
 }
 
-static gboolean test_session_connect_disconnect(gpointer data)
+static void test_session_connect_disconnect(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
 
        /*
@@ -374,8 +353,6 @@ static gboolean test_session_connect_disconnect(gpointer data)
        util_session_init(session);
 
        set_session_state(session, TEST_SESSION_STATE_0);
-
-       return FALSE;
 }
 
 static void test_session_connect_free_ride_notify(struct test_session *session)
@@ -396,6 +373,12 @@ static void test_session_connect_free_ride_notify(struct test_session *session)
                                        CONNMAN_SESSION_STATE_DISCONNECTED) {
                        next_state = TEST_SESSION_STATE_1;
                }
+               if (session0->info->state == CONNMAN_SESSION_STATE_CONNECTED &&
+                               session1->info->state ==
+                               CONNMAN_SESSION_STATE_CONNECTED) {
+                       LOG("state was already connected, continuing");
+                       next_state = TEST_SESSION_STATE_2;
+               }
 
                break;
        case TEST_SESSION_STATE_1:
@@ -408,8 +391,12 @@ static void test_session_connect_free_ride_notify(struct test_session *session)
                break;
        case TEST_SESSION_STATE_2:
                if (session0->info->state == CONNMAN_SESSION_STATE_DISCONNECTED
-                               && session1->info->state ==
-                                       CONNMAN_SESSION_STATE_DISCONNECTED) {
+                               && (session1->info->state ==
+                                       CONNMAN_SESSION_STATE_DISCONNECTED ||
+                                               session1->info->state ==
+                                       CONNMAN_SESSION_STATE_CONNECTED) ) {
+                       LOG("session0 /foo is disconnected, session1 /bar "
+                               "can be either connected or disconnected");
                        next_state = TEST_SESSION_STATE_3;
                }
 
@@ -432,14 +419,14 @@ static void test_session_connect_free_ride_notify(struct test_session *session)
                return;
        case TEST_SESSION_STATE_1:
                msg = session_connect(session0->connection, session0);
-               g_assert(msg != NULL);
+               g_assert(msg);
                dbus_message_unref(msg);
 
                return;
 
        case TEST_SESSION_STATE_2:
                msg = session_disconnect(session0->connection, session0);
-               g_assert(msg != NULL);
+               g_assert(msg);
                dbus_message_unref(msg);
 
                return;
@@ -454,9 +441,8 @@ static void test_session_connect_free_ride_notify(struct test_session *session)
        }
 }
 
-static gboolean test_session_connect_free_ride(gpointer data)
+static void test_session_connect_free_ride(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session0, *session1;
 
        /*
@@ -496,8 +482,6 @@ static gboolean test_session_connect_free_ride(gpointer data)
        util_session_init(session1);
 
        set_session_state(session0, TEST_SESSION_STATE_0);
-
-       return FALSE;
 }
 
 static void policy_save(GKeyFile *keyfile, char *pathname)
@@ -508,7 +492,7 @@ static void policy_save(GKeyFile *keyfile, char *pathname)
 
        data = g_key_file_to_data(keyfile, &length, NULL);
 
-       if(!g_file_set_contents(pathname, data, length, &error)) {
+       if (!g_file_set_contents(pathname, data, length, &error)) {
                DBG("Failed to store information: %s", error->message);
                g_error_free(error);
                g_assert(0);
@@ -528,7 +512,7 @@ static void policy_allowed_bearers(const char *allowed_bearers)
 
        uid = getuid();
        pwd = getpwuid(uid);
-       g_assert(pwd != NULL);
+       g_assert(pwd);
 
        keyfile = g_key_file_new();
        g_key_file_set_string(keyfile, "policy_foo", "uid", pwd->pw_name);
@@ -588,7 +572,7 @@ static void test_session_policy_notify(struct test_session *session)
                policy_allowed_bearers("ethernet");
 
                msg = session_connect(session->connection, session);
-               g_assert(msg != NULL);
+               g_assert(msg);
                dbus_message_unref(msg);
                return;
        case TEST_SESSION_STATE_2:
@@ -605,9 +589,8 @@ static void test_session_policy_notify(struct test_session *session)
        }
 }
 
-static gboolean test_session_policy(gpointer data)
+static void test_session_policy(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
        struct test_session *session;
 
        /*
@@ -639,71 +622,48 @@ static gboolean test_session_policy(gpointer data)
        util_session_init(session);
 
        set_session_state(session, TEST_SESSION_STATE_0);
-
-       return FALSE;
 }
 
-static connman_bool_t is_online(struct test_fix *fix)
+static bool is_online(struct test_fix *fix)
 {
        if (g_strcmp0(fix->manager.state, "online") == 0)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
-static gboolean enable_session_mode(gpointer data)
+static void enable_session_mode(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
-
-       set_session_mode(fix, TRUE);
+       set_session_mode(fix, true);
 
-       if (is_online(fix) == FALSE)
+       if (!is_online(fix))
                util_idle_call(fix, util_quit_loop, NULL);
-
-       return FALSE;
 }
 
-static gboolean manager_state_changed(gpointer data)
+static void manager_state_changed(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
-
-       if (is_online(fix) == FALSE) {
+       if (!is_online(fix)) {
                fix->manager_changed = NULL;
                util_idle_call(fix, util_quit_loop, NULL);
        }
-
-       return FALSE;
 }
 
-static gboolean disable_session_mode(gpointer data)
+static void disable_session_mode(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
-
-       set_session_mode(fix, FALSE);
-
-       return FALSE;
+       set_session_mode(fix, false);
 }
 
-static void setup_cb(struct test_fix *fix, gconstpointer data)
+static void setup_cb(struct test_fix *fix)
 {
        fix->manager_changed = manager_state_changed;
 
-       util_setup(fix, data);
        util_call(fix, enable_session_mode, NULL);
-
-       g_main_loop_run(fix->main_loop);
-
-       fix->manager_changed = NULL;
 }
 
-static void teardown_cb(struct test_fix *fix, gconstpointer data)
+static void teardown_cb(struct test_fix *fix)
 {
        util_call(fix, disable_session_mode, NULL);
        util_idle_call(fix, util_quit_loop, NULL);
-
-       g_main_loop_run(fix->main_loop);
-
-       util_teardown(fix, data);
 }
 
 int main(int argc, char *argv[])
@@ -718,8 +678,8 @@ int main(int argc, char *argv[])
                test_session_create, setup_cb, teardown_cb);
        util_test_add("/manager/session create destroy",
                test_session_create_destroy, setup_cb, teardown_cb);
-       util_test_add("/manager/session create already exists",
-               test_session_create_already_exists, setup_cb, teardown_cb);
+       util_test_add("/manager/session create duplicate notification",
+               test_session_create_dup_notification, setup_cb, teardown_cb);
        util_test_add("/manager/session create many",
                test_session_create_many, setup_cb, teardown_cb);
 
index a21f526..5e6d196 100644 (file)
 #include "../src/connman.h"
 
 struct test_session;
+struct test_fix;
 
 struct test_manager {
        char *state;
 };
 
+typedef void (* util_test_func_t) (struct test_fix *fix);
+
 struct test_fix {
        gpointer user_data;
 
        GMainLoop *main_loop;
        DBusConnection *main_connection;
-       guint watch;
-       guint manager_watch;
+       unsigned int watch;
+       unsigned int manager_watch;
 
        struct test_manager manager;
-       GSourceFunc manager_changed;
+       util_test_func_t manager_changed;
 
        /* session test cases */
        unsigned int max_sessions;
        struct test_session *session;
 };
 
-/* utils.c */
-typedef void (* util_test_setup_cb) (struct test_fix *fix,
-                                       gconstpointer data);
-typedef void (* util_test_teardown_cb) (struct test_fix *fix,
-                                       gconstpointer data);
-
-gboolean util_quit_loop(gpointer fix);
-guint util_idle_call(struct test_fix *fix, GSourceFunc func,
-                       GDestroyNotify notify);
-guint util_call(struct test_fix *fix, GSourceFunc func,
-               GDestroyNotify notify);
-void util_test_add(const char *test_name, GSourceFunc test_func,
-                       util_test_setup_cb setup_cb,
-                       util_test_teardown_cb teardown_cb);
-void util_setup(struct test_fix *fix, gconstpointer data);
-void util_teardown(struct test_fix *fix, gconstpointer data);
+void util_quit_loop(struct test_fix *fix);
+void util_idle_call(struct test_fix *fix, util_test_func_t func,
+                       util_test_func_t destroy);
+void util_call(struct test_fix *fix, util_test_func_t func,
+               util_test_func_t destroy);
+void util_test_add(const char *test_name, util_test_func_t test,
+                       util_test_func_t setup,
+                       util_test_func_t teardown);
+void util_setup(struct test_fix *fix);
+void util_teardown(struct test_fix *fix);
 
 void util_session_create(struct test_fix *fix, unsigned int max_sessions);
-void util_session_destroy(gpointer fix);
+void util_session_destroy(struct test_fix *fix);
 void util_session_init(struct test_session *session);
 void util_session_cleanup(struct test_session *session);
 
-typedef void (* notify_cb) (struct test_session *session);
+typedef void (* notify_func_t) (struct test_session *session);
 
 enum connman_session_state {
        CONNMAN_SESSION_STATE_DISCONNECTED   = 0,
@@ -88,14 +85,14 @@ struct test_session_info {
 };
 
 struct test_session {
-       gpointer user_data;
+       void *user_data;
 
        struct test_fix *fix;
        DBusConnection *connection;
 
        char *session_path;
        char *notify_path;
-       notify_cb notify;
+       notify_func_t notify;
 
        struct test_session_info *info;
 };
@@ -128,7 +125,7 @@ DBusMessage *manager_create_session(DBusConnection *connection,
 DBusMessage *manager_destroy_session(DBusConnection *connection,
                                        const char *notifier_path);
 DBusMessage *manager_set_session_mode(DBusConnection *connection,
-                                       connman_bool_t enable);
+                                       bool enable);
 int manager_parse_properties(DBusMessage *msg,
                                struct test_manager *manager);
 
index 6a3d991..92273e6 100644 (file)
 
 #include <stdlib.h>
 
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
 #include <gdbus.h>
 
+#include "../src/shared/util.h"
 #include "session-test.h"
 
 #define ENABLE_WRAPPER 1
 #define PROPERTY_CHANGED               "PropertyChanged"
 
-gboolean util_quit_loop(gpointer data)
+void util_quit_loop(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
-
        g_main_loop_quit(fix->main_loop);
+}
+
+static gboolean func_cb(gpointer data)
+{
+       struct cb_data *cbd = data;
+       util_test_func_t cb = cbd->cb;
+       struct test_fix *fix = cbd->user_data;
+
+       (*cb)(fix);
 
        return FALSE;
 }
 
-guint util_idle_call(struct test_fix *fix, GSourceFunc func,
-                       GDestroyNotify notify)
+static void destroy_cb(gpointer data)
+{
+       struct cb_data *cbd = data;
+       util_test_func_t cb = cbd->data;
+       struct test_fix *fix = cbd->user_data;
+
+       if (cb)
+               (*cb)(fix);
+
+       g_free(cbd);
+}
+
+void util_call(struct test_fix *fix, util_test_func_t func,
+               util_test_func_t destroy)
 {
+       struct cb_data *cbd = cb_data_new(func, fix);
        GSource *source;
-       guint id;
 
-       source = g_idle_source_new();
-       g_source_set_callback(source, func, fix, notify);
-       id = g_source_attach(source, g_main_loop_get_context(fix->main_loop));
+       cbd->data = destroy;
+
+       source = g_timeout_source_new(0);
+       g_source_set_callback(source, func_cb, cbd, destroy_cb);
+       g_source_attach(source, g_main_loop_get_context(fix->main_loop));
        g_source_unref(source);
+}
 
-       return id;
+void util_idle_call(struct test_fix *fix, util_test_func_t func,
+                       util_test_func_t destroy)
+{
+       struct cb_data *cbd = cb_data_new(func, fix);
+       GSource *source;
+
+       cbd->data = destroy;
+
+       source = g_idle_source_new();
+       g_source_set_callback(source, func_cb, cbd, destroy_cb);
+       g_source_attach(source, g_main_loop_get_context(fix->main_loop));
+       g_source_unref(source);
 }
 
 static void connman_died(DBusConnection *connection, void *user_data)
@@ -60,8 +96,7 @@ static void connman_died(DBusConnection *connection, void *user_data)
        g_assert(FALSE);
 }
 
-static void manager_changed(struct test_fix *fix,
-                                       DBusMessageIter *entry)
+static void manager_changed(struct test_fix *fix, DBusMessageIter *entry)
 {
        DBusMessageIter iter;
        const char *key;
@@ -83,16 +118,16 @@ static void manager_changed(struct test_fix *fix,
 
        dbus_message_iter_get_basic(&iter, &value);
 
-       if (g_str_equal(key, "State") == TRUE) {
+       if (g_str_equal(key, "State")) {
                LOG("State %s", value);
 
-               if (fix->manager.state != NULL)
+               if (fix->manager.state)
                        g_free(fix->manager.state);
 
                fix->manager.state = g_strdup(value);
        }
 
-       if (fix->manager_changed != NULL)
+       if (fix->manager_changed)
                fix->manager_changed(fix);
 }
 
@@ -110,24 +145,13 @@ static gboolean handle_manager_changed(DBusConnection *connection,
        return TRUE;
 }
 
-guint util_call(struct test_fix *fix, GSourceFunc func,
-               GDestroyNotify notify)
-{
-       GSource *source;
-       guint id;
-
-       source = g_timeout_source_new(0);
-       g_source_set_callback(source, func, fix, notify);
-       id = g_source_attach(source, g_main_loop_get_context(fix->main_loop));
-       g_source_unref(source);
-
-       return id;
-}
-
-void util_setup(struct test_fix *fix, gconstpointer data)
+static struct test_fix *create_fix(void)
 {
+       struct test_fix *fix;
        DBusMessage *msg;
 
+       fix = g_new0(struct test_fix, 1);
+
        fix->main_loop = g_main_loop_new(NULL, FALSE);
        fix->main_connection = g_dbus_setup_private(DBUS_BUS_SYSTEM,
                                                        NULL, NULL);
@@ -146,9 +170,11 @@ void util_setup(struct test_fix *fix, gconstpointer data)
        msg = manager_get_properties(fix->main_connection);
        manager_parse_properties(msg, &fix->manager);
        dbus_message_unref(msg);
+
+       return fix;
 }
 
-void util_teardown(struct test_fix *fix, gconstpointer data)
+static void cleanup_fix(struct test_fix *fix)
 {
        g_dbus_remove_watch(fix->main_connection, fix->watch);
        g_dbus_remove_watch(fix->main_connection, fix->manager_watch);
@@ -156,14 +182,29 @@ void util_teardown(struct test_fix *fix, gconstpointer data)
        dbus_connection_unref(fix->main_connection);
 
        g_main_loop_unref(fix->main_loop);
+
+       g_free(fix);
 }
 
-static void util_wrapper(struct test_fix *fix, gconstpointer data)
+struct test_data_cb {
+       util_test_func_t func;
+       util_test_func_t setup;
+       util_test_func_t teardown;
+};
+
+static void run_test_cb(gconstpointer data)
 {
-       GSourceFunc func = data;
+       const struct test_data_cb *cbd = data;
+       struct test_fix *fix;
+
+       fix = create_fix();
+
+       util_call(fix, cbd->setup, NULL);
+       g_main_loop_run(fix->main_loop);
+
 #if ENABLE_WRAPPER
-       if (g_test_trap_fork(60 * 1000 * 1000, 0) == TRUE) {
-               util_call(fix, func, NULL);
+       if (g_test_trap_fork(60 * 1000 * 1000, 0)) {
+               util_call(fix, cbd->func, NULL);
                g_main_loop_run(fix->main_loop);
                exit(0);
        }
@@ -173,14 +214,25 @@ static void util_wrapper(struct test_fix *fix, gconstpointer data)
        util_call(fix, func, NULL);
        g_main_loop_run(fix->main_loop);
 #endif
+
+       util_call(fix, cbd->teardown, NULL);
+       g_main_loop_run(fix->main_loop);
+
+       cleanup_fix(fix);
 }
 
-void util_test_add(const char *test_name, GSourceFunc test_func,
-                       util_test_setup_cb setup_cb,
-                       util_test_teardown_cb teardown_cb)
+void util_test_add(const char *test_name, util_test_func_t test_func,
+               util_test_func_t setup, util_test_func_t teardown)
 {
-       g_test_add(test_name, struct test_fix, test_func,
-               setup_cb, util_wrapper, teardown_cb);
+       struct test_data_cb *cbd = g_new0(struct test_data_cb, 1);
+
+       cbd->func = test_func;
+       cbd->setup = setup;
+       cbd->teardown = teardown;
+
+       g_test_add_vtable(test_name, 0, cbd, NULL,
+                       (GTestFixtureFunc) run_test_cb,
+                       (GTestFixtureFunc) g_free);
 }
 
 void util_session_create(struct test_fix *fix, unsigned int max_sessions)
@@ -198,10 +250,8 @@ void util_session_create(struct test_fix *fix, unsigned int max_sessions)
        }
 }
 
-void util_session_destroy(gpointer data)
+void util_session_destroy(struct test_fix *fix)
 {
-       struct test_fix *fix = data;
-
        unsigned int i;
 
        for (i = 0; i < fix->max_sessions; i++) {
@@ -225,7 +275,7 @@ void util_session_init(struct test_session *session)
        msg = manager_create_session(session->connection,
                                        session->info,
                                        session->notify_path);
-       g_assert(msg != NULL);
+       g_assert(msg);
        dbus_message_iter_init(msg, &iter);
 
        dbus_message_iter_get_basic(&iter, &path);
@@ -241,7 +291,7 @@ void util_session_cleanup(struct test_session *session)
 
        msg = manager_destroy_session(session->connection,
                                        session->session_path);
-       g_assert(msg != NULL);
+       g_assert(msg);
        dbus_message_unref(msg);
 
        err = session_notify_unregister(session,
index 0f06d8e..7957c47 100644 (file)
@@ -35,6 +35,7 @@
 #include <time.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdbool.h>
 #include <errno.h>
 
 #include <glib.h>
@@ -99,23 +100,23 @@ struct stats_iter {
 
 static gint option_create = 0;
 static gint option_interval = 3;
-static gboolean option_dump = FALSE;
-static gboolean option_summary = FALSE;
+static bool option_dump = false;
+static bool option_summary = false;
 static char *option_info_file_name = NULL;
 static time_t option_start_ts = -1;
 static char *option_last_file_name = NULL;
 
-static gboolean parse_start_ts(const char *key, const char *value,
+static bool parse_start_ts(const char *key, const char *value,
                                        gpointer user_data, GError **error)
 {
        GTimeVal time_val;
 
-       if (g_time_val_from_iso8601(value, &time_val) == FALSE)
-               return FALSE;
+       if (!g_time_val_from_iso8601(value, &time_val))
+               return false;
 
        option_start_ts = time_val.tv_sec;
 
-       return TRUE;
+       return true;
 }
 
 static GOptionEntry options[] = {
@@ -244,13 +245,13 @@ static void stats_hdr_info(struct stats_file *file)
        end = get_end(file);
 
        home = get_home(file);
-       if (home == NULL)
+       if (!home)
                home_idx = UINT_MAX;
        else
                home_idx = get_index(file, home);
 
        roaming = get_roaming(file);
-       if (roaming == NULL)
+       if (!roaming)
                roaming_idx = UINT_MAX;
        else
                roaming_idx = get_index(file, roaming);
@@ -344,12 +345,12 @@ static void stats_print_diff(struct stats_file *file)
        printf("\t[%04d] ", get_index(file, end));
        stats_print_record(end);
 
-       if (file->home_first != NULL && get_home(file) != NULL) {
+       if (file->home_first && get_home(file)) {
                printf("\nhome\n");
                stats_print_rec_diff(file->home_first, get_home(file));
        }
 
-       if (file->roaming_first != NULL && get_roaming(file) != NULL) {
+       if (file->roaming_first && get_roaming(file)) {
                printf("\roaming\n");
                stats_print_rec_diff(file->roaming_first, get_roaming(file));
        }
@@ -409,13 +410,13 @@ static int stats_file_update_cache(struct stats_file *file)
                        it != end;
                        it = get_next(file, it)) {
 
-               if (file->home_first == NULL && it->roaming == 0)
+               if (!file->home_first && it->roaming == 0)
                        file->home_first = it;
 
-               if (file->roaming_first == NULL && it->roaming == 1)
+               if (!file->roaming_first && it->roaming == 1)
                        file->roaming_first = it;
 
-               if (file->home_first != NULL && file->roaming_first != NULL)
+               if (file->home_first && file->roaming_first)
                        break;
        }
 
@@ -438,7 +439,7 @@ static int stats_file_remap(struct stats_file *file, size_t size)
                return -errno;
        }
 
-       if (file->addr == NULL) {
+       if (!file->addr) {
                addr = mmap(NULL, new_size, PROT_READ | PROT_WRITE,
                                MAP_SHARED, file->fd, 0);
        } else {
@@ -467,7 +468,7 @@ static int stats_open(struct stats_file *file, const char *name)
 
        bzero(file, sizeof(struct stats_file));
 
-       if (name != NULL) {
+       if (name) {
                file->name = g_strdup(name);
 
                file->fd = TFR(open(file->name,
@@ -554,7 +555,7 @@ static int stats_create(struct stats_file *file, unsigned int nr,
 
        stats_file_update_cache(file);
 
-       if (start != NULL) {
+       if (start) {
                struct stats_record *rec;
 
                rec = get_end(file);
@@ -604,7 +605,7 @@ static int stats_create(struct stats_file *file, unsigned int nr,
                set_end(file, next);
 
                if ((rand() % 50) == 0)
-                       roaming = roaming == TRUE? FALSE : TRUE;
+                       roaming = roaming ? FALSE : TRUE;
 
        }
 
@@ -662,18 +663,18 @@ static struct stats_record *process_file(struct stats_iter *iter,
        home = NULL;
        roaming = NULL;
 
-       if (cur == NULL)
+       if (!cur)
                cur = get_next_record(iter);
        next = get_next_record(iter);
 
-       while (next != NULL) {
+       while (next) {
                GDate date_cur;
                GDate date_next;
                int append;
 
                append = FALSE;
 
-               if (cur->roaming == TRUE)
+               if (cur->roaming)
                        roaming = cur;
                else
                        home = cur;
@@ -694,7 +695,8 @@ static struct stats_record *process_file(struct stats_iter *iter,
 
                        if (day_cur == day_next && month_cur != month_next)
                                append = TRUE;
-                       else if (day_cur < account_period_offset && day_next >= account_period_offset)
+                       else if (day_cur < account_period_offset
+                                       && day_next >= account_period_offset)
                                append = TRUE;
                } else {
                        /* day period size */
@@ -702,13 +704,13 @@ static struct stats_record *process_file(struct stats_iter *iter,
                                append = TRUE;
                }
 
-               if (append == TRUE) {
-                       if (home != NULL) {
+               if (append) {
+                       if (home) {
                                append_record(temp_file, home);
                                home = NULL;
                        }
 
-                       if (roaming != NULL) {
+                       if (roaming) {
                                append_record(temp_file, roaming);
                                roaming = NULL;
                        }
@@ -750,14 +752,15 @@ static int summarize(struct stats_file *data_file,
        /* Now process history file */
        cur = NULL;
 
-       if (history_file != NULL) {
+       if (history_file) {
                history_iter.file = history_file;
                history_iter.begin = get_iterator_begin(history_iter.file);
                history_iter.end = get_iterator_end(history_iter.file);
                history_iter.it = history_iter.begin;
 
                cur = process_file(&history_iter, temp_file, NULL,
-                                       &date_change_step_size, account_period_offset);
+                                       &date_change_step_size,
+                                       account_period_offset);
        }
 
        data_iter.file = data_file;
@@ -769,9 +772,9 @@ static int summarize(struct stats_file *data_file,
         * Ensure date_file records are newer than the history_file
         * record
         */
-       if (cur != NULL) {
+       if (cur) {
                next = get_next_record(&data_iter);
-               while(next != NULL && cur->ts > next->ts)
+               while (next && cur->ts > next->ts)
                        next = get_next_record(&data_iter);
        }
 
@@ -779,7 +782,7 @@ static int summarize(struct stats_file *data_file,
        cur = process_file(&data_iter, temp_file, cur,
                                &date_change_step_size, account_period_offset);
 
-       if (cur != NULL)
+       if (cur)
                append_record(temp_file, cur);
 
        return 0;
@@ -814,7 +817,7 @@ static void history_file_update(struct stats_file *data_file,
                history_file = &_history_file;
 
        if (stats_open(&tempory_file, NULL) < 0) {
-               if (history_file != NULL)
+               if (history_file)
                        stats_close(history_file);
                return;
        }
@@ -844,8 +847,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -866,7 +869,7 @@ int main(int argc, char *argv[])
                exit(1);
        }
 
-       if (option_last_file_name != NULL) {
+       if (option_last_file_name) {
                struct stats_file last;
                if (stats_open(&last, option_last_file_name) < 0) {
                        fprintf(stderr, "failed open file %s\n",
@@ -883,7 +886,8 @@ int main(int argc, char *argv[])
                start_ts = option_start_ts;
 
        if (option_create > 0)
-               stats_create(data_file, option_create, option_interval, start_ts, rec);
+               stats_create(data_file, option_create, option_interval,
+                               start_ts, rec);
 
        hdr = get_hdr(data_file);
        if (hdr->magic != MAGIC) {
@@ -895,13 +899,13 @@ int main(int argc, char *argv[])
 
        stats_hdr_info(data_file);
 
-       if (option_dump == TRUE)
+       if (option_dump)
                stats_print_entries(data_file);
 
-       if (option_summary == TRUE)
+       if (option_summary)
                stats_print_diff(data_file);
 
-       if (option_info_file_name != NULL)
+       if (option_info_file_name)
                history_file_update(data_file, option_info_file_name);
 
 err:
index 028a275..d409da2 100644 (file)
@@ -51,7 +51,7 @@ void supplicant_dbus_array_foreach(DBusMessageIter *iter,
        dbus_message_iter_recurse(iter, &entry);
 
        while (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_INVALID) {
-               if (function != NULL)
+               if (function)
                        function(&entry, user_data);
 
                dbus_message_iter_next(&entry);
@@ -86,11 +86,11 @@ void supplicant_dbus_property_foreach(DBusMessageIter *iter,
 
                dbus_message_iter_recurse(&entry, &value);
 
-               if (key != NULL) {
+               if (key) {
                        if (strcmp(key, "Properties") == 0)
                                supplicant_dbus_property_foreach(&value,
                                                        function, user_data);
-                       else if (function != NULL)
+                       else if (function)
                                function(key, &value, user_data);
                }
 
@@ -114,13 +114,13 @@ static void property_get_all_reply(DBusPendingCall *call, void *user_data)
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
                goto done;
 
-       if (dbus_message_iter_init(reply, &iter) == FALSE)
+       if (!dbus_message_iter_init(reply, &iter))
                goto done;
 
        supplicant_dbus_property_foreach(&iter, data->function,
                                                        data->user_data);
 
-       if (data->function != NULL)
+       if (data->function)
                data->function(NULL, NULL, data->user_data);
 
 done:
@@ -137,19 +137,19 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface,
        DBusMessage *message;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL)
+       if (!path || !interface)
                return -EINVAL;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                        DBUS_INTERFACE_PROPERTIES, "GetAll");
-       if (message == NULL) {
+       if (!message) {
                dbus_free(data);
                return -ENOMEM;
        }
@@ -158,14 +158,14 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface,
 
        dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, NULL);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                                       &call, TIMEOUT)) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
@@ -201,10 +201,10 @@ static void property_set_reply(DBusPendingCall *call, void *user_data)
        else
                error = NULL;
 
-       if (dbus_message_iter_init(reply, &iter) == FALSE)
+       if (!dbus_message_iter_init(reply, &iter))
                goto done;
 
-       if (data->function != NULL)
+       if (data->function)
                data->function(error, &iter, data->user_data);
 
 done:
@@ -224,22 +224,22 @@ int supplicant_dbus_property_set(const char *path, const char *interface,
        DBusMessageIter iter, value;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL)
+       if (!path || !interface)
                return -EINVAL;
 
-       if (key == NULL || signature == NULL || setup == NULL)
+       if (!key || !signature || !setup)
                return -EINVAL;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                        DBUS_INTERFACE_PROPERTIES, "Set");
-       if (message == NULL) {
+       if (!message) {
                dbus_free(data);
                return -ENOMEM;
        }
@@ -255,14 +255,14 @@ int supplicant_dbus_property_set(const char *path, const char *interface,
        setup(&value, user_data);
        dbus_message_iter_close_container(&iter, &value);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
@@ -300,7 +300,7 @@ static void method_call_reply(DBusPendingCall *call, void *user_data)
 
        dbus_message_iter_init(reply, &iter);
 
-       if (data->function != NULL)
+       if (data->function)
                data->function(error, &iter, data->user_data);
 
        dbus_message_unref(reply);
@@ -319,19 +319,19 @@ int supplicant_dbus_method_call(const char *path,
        DBusMessageIter iter;
        DBusPendingCall *call;
 
-       if (connection == NULL)
+       if (!connection)
                return -EINVAL;
 
-       if (path == NULL || interface == NULL || method == NULL)
+       if (!path || !interface || !method)
                return -EINVAL;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path,
                                                        interface, method);
-       if (message == NULL) {
+       if (!message) {
                dbus_free(data);
                return -ENOMEM;
        }
@@ -339,17 +339,17 @@ int supplicant_dbus_method_call(const char *path,
        dbus_message_set_auto_start(message, FALSE);
 
        dbus_message_iter_init_append(message, &iter);
-       if (setup != NULL)
+       if (setup)
                setup(&iter, user_data);
 
-       if (dbus_connection_send_with_reply(connection, message,
-                                               &call, TIMEOUT) == FALSE) {
+       if (!dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT)) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
        }
 
-       if (call == NULL) {
+       if (!call) {
                dbus_message_unref(message);
                dbus_free(data);
                return -EIO;
index 9b33275..a640807 100644 (file)
@@ -156,8 +156,8 @@ int main(int argc, char *argv[])
        dbus_error_init(&err);
 
        conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, &err);
-       if (conn == NULL) {
-               if (dbus_error_is_set(&err) == TRUE) {
+       if (!conn) {
+               if (dbus_error_is_set(&err)) {
                        fprintf(stderr, "%s\n", err.message);
                        dbus_error_free(&err);
                } else
index 1c96823..e2e6fea 100644 (file)
@@ -184,12 +184,12 @@ struct supplicant_bss {
 
 static enum supplicant_mode string2mode(const char *mode)
 {
-       if (mode == NULL)
+       if (!mode)
                return SUPPLICANT_MODE_UNKNOWN;
 
-       if (g_str_equal(mode, "infrastructure") == TRUE)
+       if (g_str_equal(mode, "infrastructure"))
                return SUPPLICANT_MODE_INFRA;
-       else if (g_str_equal(mode, "ad-hoc") == TRUE)
+       else if (g_str_equal(mode, "ad-hoc"))
                return SUPPLICANT_MODE_IBSS;
 
        return SUPPLICANT_MODE_UNKNOWN;
@@ -229,28 +229,28 @@ static const char *security2string(enum supplicant_security security)
 
 static enum supplicant_state string2state(const char *state)
 {
-       if (state == NULL)
+       if (!state)
                return SUPPLICANT_STATE_UNKNOWN;
 
-       if (g_str_equal(state, "unknown") == TRUE)
+       if (g_str_equal(state, "unknown"))
                return SUPPLICANT_STATE_UNKNOWN;
-       else if (g_str_equal(state, "disconnected") == TRUE)
+       else if (g_str_equal(state, "disconnected"))
                return SUPPLICANT_STATE_DISCONNECTED;
-       else if (g_str_equal(state, "inactive") == TRUE)
+       else if (g_str_equal(state, "inactive"))
                return SUPPLICANT_STATE_INACTIVE;
-       else if (g_str_equal(state, "scanning") == TRUE)
+       else if (g_str_equal(state, "scanning"))
                return SUPPLICANT_STATE_SCANNING;
-       else if (g_str_equal(state, "authenticating") == TRUE)
+       else if (g_str_equal(state, "authenticating"))
                return SUPPLICANT_STATE_AUTHENTICATING;
-       else if (g_str_equal(state, "associating") == TRUE)
+       else if (g_str_equal(state, "associating"))
                return SUPPLICANT_STATE_ASSOCIATING;
-       else if (g_str_equal(state, "associated") == TRUE)
+       else if (g_str_equal(state, "associated"))
                return SUPPLICANT_STATE_ASSOCIATED;
-       else if (g_str_equal(state, "group_handshake") == TRUE)
+       else if (g_str_equal(state, "group_handshake"))
                return SUPPLICANT_STATE_GROUP_HANDSHAKE;
-       else if (g_str_equal(state, "4way_handshake") == TRUE)
+       else if (g_str_equal(state, "4way_handshake"))
                return SUPPLICANT_STATE_4WAY_HANDSHAKE;
-       else if (g_str_equal(state, "completed") == TRUE)
+       else if (g_str_equal(state, "completed"))
                return SUPPLICANT_STATE_COMPLETED;
 
        return SUPPLICANT_STATE_UNKNOWN;
@@ -258,15 +258,15 @@ static enum supplicant_state string2state(const char *state)
 
 static void callback_system_ready(void)
 {
-       if (system_ready == TRUE)
+       if (system_ready)
                return;
 
        system_ready = TRUE;
 
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->system_ready == NULL)
+       if (!callbacks_pointer->system_ready)
                return;
 
        callbacks_pointer->system_ready();
@@ -276,10 +276,10 @@ static void callback_system_killed(void)
 {
        system_ready = FALSE;
 
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->system_killed == NULL)
+       if (!callbacks_pointer->system_killed)
                return;
 
        callbacks_pointer->system_killed();
@@ -287,10 +287,10 @@ static void callback_system_killed(void)
 
 static void callback_interface_added(struct supplicant_interface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->interface_added == NULL)
+       if (!callbacks_pointer->interface_added)
                return;
 
        callbacks_pointer->interface_added(interface);
@@ -298,10 +298,10 @@ static void callback_interface_added(struct supplicant_interface *interface)
 
 static void callback_interface_removed(struct supplicant_interface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->interface_removed == NULL)
+       if (!callbacks_pointer->interface_removed)
                return;
 
        callbacks_pointer->interface_removed(interface);
@@ -309,10 +309,10 @@ static void callback_interface_removed(struct supplicant_interface *interface)
 
 static void callback_scan_started(struct supplicant_interface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->scan_started == NULL)
+       if (!callbacks_pointer->scan_started)
                return;
 
        callbacks_pointer->scan_started(interface);
@@ -320,10 +320,10 @@ static void callback_scan_started(struct supplicant_interface *interface)
 
 static void callback_scan_finished(struct supplicant_interface *interface)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->scan_finished == NULL)
+       if (!callbacks_pointer->scan_finished)
                return;
 
        callbacks_pointer->scan_finished(interface);
@@ -331,10 +331,10 @@ static void callback_scan_finished(struct supplicant_interface *interface)
 
 static void callback_network_added(struct supplicant_network *network)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->network_added == NULL)
+       if (!callbacks_pointer->network_added)
                return;
 
        callbacks_pointer->network_added(network);
@@ -342,10 +342,10 @@ static void callback_network_added(struct supplicant_network *network)
 
 static void callback_network_removed(struct supplicant_network *network)
 {
-       if (callbacks_pointer == NULL)
+       if (!callbacks_pointer)
                return;
 
-       if (callbacks_pointer->network_removed == NULL)
+       if (!callbacks_pointer->network_removed)
                return;
 
        callbacks_pointer->network_removed(network);
@@ -396,7 +396,7 @@ static void debug_strvalmap(const char *label, struct strvalmap *map,
 {
        int i;
 
-       for (i = 0; map[i].str != NULL; i++) {
+       for (i = 0; map[i].str; i++) {
                if (val & map[i].val)
                        DBG("%s: %s", label, map[i].str);
        }
@@ -409,10 +409,10 @@ static void interface_capability_keymgmt(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; keymgmt_capa_map[i].str != NULL; i++)
+       for (i = 0; keymgmt_capa_map[i].str; i++)
                if (strcmp(str, keymgmt_capa_map[i].str) == 0) {
                        interface->keymgmt_capa |= keymgmt_capa_map[i].val;
                        break;
@@ -426,10 +426,10 @@ static void interface_capability_authalg(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; authalg_capa_map[i].str != NULL; i++)
+       for (i = 0; authalg_capa_map[i].str; i++)
                if (strcmp(str, authalg_capa_map[i].str) == 0) {
                        interface->authalg_capa |= authalg_capa_map[i].val;
                        break;
@@ -443,10 +443,10 @@ static void interface_capability_proto(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; proto_capa_map[i].str != NULL; i++)
+       for (i = 0; proto_capa_map[i].str; i++)
                if (strcmp(str, proto_capa_map[i].str) == 0) {
                        interface->proto_capa |= proto_capa_map[i].val;
                        break;
@@ -460,10 +460,10 @@ static void interface_capability_pairwise(DBusMessageIter *iter, void *user_data
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; pairwise_capa_map[i].str != NULL; i++)
+       for (i = 0; pairwise_capa_map[i].str; i++)
                if (strcmp(str, pairwise_capa_map[i].str) == 0) {
                        interface->pairwise_capa |= pairwise_capa_map[i].val;
                        break;
@@ -477,10 +477,10 @@ static void interface_capability_group(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; group_capa_map[i].str != NULL; i++)
+       for (i = 0; group_capa_map[i].str; i++)
                if (strcmp(str, group_capa_map[i].str) == 0) {
                        interface->group_capa |= group_capa_map[i].val;
                        break;
@@ -494,10 +494,10 @@ static void interface_capability_scan(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; scan_capa_map[i].str != NULL; i++)
+       for (i = 0; scan_capa_map[i].str; i++)
                if (strcmp(str, scan_capa_map[i].str) == 0) {
                        interface->scan_capa |= scan_capa_map[i].val;
                        break;
@@ -511,10 +511,10 @@ static void interface_capability_mode(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; mode_capa_map[i].str != NULL; i++)
+       for (i = 0; mode_capa_map[i].str; i++)
                if (strcmp(str, mode_capa_map[i].str) == 0) {
                        interface->mode_capa |= mode_capa_map[i].val;
                        break;
@@ -526,7 +526,7 @@ static void interface_capability(const char *key, DBusMessageIter *iter,
 {
        struct supplicant_interface *interface = user_data;
 
-       if (key == NULL)
+       if (!key)
                return;
 
        if (g_strcmp0(key, "KeyMgmt") == 0)
@@ -557,7 +557,7 @@ static void interface_capability(const char *key, DBusMessageIter *iter,
 
 const char *supplicant_interface_get_ifname(struct supplicant_interface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        return interface->ifname;
@@ -565,7 +565,7 @@ const char *supplicant_interface_get_ifname(struct supplicant_interface *interfa
 
 const char *supplicant_interface_get_driver(struct supplicant_interface *interface)
 {
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        return interface->driver;
@@ -573,7 +573,7 @@ const char *supplicant_interface_get_driver(struct supplicant_interface *interfa
 
 struct supplicant_interface *supplicant_network_get_interface(struct supplicant_network *network)
 {
-       if (network == NULL)
+       if (!network)
                return NULL;
 
        return network->interface;
@@ -581,7 +581,7 @@ struct supplicant_interface *supplicant_network_get_interface(struct supplicant_
 
 const char *supplicant_network_get_name(struct supplicant_network *network)
 {
-       if (network == NULL || network->name == NULL)
+       if (!network || !network->name)
                return "";
 
        return network->name;
@@ -589,7 +589,7 @@ const char *supplicant_network_get_name(struct supplicant_network *network)
 
 const char *supplicant_network_get_identifier(struct supplicant_network *network)
 {
-       if (network == NULL || network->group == NULL)
+       if (!network || !network->group)
                return "";
 
        return network->group;
@@ -597,7 +597,7 @@ const char *supplicant_network_get_identifier(struct supplicant_network *network
 
 enum supplicant_mode supplicant_network_get_mode(struct supplicant_network *network)
 {
-       if (network == NULL)
+       if (!network)
                return SUPPLICANT_MODE_UNKNOWN;
 
        return network->mode;
@@ -616,13 +616,13 @@ static void merge_network(struct supplicant_network *network)
 
        DBG("ssid %s mode %s", ssid, mode);
 
-       if (ssid != NULL)
+       if (ssid)
                ssid_len = strlen(ssid);
        else
                ssid_len = 0;
 
        str = g_string_sized_new((ssid_len * 2) + 24);
-       if (str == NULL)
+       if (!str)
                return;
 
        for (i = 0; i < ssid_len; i++)
@@ -653,10 +653,10 @@ static void network_property(const char *key, DBusMessageIter *iter,
 {
        struct supplicant_network *network = user_data;
 
-       if (network->interface == NULL)
+       if (!network->interface)
                return;
 
-       if (key == NULL) {
+       if (!key) {
                merge_network(network);
                return;
        }
@@ -669,7 +669,7 @@ static void network_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL)
+               if (str)
                        g_hash_table_replace(network->config_table,
                                                g_strdup(key), g_strdup(str));
        } else
@@ -684,18 +684,18 @@ static void interface_network_added(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        if (g_strcmp0(path, "/") == 0)
                return;
 
        network = g_hash_table_lookup(interface->net_mapping, path);
-       if (network != NULL)
+       if (network)
                return;
 
        network = g_try_new0(struct supplicant_network, 1);
-       if (network == NULL)
+       if (!network)
                return;
 
        network->interface = interface;
@@ -724,11 +724,11 @@ static void interface_network_removed(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        network = g_hash_table_lookup(interface->net_mapping, path);
-       if (network == NULL)
+       if (!network)
                return;
 
        g_hash_table_remove(interface->net_mapping, path);
@@ -744,7 +744,7 @@ static char *create_name(unsigned char *ssid, int ssid_len)
        else
                name = g_try_malloc0(ssid_len + 1);
 
-       if (name == NULL)
+       if (!name)
                return g_strdup("");
 
        for (i = 0; i < ssid_len; i++) {
@@ -764,7 +764,7 @@ static char *create_group(struct supplicant_bss *bss)
        const char *mode, *security;
 
        str = g_string_sized_new((bss->ssid_len * 2) + 24);
-       if (str == NULL)
+       if (!str)
                return NULL;
 
        if (bss->ssid_len > 0 && bss->ssid[0] != '\0') {
@@ -774,11 +774,11 @@ static char *create_group(struct supplicant_bss *bss)
                g_string_append_printf(str, "hidden");
 
        mode = mode2string(bss->mode);
-       if (mode != NULL)
+       if (mode)
                g_string_append_printf(str, "_%s", mode);
 
        security = security2string(bss->security);
-       if (security != NULL)
+       if (security)
                g_string_append_printf(str, "_%s", security);
 
        return g_string_free(str, FALSE);
@@ -791,17 +791,17 @@ static void add_bss_to_network(struct supplicant_bss *bss)
        char *group;
 
        group = create_group(bss);
-       if (group == NULL)
+       if (!group)
                return;
 
        network = g_hash_table_lookup(interface->network_table, group);
-       if (network != NULL) {
+       if (network) {
                g_free(group);
                goto done;
        }
 
        network = g_try_new0(struct supplicant_network, 1);
-       if (network == NULL) {
+       if (!network) {
                g_free(group);
                return;
        }
@@ -914,15 +914,15 @@ static void bss_property(const char *key, DBusMessageIter *iter,
 {
        struct supplicant_bss *bss = user_data;
 
-       if (bss->interface == NULL)
+       if (!bss->interface)
                return;
 
-       if (key == NULL) {
-               if (bss->ieee8021x == TRUE)
+       if (!key) {
+               if (bss->ieee8021x)
                        bss->security = SUPPLICANT_SECURITY_IEEE8021X;
-               else if (bss->psk == TRUE)
+               else if (bss->psk)
                        bss->security = SUPPLICANT_SECURITY_PSK;
-               else if (bss->privacy == TRUE)
+               else if (bss->privacy)
                        bss->security = SUPPLICANT_SECURITY_WEP;
                else
                        bss->security = SUPPLICANT_SECURITY_NONE;
@@ -1039,21 +1039,21 @@ static void interface_bss_added(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        if (g_strcmp0(path, "/") == 0)
                return;
 
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network != NULL) {
+       if (network) {
                bss = g_hash_table_lookup(network->bss_table, path);
-               if (bss != NULL)
+               if (bss)
                        return;
        }
 
        bss = g_try_new0(struct supplicant_bss, 1);
-       if (bss == NULL)
+       if (!bss)
                return;
 
        bss->interface = interface;
@@ -1078,11 +1078,11 @@ static void interface_bss_removed(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network == NULL)
+       if (!network)
                return;
 
        g_hash_table_remove(bss_mapping, path);
@@ -1099,10 +1099,10 @@ static void interface_property(const char *key, DBusMessageIter *iter,
 {
        struct supplicant_interface *interface = user_data;
 
-       if (interface == NULL)
+       if (!interface)
                return;
 
-       if (key == NULL) {
+       if (!key) {
                debug_strvalmap("KeyMgmt capability", keymgmt_capa_map,
                                                interface->keymgmt_capa);
                debug_strvalmap("AuthAlg capability", authalg_capa_map,
@@ -1130,7 +1130,7 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL)
+               if (str)
                        interface->state = string2state(str);
 
                DBG("state %s (%d)", str, interface->state);
@@ -1140,8 +1140,8 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                dbus_message_iter_get_basic(iter, &scanning);
                interface->scanning = scanning;
 
-               if (interface->ready == TRUE) {
-                       if (interface->scanning == TRUE)
+               if (interface->ready) {
+                       if (interface->scanning)
                                callback_scan_started(interface);
                        else
                                callback_scan_finished(interface);
@@ -1155,19 +1155,19 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL)
+               if (str)
                        interface->ifname = g_strdup(str);
        } else if (g_strcmp0(key, "Driver") == 0) {
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL)
+               if (str)
                        interface->driver = g_strdup(str);
        } else if (g_strcmp0(key, "BridgeIfname") == 0) {
                const char *str = NULL;
 
                dbus_message_iter_get_basic(iter, &str);
-               if (str != NULL)
+               if (str)
                        interface->bridge = g_strdup(str);
        } else if (g_strcmp0(key, "CurrentBSS") == 0) {
                interface_bss_added(iter, interface);
@@ -1190,7 +1190,7 @@ static struct supplicant_interface *interface_alloc(const char *path)
        struct supplicant_interface *interface;
 
        interface = g_try_new0(struct supplicant_interface, 1);
-       if (interface == NULL)
+       if (!interface)
                return NULL;
 
        interface->path = g_strdup(path);
@@ -1214,18 +1214,18 @@ static void interface_added(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        if (g_strcmp0(path, "/") == 0)
                return;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface != NULL)
+       if (interface)
                return;
 
        interface = interface_alloc(path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        dbus_message_iter_next(iter);
@@ -1246,7 +1246,7 @@ static void interface_removed(DBusMessageIter *iter, void *user_data)
        const char *path = NULL;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL)
+       if (!path)
                return;
 
        g_hash_table_remove(interface_table, path);
@@ -1258,10 +1258,10 @@ static void eap_method(DBusMessageIter *iter, void *user_data)
        int i;
 
        dbus_message_iter_get_basic(iter, &str);
-       if (str == NULL)
+       if (!str)
                return;
 
-       for (i = 0; eap_method_map[i].str != NULL; i++)
+       for (i = 0; eap_method_map[i].str; i++)
                if (strcmp(str, eap_method_map[i].str) == 0) {
                        eap_methods |= eap_method_map[i].val;
                        break;
@@ -1271,7 +1271,7 @@ static void eap_method(DBusMessageIter *iter, void *user_data)
 static void service_property(const char *key, DBusMessageIter *iter,
                                                        void *user_data)
 {
-       if (key == NULL) {
+       if (!key) {
                callback_system_ready();
                return;
        }
@@ -1281,7 +1281,7 @@ static void service_property(const char *key, DBusMessageIter *iter,
                int i;
 
                dbus_message_iter_get_basic(iter, &str);
-               for (i = 0; debug_strings[i] != NULL; i++)
+               for (i = 0; debug_strings[i]; i++)
                        if (g_strcmp0(debug_strings[i], str) == 0) {
                                debug_level = i;
                                break;
@@ -1318,7 +1318,7 @@ static void signal_name_owner_changed(const char *path, DBusMessageIter *iter)
                return;
 
        dbus_message_iter_get_basic(iter, &name);
-       if (name == NULL)
+       if (!name)
                return;
 
        if (g_strcmp0(name, SUPPLICANT_SERVICE) != 0)
@@ -1329,7 +1329,7 @@ static void signal_name_owner_changed(const char *path, DBusMessageIter *iter)
        dbus_message_iter_next(iter);
        dbus_message_iter_get_basic(iter, &new);
 
-       if (old == NULL || new == NULL)
+       if (!old || !new)
                return;
 
        if (strlen(old) > 0 && strlen(new) == 0) {
@@ -1370,7 +1370,7 @@ static void signal_interface_changed(const char *path, DBusMessageIter *iter)
        struct supplicant_interface *interface;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        supplicant_dbus_property_foreach(iter, interface_property, interface);
@@ -1382,15 +1382,15 @@ static void signal_scan_done(const char *path, DBusMessageIter *iter)
        dbus_bool_t success = FALSE;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        dbus_message_iter_get_basic(iter, &success);
 
-       if (interface->scan_callback != NULL) {
+       if (interface->scan_callback) {
                int result = 0;
 
-               if (success == FALSE)
+               if (!success)
                        result = -EIO;
 
                interface->scan_callback(result, interface->scan_data);
@@ -1405,7 +1405,7 @@ static void signal_bss_added(const char *path, DBusMessageIter *iter)
        struct supplicant_interface *interface;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_bss_added(iter, interface);
@@ -1416,7 +1416,7 @@ static void signal_bss_removed(const char *path, DBusMessageIter *iter)
        struct supplicant_interface *interface;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_bss_removed(iter, interface);
@@ -1427,7 +1427,7 @@ static void signal_network_added(const char *path, DBusMessageIter *iter)
        struct supplicant_interface *interface;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_network_added(iter, interface);
@@ -1438,7 +1438,7 @@ static void signal_network_removed(const char *path, DBusMessageIter *iter)
        struct supplicant_interface *interface;
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        interface_network_removed(iter, interface);
@@ -1451,15 +1451,15 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter)
        struct supplicant_bss *bss;
 
        interface = g_hash_table_lookup(bss_mapping, path);
-       if (interface == NULL)
+       if (!interface)
                return;
 
        network = g_hash_table_lookup(interface->bss_mapping, path);
-       if (network == NULL)
+       if (!network)
                return;
 
        bss = g_hash_table_lookup(network->bss_table, path);
-       if (bss == NULL)
+       if (!bss)
                return;
 
        supplicant_dbus_property_foreach(iter, bss_property, bss);
@@ -1497,19 +1497,17 @@ static DBusHandlerResult supplicant_filter(DBusConnection *conn,
        int i;
 
        path = dbus_message_get_path(message);
-       if (path == NULL)
+       if (!path)
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       if (dbus_message_iter_init(message, &iter) == FALSE)
+       if (!dbus_message_iter_init(message, &iter))
                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-       for (i = 0; signal_map[i].interface != NULL; i++) {
-               if (dbus_message_has_interface(message,
-                                       signal_map[i].interface) == FALSE)
+       for (i = 0; signal_map[i].interface; i++) {
+               if (!dbus_message_has_interface(message, signal_map[i].interface))
                        continue;
 
-               if (dbus_message_has_member(message,
-                                       signal_map[i].member) == FALSE)
+               if (!dbus_message_has_member(message, signal_map[i].member))
                        continue;
 
                signal_map[i].function(path, &iter);
@@ -1541,11 +1539,10 @@ static const char *supplicant_rule6 = "type=signal,"
 int supplicant_register(const struct supplicant_callbacks *callbacks)
 {
        connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-       if (connection == NULL)
+       if (!connection)
                return -EIO;
 
-       if (dbus_connection_add_filter(connection,
-                               supplicant_filter, NULL, NULL) == FALSE) {
+       if (!dbus_connection_add_filter(connection, supplicant_filter, NULL, NULL)) {
                dbus_connection_unref(connection);
                connection = NULL;
                return -EIO;
@@ -1572,7 +1569,7 @@ int supplicant_register(const struct supplicant_callbacks *callbacks)
        dbus_connection_flush(connection);
 
        if (dbus_bus_name_has_owner(connection,
-                                       SUPPLICANT_SERVICE, NULL) == TRUE) {
+                                       SUPPLICANT_SERVICE, NULL)) {
                system_available = TRUE;
                supplicant_bootstrap();
        }
@@ -1582,7 +1579,7 @@ int supplicant_register(const struct supplicant_callbacks *callbacks)
 
 void supplicant_unregister(const struct supplicant_callbacks *callbacks)
 {
-       if (connection != NULL) {
+       if (connection) {
                dbus_bus_remove_match(connection, supplicant_rule6, NULL);
                dbus_bus_remove_match(connection, supplicant_rule5, NULL);
                dbus_bus_remove_match(connection, supplicant_rule4, NULL);
@@ -1596,20 +1593,20 @@ void supplicant_unregister(const struct supplicant_callbacks *callbacks)
                                                supplicant_filter, NULL);
        }
 
-       if (bss_mapping != NULL) {
+       if (bss_mapping) {
                g_hash_table_destroy(bss_mapping);
                bss_mapping = NULL;
        }
 
-       if (interface_table != NULL) {
+       if (interface_table) {
                g_hash_table_destroy(interface_table);
                interface_table = NULL;
        }
 
-       if (system_available == TRUE)
+       if (system_available)
                callback_system_killed();
 
-       if (connection != NULL) {
+       if (connection) {
                dbus_connection_unref(connection);
                connection = NULL;
        }
@@ -1621,7 +1618,7 @@ void supplicant_unregister(const struct supplicant_callbacks *callbacks)
 static void debug_level_result(const char *error,
                                DBusMessageIter *iter, void *user_data)
 {
-       if (error != NULL)
+       if (error)
                DBG("debug level failure: %s", error);
 }
 
@@ -1640,7 +1637,7 @@ static void debug_level_params(DBusMessageIter *iter, void *user_data)
 
 void supplicant_set_debug_level(unsigned int level)
 {
-       if (system_available == FALSE)
+       if (!system_available)
                return;
 
        supplicant_dbus_property_set(SUPPLICANT_PATH, SUPPLICANT_INTERFACE,
@@ -1663,8 +1660,8 @@ static void interface_create_property(const char *key, DBusMessageIter *iter,
        struct interface_create_data *data = user_data;
        struct supplicant_interface *interface = data->interface;
 
-       if (key == NULL) {
-               if (data->callback != NULL)
+       if (!key) {
+               if (data->callback)
                        data->callback(0, data->interface, data->user_data);
 
                dbus_free(data);
@@ -1680,26 +1677,26 @@ static void interface_create_result(const char *error,
        const char *path = NULL;
        int err;
 
-       if (error != NULL) {
+       if (error) {
                err = -EIO;
                goto done;
        }
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL) {
+       if (!path) {
                err = -EINVAL;
                goto done;
        }
 
-       if (system_available == FALSE) {
+       if (!system_available) {
                err = -EFAULT;
                goto done;
        }
 
        data->interface = g_hash_table_lookup(interface_table, path);
-       if (data->interface == NULL) {
+       if (!data->interface) {
                data->interface = interface_alloc(path);
-               if (data->interface == NULL) {
+               if (!data->interface) {
                        err = -ENOMEM;
                        goto done;
                }
@@ -1712,7 +1709,7 @@ static void interface_create_result(const char *error,
                return;
 
 done:
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(err, NULL, data->user_data);
 
        dbus_free(data);
@@ -1728,7 +1725,7 @@ static void interface_create_params(DBusMessageIter *iter, void *user_data)
        supplicant_dbus_dict_append_basic(&dict, "Ifname",
                                        DBUS_TYPE_STRING, &data->ifname);
 
-       if (data->driver != NULL)
+       if (data->driver)
                supplicant_dbus_dict_append_basic(&dict, "Driver",
                                        DBUS_TYPE_STRING, &data->driver);
 
@@ -1743,22 +1740,22 @@ static void interface_get_result(const char *error,
        const char *path = NULL;
        int err;
 
-       if (error != NULL)
+       if (error)
                goto create;
 
        dbus_message_iter_get_basic(iter, &path);
-       if (path == NULL) {
+       if (!path) {
                err = -EINVAL;
                goto done;
        }
 
        interface = g_hash_table_lookup(interface_table, path);
-       if (interface == NULL) {
+       if (!interface) {
                err = -ENOENT;
                goto done;
        }
 
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(0, interface, data->user_data);
 
        dbus_free(data);
@@ -1766,7 +1763,7 @@ static void interface_get_result(const char *error,
        return;
 
 create:
-       if (system_available == FALSE) {
+       if (!system_available) {
                err = -EFAULT;
                goto done;
        }
@@ -1780,7 +1777,7 @@ create:
                return;
 
 done:
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(err, NULL, data->user_data);
 
        dbus_free(data);
@@ -1799,14 +1796,14 @@ int supplicant_interface_create(const char *ifname, const char *driver,
 {
        struct interface_create_data *data;
 
-       if (ifname == NULL)
+       if (!ifname)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->ifname = ifname;
@@ -1825,10 +1822,10 @@ int supplicant_interface_remove(struct supplicant_interface *interface,
                        supplicant_interface_remove_callback callback,
                                                        void *user_data)
 {
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        return 0;
@@ -1845,8 +1842,8 @@ static void interface_scan_result(const char *error,
 {
        struct interface_scan_data *data = user_data;
 
-       if (error != NULL) {
-               if (data->callback != NULL)
+       if (error) {
+               if (data->callback)
                        data->callback(-EIO, data->user_data);
        } else {
                data->interface->scan_callback = data->callback;
@@ -1875,17 +1872,17 @@ int supplicant_interface_scan(struct supplicant_interface *interface,
 {
        struct interface_scan_data *data;
 
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
-       if (interface->scanning == TRUE)
+       if (interface->scanning)
                return -EALREADY;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->interface = interface;
@@ -1908,10 +1905,10 @@ static void interface_disconnect_result(const char *error,
        struct interface_disconnect_data *data = user_data;
        int result = 0;
 
-       if (error != NULL)
+       if (error)
                result = -EIO;
 
-       if (data->callback != NULL)
+       if (data->callback)
                data->callback(result, data->user_data);
 
        dbus_free(data);
@@ -1923,14 +1920,14 @@ int supplicant_interface_disconnect(struct supplicant_interface *interface,
 {
        struct interface_disconnect_data *data;
 
-       if (interface == NULL)
+       if (!interface)
                return -EINVAL;
 
-       if (system_available == FALSE)
+       if (!system_available)
                return -EFAULT;
 
        data = dbus_malloc0(sizeof(*data));
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->callback = callback;
index 1074c9c..fdc098a 100644 (file)
@@ -49,7 +49,7 @@ static int inet_ifup(const char *ifname)
                return -errno;
 
        memset(&ifr, 0, sizeof(ifr));
-       strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+       strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
 
        if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
                err = -errno;
@@ -89,7 +89,7 @@ static int create_tap(const char *ifname)
 
        memset(&ifr, 0, sizeof(ifr));
        ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
-       strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+       strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
 
        if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) {
                perror("Failed to set TUN/TAP interface");
index a507397..55c58af 100644 (file)
@@ -43,7 +43,7 @@ static void sig_term(int sig)
        g_main_loop_quit(main_loop);
 }
 
-static gboolean web_result(GWebResult *result, gpointer user_data)
+static bool web_result(GWebResult *result, gpointer user_data)
 {
        const guint8 *chunk;
        gsize length;
@@ -54,7 +54,7 @@ static gboolean web_result(GWebResult *result, gpointer user_data)
 
        if (length > 0) {
                printf("%s\n", (char *) chunk);
-               return TRUE;
+               return true;
        }
 
        status = g_web_result_get_status(result);
@@ -67,10 +67,10 @@ static gboolean web_result(GWebResult *result, gpointer user_data)
 
        g_main_loop_quit(main_loop);
 
-       return FALSE;
+       return false;
 }
 
-static gboolean option_debug = FALSE;
+static bool option_debug = false;
 static gchar *option_proxy = NULL;
 static gchar *option_nameserver = NULL;
 static gchar *option_user_agent = NULL;
@@ -101,8 +101,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -118,32 +118,32 @@ int main(int argc, char *argv[])
        }
 
        web = g_web_new(index);
-       if (web == NULL) {
+       if (!web) {
                fprintf(stderr, "Failed to create web service\n");
                return 1;
        }
 
-       if (option_debug == TRUE)
+       if (option_debug)
                g_web_set_debug(web, web_debug, "WEB");
 
        main_loop = g_main_loop_new(NULL, FALSE);
 
-       if (option_proxy != NULL) {
+       if (option_proxy) {
                g_web_set_proxy(web, option_proxy);
                g_free(option_proxy);
        }
 
-       if (option_nameserver != NULL) {
+       if (option_nameserver) {
                g_web_add_nameserver(web, option_nameserver);
                g_free(option_nameserver);
        }
 
-       if (option_user_agent != NULL) {
+       if (option_user_agent) {
                g_web_set_user_agent(web, "%s", option_user_agent);
                g_free(option_user_agent);
        }
 
-       if (option_http_version != NULL) {
+       if (option_http_version) {
                g_web_set_http_version(web, option_http_version);
                g_free(option_http_version);
        }
index 122bea5..d5f9341 100644 (file)
@@ -100,7 +100,7 @@ static const char *response_code_to_string(int response_code)
 }
 
 struct wispr_msg {
-       gboolean has_error;
+       bool has_error;
        const char *current_element;
        int message_type;
        int response_code;
@@ -114,7 +114,7 @@ struct wispr_msg {
 
 static inline void wispr_msg_init(struct wispr_msg *msg)
 {
-       msg->has_error = FALSE;
+       msg->has_error = false;
        msg->current_element = NULL;
 
        msg->message_type = -1;
@@ -212,12 +212,11 @@ static void text_handler(GMarkupParseContext *context,
        struct wispr_msg *msg = user_data;
        int i;
 
-       if (msg->current_element == NULL)
+       if (!msg->current_element)
                return;
 
        for (i = 0; wispr_element_map[i].str; i++) {
-               if (g_str_equal(wispr_element_map[i].str,
-                                       msg->current_element) == FALSE)
+               if (!g_str_equal(wispr_element_map[i].str, msg->current_element))
                        continue;
 
                switch (wispr_element_map[i].element) {
@@ -266,7 +265,7 @@ static void error_handler(GMarkupParseContext *context,
 {
        struct wispr_msg *msg = user_data;
 
-       msg->has_error = TRUE;
+       msg->has_error = true;
 }
 
 static const GMarkupParser wispr_parser = {
@@ -281,7 +280,7 @@ static void parser_callback(const char *str, gpointer user_data)
 {
        struct wispr_session *wispr = user_data;
        GMarkupParseContext *context;
-       gboolean result;
+       bool result;
 
        //printf("%s\n", str);
 
@@ -289,7 +288,7 @@ static void parser_callback(const char *str, gpointer user_data)
                        G_MARKUP_TREAT_CDATA_AS_TEXT, &wispr->msg, NULL);
 
        result = g_markup_parse_context_parse(context, str, strlen(str), NULL);
-       if (result == TRUE)
+       if (result)
                g_markup_parse_context_end_parse(context, NULL);
 
        g_markup_parse_context_free(context);
@@ -301,7 +300,7 @@ struct user_input_data {
        GString *str;
        user_input_cb cb;
        gpointer user_data;
-       gboolean hidden;
+       bool hidden;
        int fd;
        struct termios saved_termios;
 };
@@ -310,7 +309,7 @@ static void user_callback(struct user_input_data *data)
 {
        char *value;
 
-       if (data->hidden == TRUE) {
+       if (data->hidden) {
                ssize_t len;
 
                len = write(data->fd, "\n", 1);
@@ -351,13 +350,13 @@ static gboolean keyboard_input(GIOChannel *channel, GIOCondition condition,
 
        g_string_append_c(data->str, buf[0]);
 
-       if (data->hidden == TRUE)
+       if (data->hidden)
                len = write(data->fd, "*", 1);
 
        return TRUE;
 }
 
-static gboolean user_input(const char *label, gboolean hidden,
+static bool user_input(const char *label, bool hidden,
                                user_input_cb func, gpointer user_data)
 {
        struct user_input_data *data;
@@ -367,8 +366,8 @@ static gboolean user_input(const char *label, gboolean hidden,
        ssize_t len;
 
        data = g_try_new0(struct user_input_data, 1);
-       if (data == NULL)
-               return FALSE;
+       if (!data)
+               return false;
 
        data->str = g_string_sized_new(32);
        data->cb = func;
@@ -385,7 +384,7 @@ static gboolean user_input(const char *label, gboolean hidden,
        }
 
        new_termios = data->saved_termios;
-       if (data->hidden == TRUE)
+       if (data->hidden)
                new_termios.c_lflag &= ~(ICANON|ECHO);
        else
                new_termios.c_lflag &= ~ICANON;
@@ -411,13 +410,13 @@ static gboolean user_input(const char *label, gboolean hidden,
        if (len < 0)
                goto error;
 
-       return TRUE;
+       return true;
 
 error:
        g_string_free(data->str, TRUE);
        g_free(data);
 
-       return FALSE;
+       return false;
 }
 
 static void password_callback(const char *value, gpointer user_data)
@@ -439,8 +438,8 @@ static void username_callback(const char *value, gpointer user_data)
        g_free(wispr->username);
        wispr->username = g_strdup(value);
 
-       if (wispr->password == NULL) {
-               user_input("Password", TRUE, password_callback, wispr);
+       if (!wispr->password) {
+               user_input("Password", true, password_callback, wispr);
                return;
        }
 
@@ -449,7 +448,7 @@ static void username_callback(const char *value, gpointer user_data)
        execute_login(wispr);
 }
 
-static gboolean wispr_input(const guint8 **data, gsize *length,
+static bool wispr_input(const guint8 **data, gsize *length,
                                                gpointer user_data)
 {
        struct wispr_session *wispr = user_data;
@@ -473,10 +472,10 @@ static gboolean wispr_input(const guint8 **data, gsize *length,
        *data = (guint8 *) wispr->formdata;
        *length = count;
 
-       return FALSE;
+       return false;
 }
 
-static gboolean wispr_route(const char *addr, int ai_family, int if_index,
+static bool wispr_route(const char *addr, int ai_family, int if_index,
                gpointer user_data)
 {
        char *family = "unknown";
@@ -489,12 +488,12 @@ static gboolean wispr_route(const char *addr, int ai_family, int if_index,
        printf("Route request: %s %s index %d\n", family, addr, if_index);
 
        if (ai_family != AF_INET && ai_family != AF_INET6)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
-static gboolean wispr_result(GWebResult *result, gpointer user_data)
+static bool wispr_result(GWebResult *result, gpointer user_data)
 {
        struct wispr_session *wispr = user_data;
        const guint8 *chunk;
@@ -507,7 +506,7 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
        if (length > 0) {
                //printf("%s\n", (char *) chunk);
                g_web_parser_feed_data(wispr->parser, chunk, length);
-               return TRUE;
+               return true;
        }
 
        g_web_parser_end_data(wispr->parser);
@@ -526,8 +525,7 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
                if (status != 302)
                        goto done;
 
-               if (g_web_result_get_header(result, "Location",
-                                                       &redirect) == FALSE)
+               if (!g_web_result_get_header(result, "Location", &redirect))
                        goto done;
 
                printf("Redirect URL: %s\n", redirect);
@@ -536,7 +534,7 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
                wispr->request = g_web_request_get(wispr->web, redirect,
                                wispr_result, wispr_route, wispr);
 
-               return FALSE;
+               return false;
        }
 
        printf("Message type: %s (%d)\n",
@@ -545,17 +543,17 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
        printf("Response code: %s (%d)\n",
                        response_code_to_string(wispr->msg.response_code),
                                                wispr->msg.response_code);
-       if (wispr->msg.access_procedure != NULL)
+       if (wispr->msg.access_procedure)
                printf("Access procedure: %s\n", wispr->msg.access_procedure);
-       if (wispr->msg.access_location != NULL)
+       if (wispr->msg.access_location)
                printf("Access location: %s\n", wispr->msg.access_location);
-       if (wispr->msg.location_name != NULL)
+       if (wispr->msg.location_name)
                printf("Location name: %s\n", wispr->msg.location_name);
-       if (wispr->msg.login_url != NULL)
+       if (wispr->msg.login_url)
                printf("Login URL: %s\n", wispr->msg.login_url);
-       if (wispr->msg.abort_login_url != NULL)
+       if (wispr->msg.abort_login_url)
                printf("Abort login URL: %s\n", wispr->msg.abort_login_url);
-       if (wispr->msg.logoff_url != NULL)
+       if (wispr->msg.logoff_url)
                printf("Logoff URL: %s\n", wispr->msg.logoff_url);
        printf("\n");
 
@@ -563,18 +561,19 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
                goto done;
 
        if (wispr->msg.message_type == 100) {
-               if (wispr->username == NULL) {
-                       user_input("Username", FALSE, username_callback, wispr);
-                       return FALSE;
+               if (!wispr->username) {
+                       user_input("Username", false,
+                                  username_callback, wispr);
+                       return false;
                }
 
-               if (wispr->password == NULL) {
-                       user_input("Password", TRUE, password_callback, wispr);
-                       return FALSE;
+               if (!wispr->password) {
+                       user_input("Password", true, password_callback, wispr);
+                       return false;
                }
 
                g_idle_add(execute_login, wispr);
-               return FALSE;
+               return false;
        } else if (wispr->msg.message_type == 120 ||
                                        wispr->msg.message_type == 140) {
                int code = wispr->msg.response_code;
@@ -585,8 +584,7 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
        if (status == 302) {
                const char *redirect;
 
-               if (g_web_result_get_header(result, "Location",
-                                                       &redirect) == FALSE)
+               if (!g_web_result_get_header(result, "Location", &redirect))
                        goto done;
 
                printf("\n");
@@ -596,13 +594,13 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
                wispr->request = g_web_request_get(wispr->web, redirect,
                                wispr_result, NULL, wispr);
 
-               return FALSE;
+               return false;
        }
 
 done:
        g_main_loop_quit(main_loop);
 
-       return FALSE;
+       return false;
 }
 
 static gboolean execute_login(gpointer user_data)
@@ -618,7 +616,7 @@ static gboolean execute_login(gpointer user_data)
        return FALSE;
 }
 
-static gboolean option_debug = FALSE;
+static bool option_debug = false;
 static gchar *option_nameserver = NULL;
 static gchar *option_username = NULL;
 static gchar *option_password = NULL;
@@ -649,8 +647,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -664,17 +662,17 @@ int main(int argc, char *argv[])
        wispr_msg_init(&wispr.msg);
 
        wispr.web = g_web_new(index);
-       if (wispr.web == NULL) {
+       if (!wispr.web) {
                fprintf(stderr, "Failed to create web service\n");
                return 1;
        }
 
-       if (option_debug == TRUE)
+       if (option_debug)
                g_web_set_debug(wispr.web, web_debug, "WEB");
 
        main_loop = g_main_loop_new(NULL, FALSE);
 
-       if (option_nameserver != NULL) {
+       if (option_nameserver) {
                g_web_add_nameserver(wispr.web, option_nameserver);
                g_free(option_nameserver);
        }
@@ -683,7 +681,7 @@ int main(int argc, char *argv[])
        g_web_set_user_agent(wispr.web, "SmartClient/%s wispr", VERSION);
        g_web_set_close_connection(wispr.web, TRUE);
 
-       if (option_url == NULL)
+       if (!option_url)
                option_url = g_strdup(DEFAULT_URL);
 
        wispr.username = option_username;
index a6cc792..2ecbcda 100644 (file)
@@ -63,12 +63,12 @@ static void resolv_result(GResolvResultStatus status,
        g_print("No result for %s\n", hostname);
 
        ptr = strchr(hostname + 5, '.');
-       if (ptr == NULL || strlen(ptr) < 2) {
+       if (!ptr || strlen(ptr) < 2) {
                g_print("No more names\n");
                goto done;
        }
 
-       if (strchr(ptr + 1, '.') == NULL) {
+       if (!strchr(ptr + 1, '.')) {
                g_print("Not found\n");
                goto done;
        }
@@ -86,7 +86,7 @@ done:
 
        g_print("elapse: %f seconds\n", elapsed);
 
-       if (results != NULL) {
+       if (results) {
                for (i = 0; results[i]; i++)
                        g_print("result: %s\n", results[i]);
        }
@@ -101,7 +101,7 @@ static void start_wpad(const char *search)
        char domainname[256];
        char *hostname;
 
-       if (search == NULL) {
+       if (!search) {
                if (getdomainname(domainname, sizeof(domainname)) < 0) {
                        g_printerr("Failed to get domain name\n");
                        goto quit;
@@ -113,7 +113,7 @@ static void start_wpad(const char *search)
                g_printerr("Domain name is not set\n");
                goto quit;
        }
-               
+
        g_print("domainname: %s\n", domainname);
 
        hostname = g_strdup_printf("wpad.%s", domainname);
@@ -126,7 +126,7 @@ quit:
        g_main_loop_quit(main_loop);
 }
 
-static gboolean option_debug = FALSE;
+static bool option_debug = false;
 static gchar *option_search = NULL;
 
 static GOptionEntry options[] = {
@@ -147,8 +147,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -159,12 +159,12 @@ int main(int argc, char *argv[])
        g_option_context_free(context);
 
        resolv = g_resolv_new(index);
-       if (resolv == NULL) {
+       if (!resolv) {
                g_printerr("Failed to create resolver\n");
                return 1;
        }
 
-       if (option_debug == TRUE)
+       if (option_debug)
                g_resolv_set_debug(resolv, resolv_debug, "RESOLV");
 
        main_loop = g_main_loop_new(NULL, FALSE);
index e5c08ca..a11220d 100644 (file)
@@ -47,7 +47,7 @@ static void test_case_1(void)
        __connman_ippool_init();
 
        pool = __connman_ippool_create(23, 1, 500, NULL, NULL);
-       g_assert(pool == NULL);
+       g_assert(!pool);
 
        for (i = 0; i < 100000; i++) {
                pool = __connman_ippool_create(23, 1, 20, NULL, NULL);
@@ -131,7 +131,7 @@ static void test_case_3(void)
 
        while (TRUE) {
                pool = __connman_ippool_create(23, 1, 100, NULL, NULL);
-               if (pool == NULL)
+               if (!pool)
                        break;
                i += 1;
 
@@ -154,7 +154,7 @@ static void test_case_3(void)
 
        LOG("Number of blocks %d", i);
 
-       for (it = list; it != NULL; it = it->next) {
+       for (it = list; it; it = it->next) {
                pool = it->data;
 
                __connman_ippool_unref(pool);
index 91be03d..71e1d4e 100644 (file)
@@ -56,7 +56,7 @@ static void pbkdf2_test(gconstpointer data)
 
        key_len = test->key_len ? : (strlen(test->key) / 2);
 
-       if (g_test_verbose() == TRUE) {
+       if (g_test_verbose()) {
                g_print("Password = \"%s\" (%d octects)\n",
                                        test->password, password_len);
                g_print("Salt     = \"%s\" (%d octects)\n",
@@ -74,9 +74,8 @@ static void pbkdf2_test(gconstpointer data)
        for (i = 0; i < key_len; i++)
                sprintf(key + (i * 2), "%02x", output[i]);
 
-       if (g_test_verbose() == TRUE) {
+       if (g_test_verbose())
                g_print("Result   = %s\n", key);
-       }
 
        g_assert(strcmp(test->key, key) == 0);
 }
@@ -200,7 +199,7 @@ static void psk_test(gconstpointer data)
        unsigned int i;
        int result;
 
-       if (test->network == NULL) {
+       if (!test->network) {
                memcpy(ssid, test->ssid, test->ssid_len);
                ssid_len = test->ssid_len;
        } else {
@@ -208,7 +207,7 @@ static void psk_test(gconstpointer data)
                memcpy(ssid, test->network, ssid_len);
        }
 
-       if (g_test_verbose() == TRUE) {
+       if (g_test_verbose()) {
                g_print("Passphrase  = \"%s\"\n", test->passphrase);
                g_print("SSID        = {");
                for (i = 0; i < ssid_len; i++)
@@ -228,9 +227,8 @@ static void psk_test(gconstpointer data)
        for (i = 0; i < sizeof(output); i++)
                sprintf(psk + (i * 2), "%02x", output[i]);
 
-       if (g_test_verbose() == TRUE) {
+       if (g_test_verbose())
                g_print("Result      = %s\n", psk);
-       }
 
        g_assert(strcmp(test->psk, psk) == 0);
 }
index 5f81f4c..c6a3787 100644 (file)
@@ -51,9 +51,8 @@ static void prf_test(gconstpointer data)
 
        prf_len = strlen(test->prf) / 2;
 
-       if (g_test_verbose() == TRUE) {
+       if (g_test_verbose())
                g_print("PRF    = %s (%d octects)\n", test->prf, prf_len);
-       }
 
        result = prf_sha1(test->key, test->key_len, test->prefix,
                                test->prefix_len, test->data, test->data_len,
@@ -64,9 +63,8 @@ static void prf_test(gconstpointer data)
        for (i = 0; i < prf_len; i++)
                sprintf(prf + (i * 2), "%02x", output[i]);
 
-       if (g_test_verbose() == TRUE) {
+       if (g_test_verbose())
                g_print("Result = %s\n", prf);
-       }
 
        g_assert(strcmp(test->prf, prf) == 0);
 }
diff --git a/vpn/connman-vpn.conf b/vpn/connman-vpn.conf
deleted file mode 100644 (file)
index 99a96ce..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-[General]
-
-# Set input request timeout. Default is 300 seconds
-# The request for inputs like passphrase will timeout
-# after certain amount of time. Use this setting to
-# increase the value in case of different user
-# interface designs.
-# InputRequestTimeout = 300
index ec02a86..3778d51 100644 (file)
@@ -1,6 +1,7 @@
 [Unit]
 Description=ConnMan VPN service
-After=syslog.target
+Requires=dbus.socket
+After=dbus.socket
 
 [Service]
 Type=dbus
index d72fa74..ee88aac 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -84,14 +84,14 @@ static void parse_config(GKeyFile *config, const char *file)
        GError *error = NULL;
        int timeout;
 
-       if (config == NULL)
+       if (!config)
                return;
 
        DBG("parsing %s", file);
 
        timeout = g_key_file_get_integer(config, "General",
                        "InputRequestTimeout", &error);
-       if (error == NULL && timeout >= 0)
+       if (!error && timeout >= 0)
                connman_vpn_settings.timeout_inputreq = timeout * 1000;
 
        g_clear_error(&error);
@@ -103,7 +103,7 @@ static int config_init(const char *file)
 
        config = load_config(file);
        parse_config(config, file);
-       if (config != NULL)
+       if (config)
                g_key_file_free(config);
 
        return 0;
@@ -188,11 +188,11 @@ static gchar *option_config = NULL;
 static gchar *option_debug = NULL;
 static gchar *option_plugin = NULL;
 static gchar *option_noplugin = NULL;
-static gboolean option_detach = TRUE;
-static gboolean option_version = FALSE;
-static gboolean option_routes = FALSE;
+static bool option_detach = true;
+static bool option_version = false;
+static bool option_routes = false;
 
-static gboolean parse_debug(const char *key, const char *value,
+static bool parse_debug(const char *key, const char *value,
                                        gpointer user_data, GError **error)
 {
        if (value)
@@ -200,7 +200,7 @@ static gboolean parse_debug(const char *key, const char *value,
        else
                option_debug = g_strdup("*");
 
-       return TRUE;
+       return true;
 }
 
 static GOptionEntry options[] = {
@@ -244,8 +244,8 @@ int main(int argc, char *argv[])
        context = g_option_context_new(NULL);
        g_option_context_add_main_entries(context, options, NULL);
 
-       if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
-               if (error != NULL) {
+       if (!g_option_context_parse(context, &argc, &argv, &error)) {
+               if (error) {
                        g_printerr("%s\n", error->message);
                        g_error_free(error);
                } else
@@ -255,19 +255,19 @@ int main(int argc, char *argv[])
 
        g_option_context_free(context);
 
-       if (option_version == TRUE) {
+       if (option_version) {
                printf("%s\n", VERSION);
                exit(0);
        }
 
-       if (option_detach == TRUE) {
+       if (option_detach) {
                if (daemon(0, 0)) {
                        perror("Can't start daemon");
                        exit(1);
                }
        }
 
-       if (mkdir(STATEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
+       if (mkdir(VPN_STATEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
                                S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
                if (errno != EEXIST)
                        perror("Failed to create state directory");
@@ -298,8 +298,8 @@ int main(int argc, char *argv[])
        dbus_error_init(&err);
 
        conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, VPN_SERVICE, &err);
-       if (conn == NULL) {
-               if (dbus_error_is_set(&err) == TRUE) {
+       if (!conn) {
+               if (dbus_error_is_set(&err)) {
                        fprintf(stderr, "%s\n", err.message);
                        dbus_error_free(&err);
                } else
@@ -309,11 +309,11 @@ int main(int argc, char *argv[])
 
        g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL);
 
-       __connman_log_init(argv[0], option_debug, option_detach, FALSE,
+       __connman_log_init(argv[0], option_debug, option_detach, false,
                        "Connection Manager VPN daemon", VERSION);
        __connman_dbus_init(conn);
 
-       if (option_config == NULL)
+       if (!option_config)
                config_init(CONFIGMAINFILE);
        else
                config_init(option_config);
@@ -347,7 +347,7 @@ int main(int argc, char *argv[])
        __connman_agent_cleanup();
        __connman_inotify_cleanup();
        __connman_dbus_cleanup();
-       __connman_log_cleanup(FALSE);
+       __connman_log_cleanup(false);
 
        dbus_connection_unref(conn);
 
index a322178..91acc85 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2010  BMW Car IT GmbH. All rights reserved.
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2010,2013  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -132,18 +132,18 @@ static DBusMessage *l2tp_get_sec(struct connman_task *task,
        const char *user, *passwd;
        struct vpn_provider *provider = user_data;
 
-       if (dbus_message_get_no_reply(msg) == FALSE) {
+       if (!dbus_message_get_no_reply(msg)) {
                DBusMessage *reply;
 
                user = vpn_provider_get_string(provider, "L2TP.User");
                passwd = vpn_provider_get_string(provider, "L2TP.Password");
 
-               if (user == NULL || strlen(user) == 0 ||
-                               passwd == NULL || strlen(passwd) == 0)
+               if (!user || strlen(user) == 0 ||
+                               !passwd || strlen(passwd) == 0)
                        return NULL;
 
                reply = dbus_message_new_method_return(msg);
-               if (reply == NULL)
+               if (!reply)
                        return NULL;
 
                dbus_message_append_args(reply, DBUS_TYPE_STRING, &user,
@@ -198,20 +198,14 @@ static int l2tp_notify(DBusMessage *msg, struct vpn_provider *provider)
 
                DBG("%s = %s", key, value);
 
-               if (!strcmp(key, "INTERNAL_IP4_ADDRESS")) {
-                       vpn_provider_set_string(provider, "Address", value);
+               if (!strcmp(key, "INTERNAL_IP4_ADDRESS"))
                        addressv4 = g_strdup(value);
-               }
 
-               if (!strcmp(key, "INTERNAL_IP4_NETMASK")) {
-                       vpn_provider_set_string(provider, "Netmask", value);
+               if (!strcmp(key, "INTERNAL_IP4_NETMASK"))
                        netmask = g_strdup(value);
-               }
 
-               if (!strcmp(key, "INTERNAL_IP4_DNS")) {
-                       vpn_provider_set_string(provider, "DNS", value);
+               if (!strcmp(key, "INTERNAL_IP4_DNS"))
                        nameservers = g_strdup(value);
-               }
 
                if (!strcmp(key, "INTERNAL_IFNAME"))
                        ifname = g_strdup(value);
@@ -227,12 +221,12 @@ static int l2tp_notify(DBusMessage *msg, struct vpn_provider *provider)
                return VPN_STATE_FAILURE;
        }
 
-       if (addressv4 != NULL)
+       if (addressv4)
                ipaddress = connman_ipaddress_alloc(AF_INET);
 
        g_free(ifname);
 
-       if (ipaddress == NULL) {
+       if (!ipaddress) {
                connman_error("No IP address for provider");
                g_free(addressv4);
                g_free(netmask);
@@ -241,12 +235,12 @@ static int l2tp_notify(DBusMessage *msg, struct vpn_provider *provider)
        }
 
        value = vpn_provider_get_string(provider, "HostIP");
-       if (value != NULL) {
+       if (value) {
                vpn_provider_set_string(provider, "Gateway", value);
                gateway = g_strdup(value);
        }
 
-       if (addressv4 != NULL)
+       if (addressv4)
                connman_ipaddress_set_ipv4(ipaddress, addressv4, netmask,
                                        gateway);
 
@@ -265,29 +259,29 @@ static int l2tp_notify(DBusMessage *msg, struct vpn_provider *provider)
 static int l2tp_save(struct vpn_provider *provider, GKeyFile *keyfile)
 {
        const char *option;
-       connman_bool_t l2tp_option, pppd_option;
+       bool l2tp_option, pppd_option;
        int i;
 
        for (i = 0; i < (int)ARRAY_SIZE(pppd_options); i++) {
-               l2tp_option = pppd_option = FALSE;
+               l2tp_option = pppd_option = false;
 
                if (strncmp(pppd_options[i].cm_opt, "L2TP.", 5) == 0)
-                       l2tp_option = TRUE;
+                       l2tp_option = true;
 
                if (strncmp(pppd_options[i].cm_opt, "PPPD.", 5) == 0)
-                       pppd_option = TRUE;
+                       pppd_option = true;
 
-               if (l2tp_option == TRUE || pppd_option == TRUE) {
+               if (l2tp_option || pppd_option) {
                        option = vpn_provider_get_string(provider,
                                                pppd_options[i].cm_opt);
-                       if (option == NULL) {
+                       if (!option) {
                                /*
                                 * Check if the option prefix is L2TP as the
                                 * PPPD options were using L2TP prefix earlier.
                                 */
                                char *l2tp_str;
 
-                               if (pppd_option == FALSE)
+                               if (!pppd_option)
                                        continue;
 
                                l2tp_str = g_strdup_printf("L2TP.%s",
@@ -296,7 +290,7 @@ static int l2tp_save(struct vpn_provider *provider, GKeyFile *keyfile)
                                                                l2tp_str);
                                g_free(l2tp_str);
 
-                               if (option == NULL)
+                               if (!option)
                                        continue;
                        }
 
@@ -333,7 +327,7 @@ static ssize_t l2tp_write_bool_option(int fd,
        gchar *buf;
        ssize_t ret = 0;
 
-       if (key != NULL && value != NULL) {
+       if (key && value) {
                if (strcasecmp(value, "yes") == 0 ||
                                strcasecmp(value, "true") == 0 ||
                                strcmp(value, "1") == 0) {
@@ -352,8 +346,8 @@ static int l2tp_write_option(int fd, const char *key, const char *value)
        gchar *buf;
        ssize_t ret = 0;
 
-       if (key != NULL) {
-               if (value != NULL)
+       if (key) {
+               if (value)
                        buf = g_strdup_printf("%s %s\n", key, value);
                else
                        buf = g_strdup_printf("%s\n", key);
@@ -371,7 +365,7 @@ static int l2tp_write_section(int fd, const char *key, const char *value)
        gchar *buf;
        ssize_t ret = 0;
 
-       if (key != NULL && value != NULL) {
+       if (key && value) {
                buf = g_strdup_printf("%s = %s\n", key, value);
                ret = full_write(fd, buf, strlen(buf));
 
@@ -478,11 +472,11 @@ static void l2tp_died(struct connman_task *task, int exit_code, void *user_data)
 
        vpn_died(task, exit_code, user_data);
 
-       conf_file = g_strdup_printf("/var/run/connman/connman-xl2tpd.conf");
+       conf_file = g_strdup_printf(VPN_STATEDIR "/connman-xl2tpd.conf");
        unlink(conf_file);
        g_free(conf_file);
 
-       conf_file = g_strdup_printf("/var/run/connman/connman-ppp-option.conf");
+       conf_file = g_strdup_printf(VPN_STATEDIR "/connman-ppp-option.conf");
        unlink(conf_file);
        g_free(conf_file);
 }
@@ -508,7 +502,7 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
                goto done;
        }
 
-       if (vpn_agent_check_reply_has_dict(reply) == FALSE)
+       if (!vpn_agent_check_reply_has_dict(reply))
                goto done;
 
        dbus_message_iter_init(reply, &iter);
@@ -567,7 +561,8 @@ typedef void (* request_cb_t)(struct vpn_provider *provider,
                                const char *error, void *user_data);
 
 static int request_input(struct vpn_provider *provider,
-                               request_cb_t callback, void *user_data)
+                       request_cb_t callback, const char *dbus_sender,
+                       void *user_data)
 {
        DBusMessage *message;
        const char *path, *agent_sender, *agent_path;
@@ -575,16 +570,17 @@ static int request_input(struct vpn_provider *provider,
        DBusMessageIter dict;
        struct request_input_reply *l2tp_reply;
        int err;
+       void *agent;
 
-       connman_agent_get_info(&agent_sender, &agent_path);
-
-       if (provider == NULL || agent_path == NULL || callback == NULL)
+       agent = connman_agent_get_info(dbus_sender, &agent_sender,
+                                                       &agent_path);
+       if (!provider || !agent || !agent_path || !callback)
                return -ESRCH;
 
        message = dbus_message_new_method_call(agent_sender, agent_path,
                                        VPN_AGENT_INTERFACE,
                                        "RequestInput");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -602,7 +598,7 @@ static int request_input(struct vpn_provider *provider,
        connman_dbus_dict_close(&iter, &dict);
 
        l2tp_reply = g_try_new0(struct request_input_reply, 1);
-       if (l2tp_reply == NULL) {
+       if (!l2tp_reply) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -613,7 +609,7 @@ static int request_input(struct vpn_provider *provider,
 
        err = connman_agent_queue_message(provider, message,
                        connman_timeout_input_request(),
-                       request_input_reply, l2tp_reply);
+                       request_input_reply, l2tp_reply, agent);
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending agent request", err);
                dbus_message_unref(message);
@@ -635,7 +631,7 @@ static int run_connect(struct vpn_provider *provider,
        int l2tp_fd, pppd_fd;
        int err;
 
-       if (username == NULL || password == NULL) {
+       if (!username || !password) {
                DBG("Cannot connect username %s password %p",
                                                username, password);
                err = -EINVAL;
@@ -644,7 +640,7 @@ static int run_connect(struct vpn_provider *provider,
 
        DBG("username %s password %p", username, password);
 
-       l2tp_name = g_strdup_printf("/var/run/connman/connman-xl2tpd.conf");
+       l2tp_name = g_strdup_printf(VPN_STATEDIR "/connman-xl2tpd.conf");
 
        l2tp_fd = open(l2tp_name, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
        if (l2tp_fd < 0) {
@@ -654,7 +650,7 @@ static int run_connect(struct vpn_provider *provider,
                goto done;
        }
 
-       pppd_name = g_strdup_printf("/var/run/connman/connman-ppp-option.conf");
+       pppd_name = g_strdup_printf(VPN_STATEDIR "/connman-ppp-option.conf");
 
        pppd_fd = open(pppd_name, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
        if (pppd_fd < 0) {
@@ -675,6 +671,8 @@ static int run_connect(struct vpn_provider *provider,
 
        g_free(l2tp_name);
        g_free(pppd_name);
+       close(l2tp_fd);
+       close(pppd_fd);
 
        err = connman_task_run(task, l2tp_died, provider,
                                NULL, NULL, NULL);
@@ -685,7 +683,7 @@ static int run_connect(struct vpn_provider *provider,
        }
 
 done:
-       if (cb != NULL)
+       if (cb)
                cb(provider, user_data, err);
 
        return err;
@@ -704,10 +702,10 @@ static void request_input_cb(struct vpn_provider *provider,
 {
        struct l2tp_private_data *data = user_data;
 
-       if (username == NULL || password == NULL)
+       if (!username || !password)
                DBG("Requesting username %s or password failed, error %s",
                        username, error);
-       else if (error != NULL)
+       else if (error)
                DBG("error %s", error);
 
        vpn_provider_set_string(provider, "L2TP.User", username);
@@ -722,7 +720,8 @@ static void request_input_cb(struct vpn_provider *provider,
 
 static int l2tp_connect(struct vpn_provider *provider,
                        struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data)
+                       vpn_provider_connect_cb_t cb, const char *dbus_sender,
+                       void *user_data)
 {
        const char *username, *password;
        int err;
@@ -738,11 +737,11 @@ static int l2tp_connect(struct vpn_provider *provider,
 
        DBG("user %s password %p", username, password);
 
-       if (username == NULL || password == NULL) {
+       if (!username || !password) {
                struct l2tp_private_data *data;
 
                data = g_try_new0(struct l2tp_private_data, 1);
-               if (data == NULL)
+               if (!data)
                        return -ENOMEM;
 
                data->task = task;
@@ -750,7 +749,8 @@ static int l2tp_connect(struct vpn_provider *provider,
                data->cb = cb;
                data->user_data = user_data;
 
-               err = request_input(provider, request_input_cb, data);
+               err = request_input(provider, request_input_cb, dbus_sender,
+                                                                       data);
                if (err != -EINPROGRESS) {
                        free_private_data(data);
                        goto done;
@@ -763,13 +763,13 @@ done:
                                                        username, password);
 
 error:
-       if (cb != NULL)
+       if (cb)
                cb(provider, user_data, err);
 
        return err;
 }
 
-static int l2tp_error_code(int exit_code)
+static int l2tp_error_code(struct vpn_provider *provider, int exit_code)
 {
        switch (exit_code) {
        case 1:
index 83584da..c6b9cd6 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -57,12 +57,19 @@ struct {
 };
 
 struct oc_private_data {
+       struct vpn_provider *provider;
        struct connman_task *task;
        char *if_name;
        vpn_provider_connect_cb_t cb;
        void *user_data;
 };
 
+static void free_private_data(struct oc_private_data *data)
+{
+       g_free(data->if_name);
+       g_free(data);
+}
+
 static int task_append_config_data(struct vpn_provider *provider,
                                        struct connman_task *task)
 {
@@ -70,12 +77,12 @@ static int task_append_config_data(struct vpn_provider *provider,
        int i;
 
        for (i = 0; i < (int)ARRAY_SIZE(oc_options); i++) {
-               if (oc_options[i].oc_opt == NULL)
+               if (!oc_options[i].oc_opt)
                        continue;
 
                option = vpn_provider_get_string(provider,
                                        oc_options[i].cm_opt);
-               if (option == NULL)
+               if (!option)
                        continue;
 
                if (connman_task_add_argument(task,
@@ -144,7 +151,7 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
 
                        /* The netmask contains the address and the prefix */
                        sep = strchr(value, '/');
-                       if (sep != NULL) {
+                       if (sep) {
                                unsigned char ip_len = sep - value;
 
                                addressv6 = g_strndup(value, ip_len);
@@ -160,13 +167,13 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
                if (!strcmp(key, "CISCO_PROXY_PAC"))
                        vpn_provider_set_pac(provider, value);
 
-               if (domain == NULL && !strcmp(key, "CISCO_DEF_DOMAIN")) {
+               if (!domain && !strcmp(key, "CISCO_DEF_DOMAIN")) {
                        g_free(domain);
                        domain = g_strdup(value);
                }
 
-               if (g_str_has_prefix(key, "CISCO_SPLIT_INC") == TRUE ||
-                       g_str_has_prefix(key, "CISCO_IPV6_SPLIT_INC") == TRUE)
+               if (g_str_has_prefix(key, "CISCO_SPLIT_INC") ||
+                       g_str_has_prefix(key, "CISCO_IPV6_SPLIT_INC"))
                        vpn_provider_append_route(provider, key, value);
 
                dbus_message_iter_next(&dict);
@@ -174,14 +181,14 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
 
        DBG("%p %p", addressv4, addressv6);
 
-       if (addressv4 != NULL)
+       if (addressv4)
                ipaddress = connman_ipaddress_alloc(AF_INET);
-       else if (addressv6 != NULL)
+       else if (addressv6)
                ipaddress = connman_ipaddress_alloc(AF_INET6);
        else
                ipaddress = NULL;
 
-       if (ipaddress == NULL) {
+       if (!ipaddress) {
                g_free(addressv4);
                g_free(addressv6);
                g_free(netmask);
@@ -191,7 +198,7 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
                return VPN_STATE_FAILURE;
        }
 
-       if (addressv4 != NULL)
+       if (addressv4)
                connman_ipaddress_set_ipv4(ipaddress, addressv4,
                                                netmask, gateway);
        else
@@ -210,8 +217,85 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
        return VPN_STATE_CONNECT;
 }
 
-static void request_input_append_cookie(DBusMessageIter *iter,
-                                                       void *user_data)
+static int run_connect(struct vpn_provider *provider,
+                       struct connman_task *task, const char *if_name,
+                       vpn_provider_connect_cb_t cb, void *user_data)
+{
+       const char *vpnhost, *vpncookie, *servercert, *mtu;
+       int fd, err = 0, len;
+
+       vpnhost = vpn_provider_get_string(provider, "OpenConnect.VPNHost");
+       if (!vpnhost)
+               vpnhost = vpn_provider_get_string(provider, "Host");
+       vpncookie = vpn_provider_get_string(provider, "OpenConnect.Cookie");
+       servercert = vpn_provider_get_string(provider,
+                       "OpenConnect.ServerCert");
+
+       if (!vpncookie || !servercert) {
+               err = -EINVAL;
+               goto done;
+       }
+
+       task_append_config_data(provider, task);
+
+       connman_task_add_argument(task, "--servercert", servercert);
+
+       mtu = vpn_provider_get_string(provider, "VPN.MTU");
+
+       if (mtu)
+               connman_task_add_argument(task, "--mtu", (char *)mtu);
+
+       connman_task_add_argument(task, "--syslog", NULL);
+       connman_task_add_argument(task, "--cookie-on-stdin", NULL);
+
+       connman_task_add_argument(task, "--script",
+                                 SCRIPTDIR "/openconnect-script");
+
+       connman_task_add_argument(task, "--interface", if_name);
+
+       connman_task_add_argument(task, (char *)vpnhost, NULL);
+
+       err = connman_task_run(task, vpn_died, provider,
+                              &fd, NULL, NULL);
+       if (err < 0) {
+               connman_error("openconnect failed to start");
+               err = -EIO;
+               goto done;
+       }
+
+       len = strlen(vpncookie);
+       if (write(fd, vpncookie, len) != (ssize_t)len ||
+                       write(fd, "\n", 1) != 1) {
+               connman_error("openconnect failed to take cookie on stdin");
+               err = -EIO;
+               goto done;
+       }
+
+done:
+       if (cb)
+               cb(provider, user_data, err);
+
+       return err;
+}
+
+static void request_input_append_informational(DBusMessageIter *iter,
+               void *user_data)
+{
+       const char *str;
+
+       str = "string";
+       connman_dbus_dict_append_basic(iter, "Type", DBUS_TYPE_STRING, &str);
+
+       str = "informational";
+       connman_dbus_dict_append_basic(iter, "Requirement", DBUS_TYPE_STRING,
+                       &str);
+
+       str = user_data;
+       connman_dbus_dict_append_basic(iter, "Value", DBUS_TYPE_STRING, &str);
+}
+
+static void request_input_append_mandatory(DBusMessageIter *iter,
+               void *user_data)
 {
        char *str = "string";
 
@@ -222,29 +306,20 @@ static void request_input_append_cookie(DBusMessageIter *iter,
                                DBUS_TYPE_STRING, &str);
 }
 
-struct request_input_reply {
-       struct vpn_provider *provider;
-       vpn_provider_auth_cb_t callback;
-       void *user_data;
-};
-
 static void request_input_cookie_reply(DBusMessage *reply, void *user_data)
 {
-       struct request_input_reply *cookie_reply = user_data;
-       const char *error = NULL;
-       char *cookie = NULL;
+       struct oc_private_data *data = user_data;
+       char *cookie = NULL, *servercert = NULL, *vpnhost = NULL;
        char *key;
        DBusMessageIter iter, dict;
 
-       DBG("provider %p", cookie_reply->provider);
+       DBG("provider %p", data->provider);
 
-       if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
-               error = dbus_message_get_error_name(reply);
-               goto done;
-       }
+       if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
+               goto err;
 
-       if (vpn_agent_check_reply_has_dict(reply) == FALSE)
-               goto done;
+       if (!vpn_agent_check_reply_has_dict(reply))
+               goto err;
 
        dbus_message_iter_init(reply, &iter);
        dbus_message_iter_recurse(&iter, &dict);
@@ -267,40 +342,76 @@ static void request_input_cookie_reply(DBusMessage *reply, void *user_data)
                                                        != DBUS_TYPE_STRING)
                                break;
                        dbus_message_iter_get_basic(&value, &cookie);
+                       vpn_provider_set_string_hide_value(data->provider,
+                                       key, cookie);
+
+               } else if (g_str_equal(key, "OpenConnect.ServerCert")) {
+                       dbus_message_iter_next(&entry);
+                       if (dbus_message_iter_get_arg_type(&entry)
+                                                       != DBUS_TYPE_VARIANT)
+                               break;
+                       dbus_message_iter_recurse(&entry, &value);
+                       if (dbus_message_iter_get_arg_type(&value)
+                                                       != DBUS_TYPE_STRING)
+                               break;
+                       dbus_message_iter_get_basic(&value, &servercert);
+                       vpn_provider_set_string(data->provider, key,
+                                       servercert);
+
+               } else if (g_str_equal(key, "OpenConnect.VPNHost")) {
+                       dbus_message_iter_next(&entry);
+                       if (dbus_message_iter_get_arg_type(&entry)
+                                                       != DBUS_TYPE_VARIANT)
+                               break;
+                       dbus_message_iter_recurse(&entry, &value);
+                       if (dbus_message_iter_get_arg_type(&value)
+                                                       != DBUS_TYPE_STRING)
+                               break;
+                       dbus_message_iter_get_basic(&value, &vpnhost);
+                       vpn_provider_set_string(data->provider, key, vpnhost);
                }
 
                dbus_message_iter_next(&dict);
        }
 
-done:
-       cookie_reply->callback(cookie_reply->provider, cookie, error,
-                               cookie_reply->user_data);
-       g_free(cookie_reply);
-}
+       if (!cookie || !servercert || !vpnhost)
+               goto err;
+
+       run_connect(data->provider, data->task, data->if_name, data->cb,
+               data->user_data);
+
+       free_private_data(data);
 
-typedef void (* request_cb_t)(struct vpn_provider *provider,
-                                       const char *vpncookie,
-                                       const char *error, void *user_data);
+       return;
+
+err:
+       vpn_provider_indicate_error(data->provider,
+                       VPN_PROVIDER_ERROR_AUTH_FAILED);
+
+       free_private_data(data);
+}
 
 static int request_cookie_input(struct vpn_provider *provider,
-                               request_cb_t callback, void *user_data)
+                               struct oc_private_data *data,
+                               const char *dbus_sender)
 {
        DBusMessage *message;
        const char *path, *agent_sender, *agent_path;
        DBusMessageIter iter;
        DBusMessageIter dict;
-       struct request_input_reply *cookie_reply;
+       const char *str;
        int err;
+       void *agent;
 
-       connman_agent_get_info(&agent_sender, &agent_path);
-
-       if (provider == NULL || agent_path == NULL || callback == NULL)
+       agent = connman_agent_get_info(dbus_sender, &agent_sender,
+                                                       &agent_path);
+       if (!provider || !agent || !agent_path)
                return -ESRCH;
 
        message = dbus_message_new_method_call(agent_sender, agent_path,
                                        VPN_AGENT_INTERFACE,
                                        "RequestInput");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -311,30 +422,39 @@ static int request_cookie_input(struct vpn_provider *provider,
 
        connman_dbus_dict_open(&iter, &dict);
 
+       str = vpn_provider_get_string(provider, "OpenConnect.CACert");
+       if (str)
+               connman_dbus_dict_append_dict(&dict, "OpenConnect.CACert",
+                               request_input_append_informational,
+                               (void *)str);
+
+       str = vpn_provider_get_string(provider, "OpenConnect.ClientCert");
+       if (str)
+               connman_dbus_dict_append_dict(&dict, "OpenConnect.ClientCert",
+                               request_input_append_informational,
+                               (void *)str);
+
+       connman_dbus_dict_append_dict(&dict, "OpenConnect.ServerCert",
+                       request_input_append_mandatory, NULL);
+
+       connman_dbus_dict_append_dict(&dict, "OpenConnect.VPNHost",
+                       request_input_append_mandatory, NULL);
+
        connman_dbus_dict_append_dict(&dict, "OpenConnect.Cookie",
-                       request_input_append_cookie, provider);
+                       request_input_append_mandatory, NULL);
 
        vpn_agent_append_host_and_name(&dict, provider);
 
        connman_dbus_dict_close(&iter, &dict);
 
-       cookie_reply = g_try_new0(struct request_input_reply, 1);
-       if (cookie_reply == NULL) {
-               dbus_message_unref(message);
-               return -ENOMEM;
-       }
-
-       cookie_reply->provider = provider;
-       cookie_reply->callback = callback;
-       cookie_reply->user_data = user_data;
-
        err = connman_agent_queue_message(provider, message,
                        connman_timeout_input_request(),
-                       request_input_cookie_reply, cookie_reply);
+                       request_input_cookie_reply, data, agent);
+
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending agent request", err);
                dbus_message_unref(message);
-               g_free(cookie_reply);
+
                return err;
        }
 
@@ -343,133 +463,46 @@ static int request_cookie_input(struct vpn_provider *provider,
        return -EINPROGRESS;
 }
 
-static int run_connect(struct vpn_provider *provider,
-                       struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data,
-                       const char *vpncookie)
-{
-       const char *vpnhost, *cafile, *certsha1, *mtu;
-       int fd, err = 0, len;
-
-       vpnhost = vpn_provider_get_string(provider, "Host");
-
-       if (vpncookie == NULL) {
-               DBG("Cookie missing, cannot connect!");
-               err = -EINVAL;
-               goto done;
-       }
-
-       task_append_config_data(provider, task);
-
-       vpn_provider_set_string(provider, "OpenConnect.Cookie", vpncookie);
-
-       certsha1 = vpn_provider_get_string(provider,
-                                               "OpenConnect.ServerCert");
-       if (certsha1)
-               connman_task_add_argument(task, "--servercert",
-                                                       (char *)certsha1);
-
-       cafile = vpn_provider_get_string(provider, "OpenConnect.CACert");
-       mtu = vpn_provider_get_string(provider, "VPN.MTU");
-
-       if (cafile)
-               connman_task_add_argument(task, "--cafile",
-                                                       (char *)cafile);
-       if (mtu)
-               connman_task_add_argument(task, "--mtu", (char *)mtu);
-
-       connman_task_add_argument(task, "--syslog", NULL);
-       connman_task_add_argument(task, "--cookie-on-stdin", NULL);
-
-       connman_task_add_argument(task, "--script",
-                                 SCRIPTDIR "/openconnect-script");
-
-       connman_task_add_argument(task, "--interface", if_name);
-
-       connman_task_add_argument(task, (char *)vpnhost, NULL);
-
-       err = connman_task_run(task, vpn_died, provider,
-                              &fd, NULL, NULL);
-       if (err < 0) {
-               connman_error("openconnect failed to start");
-               err = -EIO;
-               goto done;
-       }
-
-       len = strlen(vpncookie);
-       if (write(fd, vpncookie, len) != (ssize_t)len ||
-                       write(fd, "\n", 1) != 1) {
-               connman_error("openconnect failed to take cookie on stdin");
-               err = -EIO;
-               goto done;
-       }
-
-done:
-       if (cb != NULL)
-               cb(provider, user_data, err);
-
-       return err;
-}
-
-static void free_private_data(struct oc_private_data *data)
-{
-       g_free(data->if_name);
-       g_free(data);
-}
-
-static void request_input_cb(struct vpn_provider *provider,
-                       const char *vpncookie,
-                       const char *error, void *user_data)
-{
-       struct oc_private_data *data = user_data;
-
-       if (vpncookie == NULL)
-               DBG("Requesting cookie failed, error %s", error);
-       else if (error != NULL)
-               DBG("error %s", error);
-
-       run_connect(provider, data->task, data->if_name, data->cb,
-               data->user_data, vpncookie);
-
-       free_private_data(data);
-}
-
 static int oc_connect(struct vpn_provider *provider,
                        struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data)
+                       vpn_provider_connect_cb_t cb,
+                       const char *dbus_sender, void *user_data)
 {
-       const char *vpnhost, *vpncookie;
+       const char *vpnhost, *vpncookie, *servercert;
        int err;
 
        vpnhost = vpn_provider_get_string(provider, "Host");
-       if (vpnhost == NULL) {
+       if (!vpnhost) {
                connman_error("Host not set; cannot enable VPN");
                return -EINVAL;
        }
 
        vpncookie = vpn_provider_get_string(provider, "OpenConnect.Cookie");
-       if (vpncookie == NULL) {
+       servercert = vpn_provider_get_string(provider,
+                       "OpenConnect.ServerCert");
+       if (!vpncookie || !servercert) {
                struct oc_private_data *data;
 
                data = g_try_new0(struct oc_private_data, 1);
-               if (data == NULL)
+               if (!data)
                        return -ENOMEM;
 
+               data->provider = provider;
                data->task = task;
                data->if_name = g_strdup(if_name);
                data->cb = cb;
                data->user_data = user_data;
 
-               err = request_cookie_input(provider, request_input_cb, data);
+               err = request_cookie_input(provider, data, dbus_sender);
                if (err != -EINPROGRESS) {
+                       vpn_provider_indicate_error(data->provider,
+                                       VPN_PROVIDER_ERROR_LOGIN_FAILED);
                        free_private_data(data);
-                       goto done;
                }
                return err;
        }
 
-done:
-       return run_connect(provider, task, if_name, cb, user_data, vpncookie);
+       return run_connect(provider, task, if_name, cb, user_data);
 }
 
 static int oc_save(struct vpn_provider *provider, GKeyFile *keyfile)
@@ -479,21 +512,21 @@ static int oc_save(struct vpn_provider *provider, GKeyFile *keyfile)
 
        setting = vpn_provider_get_string(provider,
                                        "OpenConnect.ServerCert");
-       if (setting != NULL)
+       if (setting)
                g_key_file_set_string(keyfile,
                                vpn_provider_get_save_group(provider),
                                "OpenConnect.ServerCert", setting);
 
        setting = vpn_provider_get_string(provider,
                                        "OpenConnect.CACert");
-       if (setting != NULL)
+       if (setting)
                g_key_file_set_string(keyfile,
                                vpn_provider_get_save_group(provider),
                                "OpenConnect.CACert", setting);
 
        setting = vpn_provider_get_string(provider,
                                        "VPN.MTU");
-       if (setting != NULL)
+       if (setting)
                g_key_file_set_string(keyfile,
                                vpn_provider_get_save_group(provider),
                                "VPN.MTU", setting);
@@ -502,7 +535,7 @@ static int oc_save(struct vpn_provider *provider, GKeyFile *keyfile)
                if (strncmp(oc_options[i].cm_opt, "OpenConnect.", 12) == 0) {
                        option = vpn_provider_get_string(provider,
                                                        oc_options[i].cm_opt);
-                       if (option == NULL)
+                       if (!option)
                                continue;
 
                        g_key_file_set_string(keyfile,
@@ -514,13 +547,15 @@ static int oc_save(struct vpn_provider *provider, GKeyFile *keyfile)
        return 0;
 }
 
-static int oc_error_code(int exit_code)
+static int oc_error_code(struct vpn_provider *provider, int exit_code)
 {
 
        switch (exit_code) {
        case 1:
                return VPN_PROVIDER_ERROR_CONNECT_FAILED;
        case 2:
+               vpn_provider_set_string_hide_value(provider,
+                               "OpenConnect.Cookie", NULL);
                return VPN_PROVIDER_ERROR_LOGIN_FAILED;
        default:
                return VPN_PROVIDER_ERROR_UNKNOWN;
index 486944d..35013c4 100644 (file)
@@ -84,18 +84,18 @@ static struct nameserver_entry *ov_append_dns_entries(const char *key,
        struct nameserver_entry *entry = NULL;
        gchar **options;
 
-       if (g_str_has_prefix(key, "foreign_option_") == FALSE)
+       if (!g_str_has_prefix(key, "foreign_option_"))
                return NULL;
 
        options = g_strsplit(value, " ", 3);
-       if (options[0] != NULL &&
+       if (options[0] &&
                !strcmp(options[0], "dhcp-option") &&
-                       options[1] != NULL &&
+                       options[1] &&
                        !strcmp(options[1], "DNS") &&
-                               options[2] != NULL) {
+                               options[2]) {
 
                entry = g_try_new(struct nameserver_entry, 1);
-               if (entry == NULL)
+               if (!entry)
                        return NULL;
 
                entry->nameserver = g_strdup(options[2]);
@@ -112,15 +112,15 @@ static char *ov_get_domain_name(const char *key, const char *value)
        gchar **options;
        char *domain = NULL;
 
-       if (g_str_has_prefix(key, "foreign_option_") == FALSE)
+       if (!g_str_has_prefix(key, "foreign_option_"))
                return NULL;
 
        options = g_strsplit(value, " ", 3);
-       if (options[0] != NULL &&
+       if (options[0] &&
                !strcmp(options[0], "dhcp-option") &&
-                       options[1] != NULL &&
+                       options[1] &&
                        !strcmp(options[1], "DOMAIN") &&
-                               options[2] != NULL) {
+                               options[2]) {
 
                domain = g_strdup(options[2]);
        }
@@ -186,30 +186,24 @@ static int ov_notify(DBusMessage *msg, struct vpn_provider *provider)
 
                DBG("%s = %s", key, value);
 
-               if (!strcmp(key, "trusted_ip")) {
-                       vpn_provider_set_string(provider, "Gateway", value);
+               if (!strcmp(key, "trusted_ip"))
                        gateway = g_strdup(value);
-               }
 
-               if (!strcmp(key, "ifconfig_local")) {
-                       vpn_provider_set_string(provider, "Address", value);
+               if (!strcmp(key, "ifconfig_local"))
                        address = g_strdup(value);
-               }
 
-               if (!strcmp(key, "ifconfig_remote")) {
-                       vpn_provider_set_string(provider, "Peer", value);
+               if (!strcmp(key, "ifconfig_remote"))
                        peer = g_strdup(value);
-               }
 
-               if (g_str_has_prefix(key, "route_") == TRUE)
+               if (g_str_has_prefix(key, "route_"))
                        vpn_provider_append_route(provider, key, value);
 
-               if ((ns_entry = ov_append_dns_entries(key, value)) != NULL)
+               if ((ns_entry = ov_append_dns_entries(key, value)))
                        nameserver_list = g_slist_prepend(nameserver_list,
                                                        ns_entry);
                else {
                        char *domain = ov_get_domain_name(key, value);
-                       if (domain != NULL) {
+                       if (domain) {
                                vpn_provider_set_domain(provider, domain);
                                g_free(domain);
                        }
@@ -219,7 +213,7 @@ static int ov_notify(DBusMessage *msg, struct vpn_provider *provider)
        }
 
        ipaddress = connman_ipaddress_alloc(AF_INET);
-       if (ipaddress == NULL) {
+       if (!ipaddress) {
                g_slist_free_full(nameserver_list, free_ns_entry);
                g_free(address);
                g_free(gateway);
@@ -232,16 +226,16 @@ static int ov_notify(DBusMessage *msg, struct vpn_provider *provider)
        connman_ipaddress_set_peer(ipaddress, peer);
        vpn_provider_set_ipaddress(provider, ipaddress);
 
-       if (nameserver_list != NULL) {
+       if (nameserver_list) {
                char *nameservers = NULL;
                GSList *tmp;
 
                nameserver_list = g_slist_sort(nameserver_list, cmp_ns);
-               for (tmp = nameserver_list; tmp != NULL;
+               for (tmp = nameserver_list; tmp;
                                                tmp = g_slist_next(tmp)) {
                        struct nameserver_entry *ns = tmp->data;
 
-                       if (nameservers == NULL) {
+                       if (!nameservers) {
                                nameservers = g_strdup(ns->nameserver);
                        } else {
                                char *str;
@@ -276,7 +270,7 @@ static int ov_save(struct vpn_provider *provider, GKeyFile *keyfile)
                if (strncmp(ov_options[i].cm_opt, "OpenVPN.", 8) == 0) {
                        option = vpn_provider_get_string(provider,
                                                        ov_options[i].cm_opt);
-                       if (option == NULL)
+                       if (!option)
                                continue;
 
                        g_key_file_set_string(keyfile,
@@ -294,12 +288,12 @@ static int task_append_config_data(struct vpn_provider *provider,
        int i;
 
        for (i = 0; i < (int)ARRAY_SIZE(ov_options); i++) {
-               if (ov_options[i].ov_opt == NULL)
+               if (!ov_options[i].ov_opt)
                        continue;
 
                option = vpn_provider_get_string(provider,
                                        ov_options[i].cm_opt);
-               if (option == NULL)
+               if (!option)
                        continue;
 
                if (connman_task_add_argument(task,
@@ -314,13 +308,14 @@ static int task_append_config_data(struct vpn_provider *provider,
 
 static int ov_connect(struct vpn_provider *provider,
                        struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data)
+                       vpn_provider_connect_cb_t cb, const char *dbus_sender,
+                       void *user_data)
 {
        const char *option;
        int err = 0, fd;
 
        option = vpn_provider_get_string(provider, "Host");
-       if (option == NULL) {
+       if (!option) {
                connman_error("Host not set; cannot enable VPN");
                return -EINVAL;
        }
@@ -328,16 +323,16 @@ static int ov_connect(struct vpn_provider *provider,
        task_append_config_data(provider, task);
 
        option = vpn_provider_get_string(provider, "OpenVPN.ConfigFile");
-       if (option == NULL) {
+       if (!option) {
                /*
                 * Set some default options if user has no config file.
                 */
                option = vpn_provider_get_string(provider, "OpenVPN.TLSAuth");
-               if (option != NULL) {
+               if (option) {
                        connman_task_add_argument(task, "--tls-auth", option);
                        option = vpn_provider_get_string(provider,
                                                        "OpenVPN.TLSAuthDir");
-                       if (option != NULL)
+                       if (option)
                                connman_task_add_argument(task, option, NULL);
                }
 
@@ -394,7 +389,7 @@ static int ov_connect(struct vpn_provider *provider,
        }
 
 done:
-       if (cb != NULL)
+       if (cb)
                cb(provider, user_data, err);
 
        return err;
index 01b5e2b..a6e51e7 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2010  BMW Car IT GmbH. All rights reserved.
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2010,2013  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -96,17 +96,17 @@ static DBusMessage *pptp_get_sec(struct connman_task *task,
        struct vpn_provider *provider = user_data;
        DBusMessage *reply;
 
-       if (dbus_message_get_no_reply(msg) == TRUE)
+       if (dbus_message_get_no_reply(msg))
                return NULL;
 
        user = vpn_provider_get_string(provider, "PPTP.User");
        passwd = vpn_provider_get_string(provider, "PPTP.Password");
-       if (user == NULL || strlen(user) == 0 ||
-                               passwd == NULL || strlen(passwd) == 0)
+       if (!user || strlen(user) == 0 ||
+                               !passwd || strlen(passwd) == 0)
                return NULL;
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_append_args(reply, DBUS_TYPE_STRING, &user,
@@ -128,7 +128,7 @@ static int pptp_notify(DBusMessage *msg, struct vpn_provider *provider)
        dbus_message_iter_get_basic(&iter, &reason);
        dbus_message_iter_next(&iter);
 
-       if (provider == NULL) {
+       if (!provider) {
                connman_error("No provider found");
                return VPN_STATE_FAILURE;
        }
@@ -157,20 +157,14 @@ static int pptp_notify(DBusMessage *msg, struct vpn_provider *provider)
 
                DBG("%s = %s", key, value);
 
-               if (!strcmp(key, "INTERNAL_IP4_ADDRESS")) {
-                       vpn_provider_set_string(provider, "Address", value);
+               if (!strcmp(key, "INTERNAL_IP4_ADDRESS"))
                        addressv4 = g_strdup(value);
-               }
 
-               if (!strcmp(key, "INTERNAL_IP4_NETMASK")) {
-                       vpn_provider_set_string(provider, "Netmask", value);
+               if (!strcmp(key, "INTERNAL_IP4_NETMASK"))
                        netmask = g_strdup(value);
-               }
 
-               if (!strcmp(key, "INTERNAL_IP4_DNS")) {
-                       vpn_provider_set_string(provider, "DNS", value);
+               if (!strcmp(key, "INTERNAL_IP4_DNS"))
                        nameservers = g_strdup(value);
-               }
 
                if (!strcmp(key, "INTERNAL_IFNAME"))
                        ifname = g_strdup(value);
@@ -186,12 +180,12 @@ static int pptp_notify(DBusMessage *msg, struct vpn_provider *provider)
                return VPN_STATE_FAILURE;
        }
 
-       if (addressv4 != NULL)
+       if (addressv4)
                ipaddress = connman_ipaddress_alloc(AF_INET);
 
        g_free(ifname);
 
-       if (ipaddress == NULL) {
+       if (!ipaddress) {
                connman_error("No IP address for provider");
                g_free(addressv4);
                g_free(netmask);
@@ -200,12 +194,12 @@ static int pptp_notify(DBusMessage *msg, struct vpn_provider *provider)
        }
 
        value = vpn_provider_get_string(provider, "HostIP");
-       if (value != NULL) {
+       if (value) {
                vpn_provider_set_string(provider, "Gateway", value);
                gateway = g_strdup(value);
        }
 
-       if (addressv4 != NULL)
+       if (addressv4)
                connman_ipaddress_set_ipv4(ipaddress, addressv4, netmask,
                                        gateway);
 
@@ -224,29 +218,29 @@ static int pptp_notify(DBusMessage *msg, struct vpn_provider *provider)
 static int pptp_save(struct vpn_provider *provider, GKeyFile *keyfile)
 {
        const char *option;
-       connman_bool_t pptp_option, pppd_option;
+       bool pptp_option, pppd_option;
        int i;
 
        for (i = 0; i < (int)ARRAY_SIZE(pptp_options); i++) {
-               pptp_option = pppd_option = FALSE;
+               pptp_option = pppd_option = false;
 
                if (strncmp(pptp_options[i].cm_opt, "PPTP.", 5) == 0)
-                       pptp_option = TRUE;
+                       pptp_option = true;
 
                if (strncmp(pptp_options[i].cm_opt, "PPPD.", 5) == 0)
-                       pppd_option = TRUE;
+                       pppd_option = true;
 
-               if (pptp_option == TRUE || pppd_option == TRUE) {
+               if (pptp_option || pppd_option) {
                        option = vpn_provider_get_string(provider,
                                                        pptp_options[i].cm_opt);
-                       if (option == NULL) {
+                       if (!option) {
                                /*
                                 * Check if the option prefix is PPTP as the
                                 * PPPD options were using PPTP prefix earlier.
                                 */
                                char *pptp_str;
 
-                               if (pppd_option == FALSE)
+                               if (!pppd_option)
                                        continue;
 
                                pptp_str = g_strdup_printf("PPTP.%s",
@@ -255,7 +249,7 @@ static int pptp_save(struct vpn_provider *provider, GKeyFile *keyfile)
                                                                pptp_str);
                                g_free(pptp_str);
 
-                               if (option == NULL)
+                               if (!option)
                                        continue;
                        }
 
@@ -271,7 +265,7 @@ static int pptp_save(struct vpn_provider *provider, GKeyFile *keyfile)
 static void pptp_write_bool_option(struct connman_task *task,
                                const char *key, const char *value)
 {
-       if (key != NULL && value != NULL) {
+       if (key && value) {
                if (strcasecmp(value, "yes") == 0 ||
                                strcasecmp(value, "true") == 0 ||
                                strcmp(value, "1") == 0)
@@ -300,7 +294,7 @@ static void request_input_reply(DBusMessage *reply, void *user_data)
                goto done;
        }
 
-       if (vpn_agent_check_reply_has_dict(reply) == FALSE)
+       if (!vpn_agent_check_reply_has_dict(reply))
                goto done;
 
        dbus_message_iter_init(reply, &iter);
@@ -359,7 +353,8 @@ typedef void (* request_cb_t)(struct vpn_provider *provider,
                                const char *error, void *user_data);
 
 static int request_input(struct vpn_provider *provider,
-                               request_cb_t callback, void *user_data)
+                       request_cb_t callback, const char *dbus_sender,
+                       void *user_data)
 {
        DBusMessage *message;
        const char *path, *agent_sender, *agent_path;
@@ -367,16 +362,17 @@ static int request_input(struct vpn_provider *provider,
        DBusMessageIter dict;
        struct request_input_reply *pptp_reply;
        int err;
+       void *agent;
 
-       connman_agent_get_info(&agent_sender, &agent_path);
-
-       if (provider == NULL || agent_path == NULL || callback == NULL)
+       agent = connman_agent_get_info(dbus_sender, &agent_sender,
+                                                       &agent_path);
+       if (!provider || !agent || !agent_path || !callback)
                return -ESRCH;
 
        message = dbus_message_new_method_call(agent_sender, agent_path,
                                        VPN_AGENT_INTERFACE,
                                        "RequestInput");
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -394,7 +390,7 @@ static int request_input(struct vpn_provider *provider,
        connman_dbus_dict_close(&iter, &dict);
 
        pptp_reply = g_try_new0(struct request_input_reply, 1);
-       if (pptp_reply == NULL) {
+       if (!pptp_reply) {
                dbus_message_unref(message);
                return -ENOMEM;
        }
@@ -405,7 +401,7 @@ static int request_input(struct vpn_provider *provider,
 
        err = connman_agent_queue_message(provider, message,
                        connman_timeout_input_request(),
-                       request_input_reply, pptp_reply);
+                       request_input_reply, pptp_reply, agent);
        if (err < 0 && err != -EBUSY) {
                DBG("error %d sending agent request", err);
                dbus_message_unref(message);
@@ -428,13 +424,13 @@ static int run_connect(struct vpn_provider *provider,
        int err, i;
 
        host = vpn_provider_get_string(provider, "Host");
-       if (host == NULL) {
+       if (!host) {
                connman_error("Host not set; cannot enable VPN");
                err = -EINVAL;
                goto done;
        }
 
-       if (username == NULL || password == NULL) {
+       if (!username || !password) {
                DBG("Cannot connect username %s password %p",
                                                username, password);
                err = -EINVAL;
@@ -445,7 +441,7 @@ static int run_connect(struct vpn_provider *provider,
 
        str = g_strdup_printf("%s %s --nolaunchpppd --loglevel 2",
                                PPTP, host);
-       if (str == NULL) {
+       if (!str) {
                connman_error("can not allocate memory");
                err = -ENOMEM;
                goto done;
@@ -465,10 +461,10 @@ static int run_connect(struct vpn_provider *provider,
        for (i = 0; i < (int)ARRAY_SIZE(pptp_options); i++) {
                opt_s = vpn_provider_get_string(provider,
                                        pptp_options[i].cm_opt);
-               if (opt_s == NULL)
+               if (!opt_s)
                        opt_s = pptp_options[i].vpnc_default;
 
-               if (opt_s == NULL)
+               if (!opt_s)
                        continue;
 
                if (pptp_options[i].type == OPT_STRING)
@@ -491,7 +487,7 @@ static int run_connect(struct vpn_provider *provider,
        }
 
 done:
-       if (cb != NULL)
+       if (cb)
                cb(provider, user_data, err);
 
        return err;
@@ -510,10 +506,10 @@ static void request_input_cb(struct vpn_provider *provider,
 {
        struct pptp_private_data *data = user_data;
 
-       if (username == NULL || password == NULL)
+       if (!username || !password)
                DBG("Requesting username %s or password failed, error %s",
                        username, error);
-       else if (error != NULL)
+       else if (error)
                DBG("error %s", error);
 
        vpn_provider_set_string(provider, "PPTP.User", username);
@@ -528,7 +524,8 @@ static void request_input_cb(struct vpn_provider *provider,
 
 static int pptp_connect(struct vpn_provider *provider,
                        struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data)
+                       vpn_provider_connect_cb_t cb, const char *dbus_sender,
+                       void *user_data)
 {
        const char *username, *password;
        int err;
@@ -546,11 +543,11 @@ static int pptp_connect(struct vpn_provider *provider,
 
        DBG("user %s password %p", username, password);
 
-       if (username == NULL || password == NULL) {
+       if (!username || !password) {
                struct pptp_private_data *data;
 
                data = g_try_new0(struct pptp_private_data, 1);
-               if (data == NULL)
+               if (!data)
                        return -ENOMEM;
 
                data->task = task;
@@ -558,7 +555,8 @@ static int pptp_connect(struct vpn_provider *provider,
                data->cb = cb;
                data->user_data = user_data;
 
-               err = request_input(provider, request_input_cb, data);
+               err = request_input(provider, request_input_cb, dbus_sender,
+                                                                       data);
                if (err != -EINPROGRESS) {
                        free_private_data(data);
                        goto done;
@@ -571,13 +569,13 @@ done:
                                                        username, password);
 
 error:
-       if (cb != NULL)
+       if (cb)
                cb(provider, user_data, err);
 
        return err;
 }
 
-static int pptp_error_code(int exit_code)
+static int pptp_error_code(struct vpn_provider *provider, int exit_code)
 {
 
        switch (exit_code) {
index 99f829c..b407573 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -75,16 +75,16 @@ static int stop_vpn(struct vpn_provider *provider)
        struct ifreq ifr;
        int fd, err;
 
-       if (data == NULL)
+       if (!data)
                return -EINVAL;
 
        name = vpn_provider_get_driver_name(provider);
-       if (name == NULL)
+       if (!name)
                return -EINVAL;
 
        vpn_driver_data = g_hash_table_lookup(driver_hash, name);
 
-       if (vpn_driver_data != NULL && vpn_driver_data->vpn_driver != NULL &&
+       if (vpn_driver_data && vpn_driver_data->vpn_driver &&
                        vpn_driver_data->vpn_driver->flags == VPN_FLAG_NO_TUN)
                return 0;
 
@@ -129,7 +129,7 @@ void vpn_died(struct connman_task *task, int exit_code, void *user_data)
 
        DBG("provider %p data %p", provider, data);
 
-       if (data == NULL)
+       if (!data)
                goto vpn_exit;
 
        state = data->state;
@@ -149,12 +149,13 @@ vpn_exit:
                struct vpn_driver_data *vpn_data = NULL;
 
                name = vpn_provider_get_driver_name(provider);
-               if (name != NULL)
+               if (name)
                        vpn_data = g_hash_table_lookup(driver_hash, name);
 
-               if (vpn_data != NULL &&
-                               vpn_data->vpn_driver->error_code != NULL)
-                       ret = vpn_data->vpn_driver->error_code(exit_code);
+               if (vpn_data &&
+                               vpn_data->vpn_driver->error_code)
+                       ret = vpn_data->vpn_driver->error_code(provider,
+                                       exit_code);
                else
                        ret = VPN_PROVIDER_ERROR_UNKNOWN;
 
@@ -166,7 +167,7 @@ vpn_exit:
 
        vpn_provider_set_index(provider, -1);
 
-       if (data != NULL) {
+       if (data) {
                vpn_provider_unref(data->provider);
                g_free(data->if_name);
                g_free(data);
@@ -180,14 +181,14 @@ int vpn_set_ifname(struct vpn_provider *provider, const char *ifname)
        struct vpn_data *data = vpn_provider_get_data(provider);
        int index;
 
-       if (ifname == NULL || data == NULL)
+       if (!ifname || !data)
                return  -EIO;
 
        index = connman_inet_ifindex(ifname);
        if (index < 0)
                return  -EIO;
 
-       if (data->if_name != NULL)
+       if (data->if_name)
                g_free(data->if_name);
 
        data->if_name = (char *)g_strdup(ifname);
@@ -224,14 +225,14 @@ static DBusMessage *vpn_notify(struct connman_task *task,
 
        name = vpn_provider_get_driver_name(provider);
 
-       if (name == NULL) {
+       if (!name) {
                DBG("Cannot find VPN driver for provider %p", provider);
                vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
                return NULL;
        }
 
        vpn_driver_data = g_hash_table_lookup(driver_hash, name);
-       if (vpn_driver_data == NULL) {
+       if (!vpn_driver_data) {
                DBG("Cannot find VPN driver data for name %s", name);
                vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
                return NULL;
@@ -290,7 +291,7 @@ static int vpn_create_tun(struct vpn_provider *provider)
        int i, fd, index;
        int ret = 0;
 
-       if (data == NULL)
+       if (!data)
                return -EISCONN;
 
        fd = open("/dev/net/tun", O_RDWR | O_CLOEXEC);
@@ -320,7 +321,7 @@ static int vpn_create_tun(struct vpn_provider *provider)
        }
 
        data->if_name = (char *)g_strdup(ifr.ifr_name);
-       if (data->if_name == NULL) {
+       if (!data->if_name) {
                connman_error("Failed to allocate memory");
                close(fd);
                ret = -ENOMEM;
@@ -354,7 +355,8 @@ exist_err:
 }
 
 static int vpn_connect(struct vpn_provider *provider,
-                       vpn_provider_connect_cb_t cb, void *user_data)
+                       vpn_provider_connect_cb_t cb,
+                       const char *dbus_sender, void *user_data)
 {
        struct vpn_data *data = vpn_provider_get_data(provider);
        struct vpn_driver_data *vpn_driver_data;
@@ -362,7 +364,7 @@ static int vpn_connect(struct vpn_provider *provider,
        int ret = 0;
        enum vpn_state state = VPN_STATE_UNKNOWN;
 
-       if (data != NULL)
+       if (data)
                state = data->state;
 
        DBG("data %p state %d", data, state);
@@ -370,7 +372,7 @@ static int vpn_connect(struct vpn_provider *provider,
        switch (state) {
        case VPN_STATE_UNKNOWN:
                data = g_try_new0(struct vpn_data, 1);
-               if (data == NULL)
+               if (!data)
                        return -ENOMEM;
 
                data->provider = vpn_provider_ref(provider);
@@ -396,12 +398,12 @@ static int vpn_connect(struct vpn_provider *provider,
        }
 
        name = vpn_provider_get_driver_name(provider);
-       if (name == NULL)
+       if (!name)
                return -EINVAL;
 
        vpn_driver_data = g_hash_table_lookup(driver_hash, name);
 
-       if (vpn_driver_data == NULL || vpn_driver_data->vpn_driver == NULL) {
+       if (!vpn_driver_data || !vpn_driver_data->vpn_driver) {
                ret = -EINVAL;
                goto exist_err;
        }
@@ -414,7 +416,7 @@ static int vpn_connect(struct vpn_provider *provider,
 
        data->task = connman_task_create(vpn_driver_data->program);
 
-       if (data->task == NULL) {
+       if (!data->task) {
                ret = -ENOMEM;
                stop_vpn(provider);
                goto exist_err;
@@ -430,7 +432,8 @@ static int vpn_connect(struct vpn_provider *provider,
        }
 
        ret = vpn_driver_data->vpn_driver->connect(provider, data->task,
-                                               data->if_name, cb, user_data);
+                                               data->if_name, cb, dbus_sender,
+                                               user_data);
        if (ret < 0 && ret != -EINPROGRESS) {
                stop_vpn(provider);
                connman_task_destroy(data->task);
@@ -468,11 +471,11 @@ static int vpn_disconnect(struct vpn_provider *provider)
 
        DBG("disconnect provider %p:", provider);
 
-       if (data == NULL)
+       if (!data)
                return 0;
 
        name = vpn_provider_get_driver_name(provider);
-       if (name == NULL)
+       if (!name)
                return 0;
 
        vpn_driver_data = g_hash_table_lookup(driver_hash, name);
@@ -496,7 +499,7 @@ static int vpn_remove(struct vpn_provider *provider)
        struct vpn_data *data;
 
        data = vpn_provider_get_data(provider);
-       if (data == NULL)
+       if (!data)
                return 0;
 
        if (data->watch != 0) {
@@ -519,8 +522,8 @@ static int vpn_save(struct vpn_provider *provider, GKeyFile *keyfile)
 
        name = vpn_provider_get_driver_name(provider);
        vpn_driver_data = g_hash_table_lookup(driver_hash, name);
-       if (vpn_driver_data != NULL &&
-                       vpn_driver_data->vpn_driver->save != NULL)
+       if (vpn_driver_data &&
+                       vpn_driver_data->vpn_driver->save)
                return vpn_driver_data->vpn_driver->save(provider, keyfile);
 
        return 0;
@@ -532,7 +535,7 @@ int vpn_register(const char *name, struct vpn_driver *vpn_driver,
        struct vpn_driver_data *data;
 
        data = g_try_new0(struct vpn_driver_data, 1);
-       if (data == NULL)
+       if (!data)
                return -ENOMEM;
 
        data->name = name;
@@ -547,12 +550,12 @@ int vpn_register(const char *name, struct vpn_driver *vpn_driver,
        data->provider_driver.remove = vpn_remove;
        data->provider_driver.save = vpn_save;
 
-       if (driver_hash == NULL)
+       if (!driver_hash)
                driver_hash = g_hash_table_new_full(g_str_hash,
                                                        g_str_equal,
                                                        NULL, g_free);
 
-       if (driver_hash == NULL) {
+       if (!driver_hash) {
                connman_error("driver_hash not initialized for %s", name);
                g_free(data);
                return -ENOMEM;
@@ -570,7 +573,7 @@ void vpn_unregister(const char *name)
        struct vpn_driver_data *data;
 
        data = g_hash_table_lookup(driver_hash, name);
-       if (data == NULL)
+       if (!data)
                return;
 
        vpn_provider_driver_unregister(&data->provider_driver);
index 6f86aac..3d2b66c 100644 (file)
@@ -45,9 +45,10 @@ struct vpn_driver {
        int (*notify) (DBusMessage *msg, struct vpn_provider *provider);
        int (*connect) (struct vpn_provider *provider,
                        struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data);
+                       vpn_provider_connect_cb_t cb, const char *dbus_sender,
+                       void *user_data);
        void (*disconnect) (struct vpn_provider *provider);
-       int (*error_code) (int exit_code);
+       int (*error_code) (struct vpn_provider *provider, int exit_code);
        int (*save) (struct vpn_provider *provider, GKeyFile *keyfile);
 };
 
index 9f69850..04235c8 100644 (file)
@@ -2,8 +2,8 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2010  BMW Car IT GmbH. All rights reserved.
- *  Copyright (C) 2010  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2010,2013  BMW Car IT GmbH. All rights reserved.
+ *  Copyright (C) 2010,2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -57,29 +57,29 @@ struct {
        const char *vpnc_opt;
        const char *vpnc_default;
        int type;
-       connman_bool_t cm_save;
+       bool cm_save;
 } vpnc_options[] = {
-       { "Host", "IPSec gateway", NULL, OPT_STRING, TRUE },
-       { "VPNC.IPSec.ID", "IPSec ID", NULL, OPT_STRING, TRUE },
-       { "VPNC.IPSec.Secret", "IPSec secret", NULL, OPT_STRING, FALSE },
-       { "VPNC.Xauth.Username", "Xauth username", NULL, OPT_STRING, FALSE },
-       { "VPNC.Xauth.Password", "Xauth password", NULL, OPT_STRING, FALSE },
-       { "VPNC.IKE.Authmode", "IKE Authmode", NULL, OPT_STRING, TRUE },
-       { "VPNC.IKE.DHGroup", "IKE DH Group", NULL, OPT_STRING, TRUE },
-       { "VPNC.PFS", "Perfect Forward Secrecy", NULL, OPT_STRING, TRUE },
-       { "VPNC.Domain", "Domain", NULL, OPT_STRING, TRUE },
-       { "VPNC.Vendor", "Vendor", NULL, OPT_STRING, TRUE },
-       { "VPNC.LocalPort", "Local Port", "0", OPT_STRING, TRUE, },
+       { "Host", "IPSec gateway", NULL, OPT_STRING, true },
+       { "VPNC.IPSec.ID", "IPSec ID", NULL, OPT_STRING, true },
+       { "VPNC.IPSec.Secret", "IPSec secret", NULL, OPT_STRING, false },
+       { "VPNC.Xauth.Username", "Xauth username", NULL, OPT_STRING, false },
+       { "VPNC.Xauth.Password", "Xauth password", NULL, OPT_STRING, false },
+       { "VPNC.IKE.Authmode", "IKE Authmode", NULL, OPT_STRING, true },
+       { "VPNC.IKE.DHGroup", "IKE DH Group", NULL, OPT_STRING, true },
+       { "VPNC.PFS", "Perfect Forward Secrecy", NULL, OPT_STRING, true },
+       { "VPNC.Domain", "Domain", NULL, OPT_STRING, true },
+       { "VPNC.Vendor", "Vendor", NULL, OPT_STRING, true },
+       { "VPNC.LocalPort", "Local Port", "0", OPT_STRING, true, },
        { "VPNC.CiscoPort", "Cisco UDP Encapsulation Port", "0", OPT_STRING,
-                                                                       TRUE },
-       { "VPNC.AppVersion", "Application Version", NULL, OPT_STRING, TRUE },
+                                                                       true },
+       { "VPNC.AppVersion", "Application Version", NULL, OPT_STRING, true },
        { "VPNC.NATTMode", "NAT Traversal Mode", "cisco-udp", OPT_STRING,
-                                                                       TRUE },
+                                                                       true },
        { "VPNC.DPDTimeout", "DPD idle timeout (our side)", NULL, OPT_STRING,
-                                                                       TRUE },
-       { "VPNC.SingleDES", "Enable Single DES", NULL, OPT_BOOLEAN, TRUE },
+                                                                       true },
+       { "VPNC.SingleDES", "Enable Single DES", NULL, OPT_BOOLEAN, true },
        { "VPNC.NoEncryption", "Enable no encryption", NULL, OPT_BOOLEAN,
-                                                                       TRUE },
+                                                                       true },
 };
 
 static int vc_notify(DBusMessage *msg, struct vpn_provider *provider)
@@ -129,8 +129,8 @@ static int vc_notify(DBusMessage *msg, struct vpn_provider *provider)
                if (!strcmp(key, "CISCO_DEF_DOMAIN"))
                        vpn_provider_set_domain(provider, value);
 
-               if (g_str_has_prefix(key, "CISCO_SPLIT_INC") == TRUE ||
-                       g_str_has_prefix(key, "CISCO_IPV6_SPLIT_INC") == TRUE)
+               if (g_str_has_prefix(key, "CISCO_SPLIT_INC") ||
+                       g_str_has_prefix(key, "CISCO_IPV6_SPLIT_INC"))
                        vpn_provider_append_route(provider, key, value);
 
                dbus_message_iter_next(&dict);
@@ -138,7 +138,7 @@ static int vc_notify(DBusMessage *msg, struct vpn_provider *provider)
 
 
        ipaddress = connman_ipaddress_alloc(AF_INET);
-       if (ipaddress == NULL) {
+       if (!ipaddress) {
                g_free(address);
                g_free(netmask);
                g_free(gateway);
@@ -180,7 +180,7 @@ static ssize_t write_option(int fd, const char *key, const char *value)
        gchar *buf;
        ssize_t ret = 0;
 
-       if (key != NULL && value != NULL) {
+       if (key && value) {
                buf = g_strdup_printf("%s %s\n", key, value);
                ret = full_write(fd, buf, strlen(buf));
 
@@ -195,7 +195,7 @@ static ssize_t write_bool_option(int fd, const char *key, const char *value)
        gchar *buf;
        ssize_t ret = 0;
 
-       if (key != NULL && value != NULL) {
+       if (key && value) {
                if (strcasecmp(value, "yes") == 0 ||
                                strcasecmp(value, "true") == 0 ||
                                strcmp(value, "1") == 0) {
@@ -217,10 +217,10 @@ static int vc_write_config_data(struct vpn_provider *provider, int fd)
        for (i = 0; i < (int)ARRAY_SIZE(vpnc_options); i++) {
                opt_s = vpn_provider_get_string(provider,
                                        vpnc_options[i].cm_opt);
-               if (opt_s == FALSE)
+               if (!opt_s)
                        opt_s = vpnc_options[i].vpnc_default;
 
-               if (opt_s == FALSE)
+               if (!opt_s)
                        continue;
 
                if (vpnc_options[i].type == OPT_STRING) {
@@ -246,12 +246,12 @@ static int vc_save(struct vpn_provider *provider, GKeyFile *keyfile)
        for (i = 0; i < (int)ARRAY_SIZE(vpnc_options); i++) {
                if (strncmp(vpnc_options[i].cm_opt, "VPNC.", 5) == 0) {
 
-                       if (vpnc_options[i].cm_save == FALSE)
+                       if (!vpnc_options[i].cm_save)
                                continue;
 
                        option = vpn_provider_get_string(provider,
                                                        vpnc_options[i].cm_opt);
-                       if (option == NULL)
+                       if (!option)
                                continue;
 
                        g_key_file_set_string(keyfile,
@@ -264,19 +264,20 @@ static int vc_save(struct vpn_provider *provider, GKeyFile *keyfile)
 
 static int vc_connect(struct vpn_provider *provider,
                        struct connman_task *task, const char *if_name,
-                       vpn_provider_connect_cb_t cb, void *user_data)
+                       vpn_provider_connect_cb_t cb, const char *dbus_sender,
+                       void *user_data)
 {
        const char *option;
        int err = 0, fd;
 
        option = vpn_provider_get_string(provider, "Host");
-       if (option == NULL) {
+       if (!option) {
                connman_error("Host not set; cannot enable VPN");
                err = -EINVAL;
                goto done;
        }
        option = vpn_provider_get_string(provider, "VPNC.IPSec.ID");
-       if (option == NULL) {
+       if (!option) {
                connman_error("Group not set; cannot enable VPN");
                err = -EINVAL;
                goto done;
@@ -292,7 +293,7 @@ static int vc_connect(struct vpn_provider *provider,
                                SCRIPTDIR "/openconnect-script");
 
        option = vpn_provider_get_string(provider, "VPNC.Debug");
-       if (option != NULL)
+       if (option)
                connman_task_add_argument(task, "--debug", option);
 
        connman_task_add_argument(task, "-", NULL);
@@ -310,13 +311,13 @@ static int vc_connect(struct vpn_provider *provider,
        close(fd);
 
 done:
-       if (cb != NULL)
+       if (cb)
                cb(provider, user_data, err);
 
        return err;
 }
 
-static int vc_error_code(int exit_code)
+static int vc_error_code(struct vpn_provider *provider, int exit_code)
 {
        switch (exit_code) {
        case 1:
index f1cfb1e..b0b582b 100644 (file)
@@ -35,7 +35,7 @@
 #include "vpn-agent.h"
 #include "vpn.h"
 
-connman_bool_t vpn_agent_check_reply_has_dict(DBusMessage *reply)
+bool vpn_agent_check_reply_has_dict(DBusMessage *reply)
 {
        const char *signature = DBUS_TYPE_ARRAY_AS_STRING
                DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
@@ -43,8 +43,8 @@ connman_bool_t vpn_agent_check_reply_has_dict(DBusMessage *reply)
                DBUS_TYPE_VARIANT_AS_STRING
                DBUS_DICT_ENTRY_END_CHAR_AS_STRING;
 
-       if (dbus_message_has_signature(reply, signature) == TRUE)
-               return TRUE;
+       if (dbus_message_has_signature(reply, signature))
+               return true;
 
        connman_warn("Reply %s to %s from %s has wrong signature %s",
                        signature,
@@ -52,7 +52,7 @@ connman_bool_t vpn_agent_check_reply_has_dict(DBusMessage *reply)
                        dbus_message_get_sender(reply),
                        dbus_message_get_signature(reply));
 
-       return FALSE;
+       return false;
 }
 
 static void request_input_append_name(DBusMessageIter *iter, void *user_data)
@@ -117,9 +117,9 @@ static void request_input_append_user_info(DBusMessageIter *iter,
        connman_dbus_dict_append_basic(iter, "Requirement",
                                DBUS_TYPE_STRING, &str);
 
-       if (data->username_str != NULL) {
+       if (data->username_str) {
                str = vpn_provider_get_string(provider, data->username_str);
-               if (str != NULL)
+               if (str)
                        connman_dbus_dict_append_basic(iter, "Value",
                                                DBUS_TYPE_STRING, &str);
        }
index 821d759..c7328d7 100644 (file)
@@ -34,7 +34,7 @@ extern "C" {
 
 void vpn_agent_append_host_and_name(DBusMessageIter *iter,
                                struct vpn_provider *provider);
-connman_bool_t vpn_agent_check_reply_has_dict(DBusMessage *reply);
+bool vpn_agent_check_reply_has_dict(DBusMessage *reply);
 void vpn_agent_append_user_info(DBusMessageIter *iter,
                                struct vpn_provider *provider,
                                const char *username_str);
index 728b076..293c64e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -64,7 +64,7 @@ struct vpn_config {
 
 static GHashTable *config_table = NULL;
 
-static connman_bool_t cleanup = FALSE;
+static bool cleanup = false;
 
 /* Definition of possible strings in the .config files */
 #define CONFIG_KEY_NAME                "Name"
@@ -96,7 +96,7 @@ static void unregister_provider(gpointer data)
        struct vpn_provider *provider;
        char *provider_id;
 
-       if (cleanup == TRUE)
+       if (cleanup)
                goto free_only;
 
        provider_id = config_provider->provider_identifier;
@@ -105,10 +105,10 @@ static void unregister_provider(gpointer data)
                                config_provider->ident, provider_id);
 
        provider = __vpn_provider_lookup(provider_id);
-       if (provider != NULL)
+       if (provider)
                __vpn_provider_delete(provider);
        else {
-               if (__connman_storage_remove_provider(provider_id) == FALSE)
+               if (!__connman_storage_remove_provider(provider_id))
                        DBG("Could not remove all files for provider %s",
                                                                provider_id);
        }
@@ -132,19 +132,19 @@ static int set_string(struct vpn_config_provider *config_provider,
 {
        DBG("provider %p key %s value %s", config_provider, key, value);
 
-       if (g_str_equal(key, "Type") == TRUE) {
+       if (g_str_equal(key, "Type")) {
                g_free(config_provider->type);
                config_provider->type = g_strdup(value);
-       } else if (g_str_equal(key, "Name") == TRUE) {
+       } else if (g_str_equal(key, "Name")) {
                g_free(config_provider->name);
                config_provider->name = g_strdup(value);
-       } else if (g_str_equal(key, "Host") == TRUE) {
+       } else if (g_str_equal(key, "Host")) {
                g_free(config_provider->host);
                config_provider->host = g_strdup(value);
-       } else if (g_str_equal(key, "Domain") == TRUE) {
+       } else if (g_str_equal(key, "Domain")) {
                g_free(config_provider->domain);
                config_provider->domain = g_strdup(value);
-       } else if (g_str_equal(key, "Networks") == TRUE) {
+       } else if (g_str_equal(key, "Networks")) {
                g_free(config_provider->networks);
                config_provider->networks = g_strdup(value);
        }
@@ -159,15 +159,15 @@ static const char *get_string(struct vpn_config_provider *config_provider,
 {
        DBG("provider %p key %s", config_provider, key);
 
-       if (g_str_equal(key, "Type") == TRUE)
+       if (g_str_equal(key, "Type"))
                return config_provider->type;
-       else if (g_str_equal(key, "Name") == TRUE)
+       else if (g_str_equal(key, "Name"))
                return config_provider->name;
-       else if (g_str_equal(key, "Host") == TRUE)
+       else if (g_str_equal(key, "Host"))
                return config_provider->host;
-       else if (g_str_equal(key, "Domain") == TRUE)
+       else if (g_str_equal(key, "Domain"))
                return config_provider->domain;
-       else if (g_str_equal(key, "Networks") == TRUE)
+       else if (g_str_equal(key, "Networks"))
                return config_provider->networks;
 
        return g_hash_table_lookup(config_provider->setting_strings, key);
@@ -180,13 +180,13 @@ static void add_keys(struct vpn_config_provider *config_provider,
        gsize nb_avail_keys, i;
 
        avail_keys = g_key_file_get_keys(keyfile, group, &nb_avail_keys, NULL);
-       if (avail_keys == NULL)
+       if (!avail_keys)
                return;
 
        for (i = 0 ; i < nb_avail_keys; i++) {
                char *value = g_key_file_get_value(keyfile, group,
                                                avail_keys[i], NULL);
-               if (value == NULL) {
+               if (!value) {
                        connman_warn("Cannot find value for %s",
                                                        avail_keys[i]);
                        continue;
@@ -213,11 +213,11 @@ static int load_provider(GKeyFile *keyfile, const char *group,
                return -EINVAL;
 
        config_provider = g_hash_table_lookup(config->provider_table, ident);
-       if (config_provider != NULL)
+       if (config_provider)
                return -EALREADY;
 
        config_provider = g_try_new0(struct vpn_config_provider, 1);
-       if (config_provider == NULL)
+       if (!config_provider)
                return -ENOMEM;
 
        config_provider->ident = g_strdup(ident);
@@ -229,12 +229,12 @@ static int load_provider(GKeyFile *keyfile, const char *group,
 
        host = get_string(config_provider, "Host");
        domain = get_string(config_provider, "Domain");
-       if (host != NULL && domain != NULL) {
+       if (host && domain) {
                char *id = __vpn_provider_create_identifier(host, domain);
 
                struct vpn_provider *provider;
                provider = __vpn_provider_lookup(id);
-               if (provider != NULL) {
+               if (provider) {
                        if (action == REMOVE) {
                                __vpn_provider_delete(provider);
                                err = 0;
@@ -298,7 +298,7 @@ static void check_keys(GKeyFile *keyfile, const char *group,
        gsize nb_avail_keys, i, j;
 
        avail_keys = g_key_file_get_keys(keyfile, group, &nb_avail_keys, NULL);
-       if (avail_keys == NULL)
+       if (!avail_keys)
                return;
 
        for (i = 0 ; i < nb_avail_keys; i++) {
@@ -306,7 +306,7 @@ static void check_keys(GKeyFile *keyfile, const char *group,
                        if (g_strcmp0(avail_keys[i], possible_keys[j]) == 0)
                                break;
 
-               if (possible_keys[j] == NULL)
+               if (!possible_keys[j])
                        connman_warn("Unknown configuration key %s in [%s]",
                                        avail_keys[i], group);
        }
@@ -320,42 +320,42 @@ static int load_config(struct vpn_config *config, char *path, enum what action)
        gsize length;
        char **groups;
        char *str;
-       gboolean found = FALSE;
+       bool found = false;
        int i;
 
        DBG("config %p", config);
 
        keyfile = __connman_storage_load_provider_config(config->ident);
-       if (keyfile == NULL)
+       if (!keyfile)
                return -EIO;
 
        /* Verify keys validity of the global section */
        check_keys(keyfile, "global", config_possible_keys);
 
-       str = g_key_file_get_string(keyfile, "global", CONFIG_KEY_NAME, NULL);
-       if (str != NULL) {
+       str = __vpn_config_get_string(keyfile, "global", CONFIG_KEY_NAME, NULL);
+       if (str) {
                g_free(config->name);
                config->name = str;
        }
 
-       str = g_key_file_get_string(keyfile, "global", CONFIG_KEY_DESC, NULL);
-       if (str != NULL) {
+       str = __vpn_config_get_string(keyfile, "global", CONFIG_KEY_DESC, NULL);
+       if (str) {
                g_free(config->description);
                config->description = str;
        }
 
        groups = g_key_file_get_groups(keyfile, &length);
 
-       for (i = 0; groups[i] != NULL; i++) {
-               if (g_str_has_prefix(groups[i], "provider_") == TRUE) {
+       for (i = 0; groups[i]; i++) {
+               if (g_str_has_prefix(groups[i], "provider_")) {
                        int ret = load_provider(keyfile, groups[i], config,
                                                action);
                        if (ret == 0 || ret == -EALREADY)
-                               found = TRUE;
+                               found = true;
                }
        }
 
-       if (found == FALSE)
+       if (!found)
                connman_warn("Config file %s/%s.config does not contain any "
                        "configuration that can be provisioned!",
                        path, config->ident);
@@ -373,11 +373,11 @@ static struct vpn_config *create_config(const char *ident)
 
        DBG("ident %s", ident);
 
-       if (g_hash_table_lookup(config_table, ident) != NULL)
+       if (g_hash_table_lookup(config_table, ident))
                return NULL;
 
        config = g_try_new0(struct vpn_config, 1);
-       if (config == NULL)
+       if (!config)
                return NULL;
 
        config->ident = g_strdup(ident);
@@ -392,21 +392,21 @@ static struct vpn_config *create_config(const char *ident)
        return config;
 }
 
-static connman_bool_t validate_ident(const char *ident)
+static bool validate_ident(const char *ident)
 {
        unsigned int i;
 
-       if (ident == NULL)
-               return FALSE;
+       if (!ident)
+               return false;
 
        for (i = 0; i < strlen(ident); i++)
-               if (g_ascii_isprint(ident[i]) == FALSE)
-                       return FALSE;
+               if (!g_ascii_isprint(ident[i]))
+                       return false;
 
-       return TRUE;
+       return true;
 }
 
-static char *get_dir()
+static char *get_dir(void)
 {
        return g_strdup_printf("%s", VPN_STORAGEDIR);
 }
@@ -419,31 +419,31 @@ static int read_configs(void)
        DBG("path %s", path);
 
        dir = g_dir_open(path, 0, NULL);
-       if (dir != NULL) {
+       if (dir) {
                const gchar *file;
 
-               while ((file = g_dir_read_name(dir)) != NULL) {
+               while ((file = g_dir_read_name(dir))) {
                        GString *str;
                        gchar *ident;
 
-                       if (g_str_has_suffix(file, ".config") == FALSE)
+                       if (!g_str_has_suffix(file, ".config"))
                                continue;
 
                        ident = g_strrstr(file, ".config");
-                       if (ident == NULL)
+                       if (!ident)
                                continue;
 
                        str = g_string_new_len(file, ident - file);
-                       if (str == NULL)
+                       if (!str)
                                continue;
 
                        ident = g_string_free(str, FALSE);
 
-                       if (validate_ident(ident) == TRUE) {
+                       if (validate_ident(ident)) {
                                struct vpn_config *config;
 
                                config = create_config(ident);
-                               if (config != NULL)
+                               if (config)
                                        load_config(config, path, ADD);
                        } else {
                                connman_error("Invalid config ident %s", ident);
@@ -464,19 +464,19 @@ static void config_notify_handler(struct inotify_event *event,
 {
        char *ext;
 
-       if (ident == NULL)
+       if (!ident)
                return;
 
-       if (g_str_has_suffix(ident, ".config") == FALSE)
+       if (!g_str_has_suffix(ident, ".config"))
                return;
 
        ext = g_strrstr(ident, ".config");
-       if (ext == NULL)
+       if (!ext)
                return;
 
        *ext = '\0';
 
-       if (validate_ident(ident) == FALSE) {
+       if (!validate_ident(ident)) {
                connman_error("Invalid config ident %s", ident);
                return;
        }
@@ -494,7 +494,7 @@ static void config_notify_handler(struct inotify_event *event,
                char *path = get_dir();
 
                config = g_hash_table_lookup(config_table, ident);
-               if (config != NULL) {
+               if (config) {
                        g_hash_table_remove_all(config->provider_table);
                        load_config(config, path, REMOVE);
 
@@ -510,7 +510,7 @@ static void config_notify_handler(struct inotify_event *event,
                         * one in order to avoid create/remove/create loop
                         */
                        config = create_config(ident);
-                       if (config != NULL)
+                       if (config)
                                load_config(config, path, ADD);
                }
 
@@ -540,7 +540,7 @@ void __vpn_config_cleanup(void)
 
        DBG("");
 
-       cleanup = TRUE;
+       cleanup = true;
 
        connman_inotify_unregister(dir, config_notify_handler);
 
@@ -549,5 +549,33 @@ void __vpn_config_cleanup(void)
        g_hash_table_destroy(config_table);
        config_table = NULL;
 
-       cleanup = FALSE;
+       cleanup = false;
+}
+
+char *__vpn_config_get_string(GKeyFile *key_file,
+       const char *group_name, const char *key, GError **error)
+{
+       char *str = g_key_file_get_string(key_file, group_name, key, error);
+       if (!str)
+               return NULL;
+
+       return g_strchomp(str);
+}
+
+char **__vpn_config_get_string_list(GKeyFile *key_file,
+       const char *group_name, const char *key, gsize *length, GError **error)
+{
+       char **p;
+       char **strlist = g_key_file_get_string_list(key_file, group_name, key,
+               length, error);
+       if (!strlist)
+               return NULL;
+
+       p = strlist;
+       while (*p) {
+               *p = g_strstrip(*p);
+               p++;
+       }
+
+       return strlist;
 }
index 7e1d77e..c3e6145 100644 (file)
@@ -47,7 +47,7 @@ struct vpn_ipconfig {
        int refcount;
        int index;
        int family;
-       connman_bool_t enabled;
+       bool enabled;
        struct connman_ipaddress *address;
        struct connman_ipaddress *system;
 };
@@ -75,7 +75,7 @@ unsigned char __vpn_ipconfig_netmask_prefix_len(const char *netmask)
        in_addr_t mask;
        in_addr_t host;
 
-       if (netmask == NULL)
+       if (!netmask)
                return 32;
 
        mask = inet_network(netmask);
@@ -94,7 +94,7 @@ unsigned char __vpn_ipconfig_netmask_prefix_len(const char *netmask)
 
 const char *__vpn_ipconfig_get_peer(struct vpn_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->peer;
@@ -105,7 +105,7 @@ unsigned short __vpn_ipconfig_get_type_from_index(int index)
        struct vpn_ipdevice *ipdevice;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return ARPHRD_VOID;
 
        return ipdevice->type;
@@ -116,7 +116,7 @@ unsigned int __vpn_ipconfig_get_flags_from_index(int index)
        struct vpn_ipdevice *ipdevice;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return 0;
 
        return ipdevice->flags;
@@ -128,7 +128,7 @@ void __vpn_ipconfig_foreach(void (*function) (int index,
        GList *list, *keys;
 
        keys = g_hash_table_get_keys(ipdevice_hash);
-       if (keys == NULL)
+       if (!keys)
                return;
 
        for (list = g_list_first(keys); list; list = g_list_next(list)) {
@@ -143,7 +143,7 @@ void __vpn_ipconfig_foreach(void (*function) (int index,
 void __vpn_ipconfig_set_local(struct vpn_ipconfig *ipconfig,
                                                        const char *address)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        g_free(ipconfig->address->local);
@@ -152,7 +152,7 @@ void __vpn_ipconfig_set_local(struct vpn_ipconfig *ipconfig,
 
 const char *__vpn_ipconfig_get_local(struct vpn_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->local;
@@ -161,7 +161,7 @@ const char *__vpn_ipconfig_get_local(struct vpn_ipconfig *ipconfig)
 void __vpn_ipconfig_set_peer(struct vpn_ipconfig *ipconfig,
                                                        const char *address)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        g_free(ipconfig->address->peer);
@@ -171,7 +171,7 @@ void __vpn_ipconfig_set_peer(struct vpn_ipconfig *ipconfig,
 void __vpn_ipconfig_set_broadcast(struct vpn_ipconfig *ipconfig,
                                        const char *broadcast)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        g_free(ipconfig->address->broadcast);
@@ -183,7 +183,7 @@ void __vpn_ipconfig_set_gateway(struct vpn_ipconfig *ipconfig,
 {
        DBG("");
 
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
        g_free(ipconfig->address->gateway);
        ipconfig->address->gateway = g_strdup(gateway);
@@ -192,7 +192,7 @@ void __vpn_ipconfig_set_gateway(struct vpn_ipconfig *ipconfig,
 const char *
 __vpn_ipconfig_get_gateway(struct vpn_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return NULL;
 
        return ipconfig->address->gateway;
@@ -201,7 +201,7 @@ __vpn_ipconfig_get_gateway(struct vpn_ipconfig *ipconfig)
 void __vpn_ipconfig_set_prefixlen(struct vpn_ipconfig *ipconfig,
                                        unsigned char prefixlen)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return;
 
        ipconfig->address->prefixlen = prefixlen;
@@ -210,7 +210,7 @@ void __vpn_ipconfig_set_prefixlen(struct vpn_ipconfig *ipconfig,
 unsigned char
 __vpn_ipconfig_get_prefixlen(struct vpn_ipconfig *ipconfig)
 {
-       if (ipconfig->address == NULL)
+       if (!ipconfig->address)
                return 0;
 
        return ipconfig->address->prefixlen;
@@ -220,7 +220,7 @@ int __vpn_ipconfig_address_add(struct vpn_ipconfig *ipconfig, int family)
 {
        DBG("ipconfig %p family %d", ipconfig, family);
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -EINVAL;
 
        if (family == AF_INET)
@@ -237,7 +237,7 @@ int __vpn_ipconfig_gateway_add(struct vpn_ipconfig *ipconfig, int family)
 {
        DBG("ipconfig %p family %d", ipconfig, family);
 
-       if (ipconfig == NULL || ipconfig->address == NULL)
+       if (!ipconfig || !ipconfig->address)
                return -EINVAL;
 
        DBG("family %d gw %s peer %s", family,
@@ -260,7 +260,7 @@ int __vpn_ipconfig_gateway_add(struct vpn_ipconfig *ipconfig, int family)
 void __vpn_ipconfig_unref_debug(struct vpn_ipconfig *ipconfig,
                                const char *file, int line, const char *caller)
 {
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return;
 
        DBG("%p ref %d by %s:%d:%s()", ipconfig, ipconfig->refcount - 1,
@@ -281,17 +281,17 @@ static struct vpn_ipconfig *create_ipv6config(int index)
        DBG("index %d", index);
 
        ipv6config = g_try_new0(struct vpn_ipconfig, 1);
-       if (ipv6config == NULL)
+       if (!ipv6config)
                return NULL;
 
        ipv6config->refcount = 1;
 
        ipv6config->index = index;
-       ipv6config->enabled = FALSE;
+       ipv6config->enabled = false;
        ipv6config->family = AF_INET6;
 
        ipv6config->address = connman_ipaddress_alloc(AF_INET6);
-       if (ipv6config->address == NULL) {
+       if (!ipv6config->address) {
                g_free(ipv6config);
                return NULL;
        }
@@ -313,17 +313,17 @@ struct vpn_ipconfig *__vpn_ipconfig_create(int index, int family)
        DBG("index %d", index);
 
        ipconfig = g_try_new0(struct vpn_ipconfig, 1);
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return NULL;
 
        ipconfig->refcount = 1;
 
        ipconfig->index = index;
-       ipconfig->enabled = FALSE;
+       ipconfig->enabled = false;
        ipconfig->family = family;
 
        ipconfig->address = connman_ipaddress_alloc(AF_INET);
-       if (ipconfig->address == NULL) {
+       if (!ipconfig->address) {
                g_free(ipconfig);
                return NULL;
        }
@@ -371,11 +371,11 @@ void __vpn_ipconfig_newlink(int index, unsigned short type,
                return;
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice != NULL)
+       if (ipdevice)
                goto update;
 
        ipdevice = g_try_new0(struct vpn_ipdevice, 1);
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
        ipdevice->index = index;
@@ -398,7 +398,7 @@ update:
        ipdevice->flags = flags;
 
        str = g_string_new(NULL);
-       if (str == NULL)
+       if (!str)
                return;
 
        if (flags & IFF_UP)
@@ -425,7 +425,7 @@ void __vpn_ipconfig_dellink(int index, struct rtnl_link_stats *stats)
        DBG("index %d", index);
 
        ipdevice = g_hash_table_lookup(ipdevice_hash, GINT_TO_POINTER(index));
-       if (ipdevice == NULL)
+       if (!ipdevice)
                return;
 
        g_hash_table_remove(ipdevice_hash, GINT_TO_POINTER(index));
index 1ba745b..021d625 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -82,8 +82,8 @@ static DBusMessage *get_connections(DBusConnection *conn, DBusMessage *msg,
        DBG("conn %p", conn);
 
        reply = __vpn_provider_get_connections(msg);
-       if (reply == NULL)
-               return __connman_error_failed(msg, -EINVAL);
+       if (!reply)
+               return __connman_error_failed(msg, EINVAL);
 
        return reply;
 }
@@ -162,7 +162,7 @@ int __vpn_manager_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        g_dbus_register_interface(connection, VPN_MANAGER_PATH,
@@ -179,7 +179,7 @@ void __vpn_manager_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        g_dbus_unregister_interface(connection, VPN_MANAGER_PATH,
index 513d926..c39ebf9 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -42,7 +42,7 @@ static DBusConnection *connection;
 static GHashTable *provider_hash;
 static GSList *driver_list;
 static int configuration_count;
-static gboolean handle_routes;
+static bool handle_routes;
 
 struct vpn_route {
        int family;
@@ -52,8 +52,8 @@ struct vpn_route {
 };
 
 struct vpn_setting {
-       gboolean hide_value;
-       gboolean immutable;
+       bool hide_value;
+       bool immutable;
        char *value;
 };
 
@@ -83,7 +83,7 @@ struct vpn_provider {
        guint notify_id;
        char *config_file;
        char *config_entry;
-       connman_bool_t immutable;
+       bool immutable;
 };
 
 static void append_properties(DBusMessageIter *iter,
@@ -116,7 +116,7 @@ static void append_route(DBusMessageIter *iter, void *user_data)
 
        connman_dbus_dict_open(iter, &item);
 
-       if (route == NULL)
+       if (!route)
                goto empty_dict;
 
        if (route->family == AF_INET)
@@ -128,15 +128,15 @@ static void append_route(DBusMessageIter *iter, void *user_data)
                connman_dbus_dict_append_basic(&item, "ProtocolFamily",
                                        DBUS_TYPE_INT32, &family);
 
-       if (route->network != NULL)
+       if (route->network)
                connman_dbus_dict_append_basic(&item, "Network",
                                        DBUS_TYPE_STRING, &route->network);
 
-       if (route->netmask != NULL)
+       if (route->netmask)
                connman_dbus_dict_append_basic(&item, "Netmask",
                                        DBUS_TYPE_STRING, &route->netmask);
 
-       if (route->gateway != NULL)
+       if (route->gateway)
                connman_dbus_dict_append_basic(&item, "Gateway",
                                        DBUS_TYPE_STRING, &route->gateway);
 
@@ -150,14 +150,14 @@ static void append_routes(DBusMessageIter *iter, void *user_data)
        GHashTableIter hash;
        gpointer value, key;
 
-       if (routes == NULL) {
+       if (!routes) {
                append_route(iter, NULL);
                return;
        }
 
        g_hash_table_iter_init(&hash, routes);
 
-       while (g_hash_table_iter_next(&hash, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&hash, &key, &value)) {
                DBusMessageIter dict;
 
                dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL,
@@ -211,14 +211,17 @@ static GSList *read_route_dict(GSList *routes, DBusMessageIter *dicts)
                type = dbus_message_iter_get_arg_type(&value);
 
                switch (type) {
-               case DBUS_TYPE_STRING:
-                       if (g_str_equal(key, "ProtocolFamily") == TRUE)
+               case DBUS_TYPE_INT32:
+                       if (g_str_equal(key, "ProtocolFamily"))
                                dbus_message_iter_get_basic(&value, &family);
-                       else if (g_str_equal(key, "Network") == TRUE)
+                       break;
+
+               case DBUS_TYPE_STRING:
+                       if (g_str_equal(key, "Network"))
                                dbus_message_iter_get_basic(&value, &network);
-                       else if (g_str_equal(key, "Netmask") == TRUE)
+                       else if (g_str_equal(key, "Netmask"))
                                dbus_message_iter_get_basic(&value, &netmask);
-                       else if (g_str_equal(key, "Gateway") == TRUE)
+                       else if (g_str_equal(key, "Gateway"))
                                dbus_message_iter_get_basic(&value, &gateway);
                        break;
                }
@@ -229,13 +232,13 @@ static GSList *read_route_dict(GSList *routes, DBusMessageIter *dicts)
        DBG("family %d network %s netmask %s gateway %s", family,
                network, netmask, gateway);
 
-       if (network == NULL || netmask == NULL) {
+       if (!network || !netmask) {
                DBG("Ignoring route as network/netmask is missing");
                return routes;
        }
 
        route = g_try_new(struct vpn_route, 1);
-       if (route == NULL) {
+       if (!route) {
                g_slist_free_full(routes, free_route);
                return NULL;
        }
@@ -307,7 +310,7 @@ static void set_user_networks(struct vpn_provider *provider, GSList *networks)
 {
        GSList *list;
 
-       for (list = networks; list != NULL; list = g_slist_next(list)) {
+       for (list = networks; list; list = g_slist_next(list)) {
                struct vpn_route *route = list->data;
 
                if (__vpn_provider_append_user_route(provider,
@@ -323,8 +326,8 @@ static void del_routes(struct vpn_provider *provider)
        gpointer value, key;
 
        g_hash_table_iter_init(&hash, provider->user_routes);
-       while (handle_routes == TRUE && g_hash_table_iter_next(&hash,
-                                               &key, &value) == TRUE) {
+       while (handle_routes && g_hash_table_iter_next(&hash,
+                                               &key, &value)) {
                struct vpn_route *route = value;
                if (route->family == AF_INET6) {
                        unsigned char prefixlen = atoi(route->netmask);
@@ -346,7 +349,7 @@ static void send_value(const char *path, const char *key, const char *value)
        const char *empty = "";
        const char *str;
 
-       if (value != NULL)
+       if (value)
                str = value;
        else
                str = empty;
@@ -388,7 +391,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
        DBG("provider %p", provider);
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_iter_init_append(reply, &array);
@@ -408,10 +411,10 @@ static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg,
 
        DBG("conn %p", conn);
 
-       if (provider->immutable == TRUE)
+       if (provider->immutable)
                return __connman_error_not_supported(msg);
 
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -427,19 +430,19 @@ static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg,
 
        type = dbus_message_iter_get_arg_type(&value);
 
-       if (g_str_equal(name, "UserRoutes") == TRUE) {
+       if (g_str_equal(name, "UserRoutes")) {
                GSList *networks;
 
                if (type != DBUS_TYPE_ARRAY)
                        return __connman_error_invalid_arguments(msg);
 
                networks = get_user_networks(&value);
-               if (networks != NULL) {
+               if (networks) {
                        del_routes(provider);
                        provider->user_networks = networks;
                        set_user_networks(provider, provider->user_networks);
 
-                       if (handle_routes == FALSE)
+                       if (!handle_routes)
                                send_routes(provider, provider->user_routes,
                                                                "UserRoutes");
                }
@@ -461,18 +464,18 @@ static DBusMessage *clear_property(DBusConnection *conn, DBusMessage *msg,
 
        DBG("conn %p", conn);
 
-       if (provider->immutable == TRUE)
+       if (provider->immutable)
                return __connman_error_not_supported(msg);
 
        dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name,
                                                        DBUS_TYPE_INVALID);
 
-       if (g_str_equal(name, "UserRoutes") == TRUE) {
+       if (g_str_equal(name, "UserRoutes")) {
                del_routes(provider);
 
-               if (handle_routes == FALSE)
+               if (!handle_routes)
                        send_routes(provider, provider->user_routes, name);
-       } else if (vpn_provider_get_string(provider, name) != NULL) {
+       } else if (vpn_provider_get_string(provider, name)) {
                vpn_provider_set_string(provider, name, NULL);
        } else {
                return __connman_error_invalid_property(msg);
@@ -539,7 +542,7 @@ static void resolv_result(GResolvResultStatus status,
 
        DBG("status %d", status);
 
-       if (status == G_RESOLV_RESULT_STATUS_SUCCESS && results != NULL &&
+       if (status == G_RESOLV_RESULT_STATUS_SUCCESS && results &&
                                                g_strv_length(results) > 0)
                provider->host_ip = g_strdupv(results);
 
@@ -548,13 +551,13 @@ static void resolv_result(GResolvResultStatus status,
 
 static void provider_resolv_host_addr(struct vpn_provider *provider)
 {
-       if (provider->host == NULL)
+       if (!provider->host)
                return;
 
        if (connman_inet_check_ipaddress(provider->host) > 0)
                return;
 
-       if (provider->host_ip != NULL)
+       if (provider->host_ip)
                return;
 
        /*
@@ -564,7 +567,7 @@ static void provider_resolv_host_addr(struct vpn_provider *provider)
         * the IP address also before VPN connection can be established.
         */
        provider->resolv = g_resolv_new(0);
-       if (provider->resolv == NULL) {
+       if (!provider->resolv) {
                DBG("Cannot resolv %s", provider->host);
                return;
        }
@@ -580,15 +583,15 @@ static void provider_resolv_host_addr(struct vpn_provider *provider)
 void __vpn_provider_append_properties(struct vpn_provider *provider,
                                                        DBusMessageIter *iter)
 {
-       if (provider->host != NULL)
+       if (provider->host)
                connman_dbus_dict_append_basic(iter, "Host",
                                        DBUS_TYPE_STRING, &provider->host);
 
-       if (provider->domain != NULL)
+       if (provider->domain)
                connman_dbus_dict_append_basic(iter, "Domain",
                                        DBUS_TYPE_STRING, &provider->domain);
 
-       if (provider->type != NULL)
+       if (provider->type)
                connman_dbus_dict_append_basic(iter, "Type", DBUS_TYPE_STRING,
                                                 &provider->type);
 }
@@ -599,15 +602,15 @@ int __vpn_provider_append_user_route(struct vpn_provider *provider,
 {
        struct vpn_route *route;
        char *key = g_strdup_printf("%d/%s/%s/%s", family, network,
-                               netmask, gateway != NULL ? gateway : "");
+                               netmask, gateway ? gateway : "");
 
        DBG("family %d network %s netmask %s gw %s", family, network,
                                                        netmask, gateway);
 
        route = g_hash_table_lookup(provider->user_routes, key);
-       if (route == NULL) {
+       if (!route) {
                route = g_try_new0(struct vpn_route, 1);
-               if (route == NULL) {
+               if (!route) {
                        connman_error("out of memory");
                        return -ENOMEM;
                }
@@ -631,23 +634,23 @@ static struct vpn_route *get_route(char *route_str)
        int family = PF_UNSPEC;
        struct vpn_route *route = NULL;
 
-       if (elems == NULL)
+       if (!elems)
                return NULL;
 
        family_str = elems[0];
 
        network = elems[1];
-       if (network == NULL || network[0] == '\0')
+       if (!network || network[0] == '\0')
                goto out;
 
        netmask = elems[2];
-       if (netmask == NULL || netmask[0] == '\0')
+       if (!netmask || netmask[0] == '\0')
                goto out;
 
        gateway = elems[3];
 
        route = g_try_new0(struct vpn_route, 1);
-       if (route == NULL)
+       if (!route)
                goto out;
 
        if (family_str[0] == '\0' || atoi(family_str) == 0) {
@@ -663,20 +666,20 @@ static struct vpn_route *get_route(char *route_str)
                }
        }
 
-       if (g_strrstr(network, ":") != NULL) {
+       if (g_strrstr(network, ":")) {
                if (family != PF_UNSPEC && family != AF_INET6)
                        DBG("You have IPv6 address but you have non IPv6 route");
-       } else if (g_strrstr(network, ".") != NULL) {
+       } else if (g_strrstr(network, ".")) {
                if (family != PF_UNSPEC && family != AF_INET)
                        DBG("You have IPv4 address but you have non IPv4 route");
 
-               if (g_strrstr(netmask, ".") == NULL) {
+               if (!g_strrstr(netmask, ".")) {
                        /* We have netmask length */
                        in_addr_t addr;
                        struct in_addr netmask_in;
                        unsigned char prefix_len = 32;
 
-                       if (netmask != NULL) {
+                       if (netmask) {
                                char *ptr;
                                long int value = strtol(netmask, &ptr, 10);
                                if (ptr != netmask && *ptr == '\0' &&
@@ -714,9 +717,9 @@ static GSList *get_routes(gchar **networks)
        GSList *routes = NULL;
        int i;
 
-       for (i = 0; networks[i] != NULL; i++) {
+       for (i = 0; networks[i]; i++) {
                route = get_route(networks[i]);
-               if (route != NULL)
+               if (route)
                        routes = g_slist_prepend(routes, route);
        }
 
@@ -734,16 +737,16 @@ static int provider_load_from_keyfile(struct vpn_provider *provider,
 
        settings = g_key_file_get_keys(keyfile, provider->identifier, &length,
                                NULL);
-       if (settings == NULL) {
+       if (!settings) {
                g_key_file_free(keyfile);
                return -ENOENT;
        }
 
        while (idx < length) {
                key = settings[idx];
-               if (key != NULL) {
-                       if (g_str_equal(key, "Networks") == TRUE) {
-                               networks = g_key_file_get_string_list(keyfile,
+               if (key) {
+                       if (g_str_equal(key, "Networks")) {
+                               networks = __vpn_config_get_string_list(keyfile,
                                                provider->identifier,
                                                key,
                                                &num_user_networks,
@@ -751,7 +754,7 @@ static int provider_load_from_keyfile(struct vpn_provider *provider,
                                provider->user_networks = get_routes(networks);
 
                        } else {
-                               value = g_key_file_get_string(keyfile,
+                               value = __vpn_config_get_string(keyfile,
                                                        provider->identifier,
                                                        key, NULL);
                                vpn_provider_set_string(provider, key,
@@ -764,7 +767,7 @@ static int provider_load_from_keyfile(struct vpn_provider *provider,
        g_strfreev(settings);
        g_strfreev(networks);
 
-       if (provider->user_networks != NULL)
+       if (provider->user_networks)
                set_user_networks(provider, provider->user_networks);
 
        return 0;
@@ -778,7 +781,7 @@ static int vpn_provider_load(struct vpn_provider *provider)
        DBG("provider %p", provider);
 
        keyfile = __connman_storage_load_provider(provider->identifier);
-       if (keyfile == NULL)
+       if (!keyfile)
                return -ENOENT;
 
        provider_load_from_keyfile(provider, keyfile);
@@ -793,13 +796,13 @@ static gchar **create_network_list(GSList *networks, gsize *count)
        gchar **result = NULL;
        unsigned int num_elems = 0;
 
-       for (list = networks; list != NULL; list = g_slist_next(list)) {
+       for (list = networks; list; list = g_slist_next(list)) {
                struct vpn_route *route = list->data;
                int family;
 
                result = g_try_realloc(result,
                                (num_elems + 1) * sizeof(gchar *));
-               if (result == NULL)
+               if (!result)
                        return NULL;
 
                switch (route->family) {
@@ -816,13 +819,13 @@ static gchar **create_network_list(GSList *networks, gsize *count)
 
                result[num_elems] = g_strdup_printf("%d/%s/%s/%s",
                                family, route->network, route->netmask,
-                               route->gateway == NULL ? "" : route->gateway);
+                               !route->gateway ? "" : route->gateway);
 
                num_elems++;
        }
 
        result = g_try_realloc(result, (num_elems + 1) * sizeof(gchar *));
-       if (result == NULL)
+       if (!result)
                return NULL;
 
        result[num_elems] = NULL;
@@ -837,7 +840,7 @@ static int vpn_provider_save(struct vpn_provider *provider)
        DBG("provider %p immutable %s", provider,
                                        provider->immutable ? "yes" : "no");
 
-       if (provider->immutable == TRUE) {
+       if (provider->immutable) {
                /*
                 * Do not save providers that are provisioned via .config
                 * file.
@@ -846,7 +849,7 @@ static int vpn_provider_save(struct vpn_provider *provider)
        }
 
        keyfile = g_key_file_new();
-       if (keyfile == NULL)
+       if (!keyfile)
                return -ENOMEM;
 
        g_key_file_set_string(keyfile, provider->identifier,
@@ -857,13 +860,13 @@ static int vpn_provider_save(struct vpn_provider *provider)
                        "Host", provider->host);
        g_key_file_set_string(keyfile, provider->identifier,
                        "VPN.Domain", provider->domain);
-       if (provider->user_networks != NULL) {
+       if (provider->user_networks) {
                gchar **networks;
                gsize network_count;
 
                networks = create_network_list(provider->user_networks,
                                                        &network_count);
-               if (networks != NULL) {
+               if (networks) {
                        g_key_file_set_string_list(keyfile,
                                                provider->identifier,
                                                "Networks",
@@ -873,20 +876,20 @@ static int vpn_provider_save(struct vpn_provider *provider)
                }
        }
 
-       if (provider->config_file != NULL && strlen(provider->config_file) > 0)
+       if (provider->config_file && strlen(provider->config_file) > 0)
                g_key_file_set_string(keyfile, provider->identifier,
                                "Config.file", provider->config_file);
 
-       if (provider->config_entry != NULL &&
+       if (provider->config_entry &&
                                        strlen(provider->config_entry) > 0)
                g_key_file_set_string(keyfile, provider->identifier,
                                "Config.ident", provider->config_entry);
 
-       if (provider->driver != NULL && provider->driver->save != NULL)
+       if (provider->driver && provider->driver->save)
                provider->driver->save(provider, keyfile);
 
        __connman_storage_save_provider(keyfile, provider->identifier);
-        g_key_file_free(keyfile);
+       g_key_file_free(keyfile);
 
        return 0;
 }
@@ -900,13 +903,13 @@ struct vpn_provider *__vpn_provider_lookup(const char *identifier)
        return provider;
 }
 
-static gboolean match_driver(struct vpn_provider *provider,
+static bool match_driver(struct vpn_provider *provider,
                                struct vpn_provider_driver *driver)
 {
        if (g_strcmp0(driver->name, provider->type) == 0)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 static int provider_probe(struct vpn_provider *provider)
@@ -916,24 +919,24 @@ static int provider_probe(struct vpn_provider *provider)
        DBG("provider %p driver %p name %s", provider, provider->driver,
                                                provider->name);
 
-       if (provider->driver != NULL)
+       if (provider->driver)
                return -EALREADY;
 
        for (list = driver_list; list; list = list->next) {
                struct vpn_provider_driver *driver = list->data;
 
-               if (match_driver(provider, driver) == FALSE)
+               if (!match_driver(provider, driver))
                        continue;
 
                DBG("driver %p name %s", driver, driver->name);
 
-               if (driver->probe != NULL && driver->probe(provider) == 0) {
+               if (driver->probe && driver->probe(provider) == 0) {
                        provider->driver = driver;
                        break;
                }
        }
 
-       if (provider->driver == NULL)
+       if (!provider->driver)
                return -ENODEV;
 
        return 0;
@@ -941,7 +944,7 @@ static int provider_probe(struct vpn_provider *provider)
 
 static void provider_remove(struct vpn_provider *provider)
 {
-       if (provider->driver != NULL) {
+       if (provider->driver) {
                provider->driver->remove(provider);
                provider->driver = NULL;
        }
@@ -987,7 +990,7 @@ static void provider_destruct(struct vpn_provider *provider)
        g_hash_table_destroy(provider->routes);
        g_hash_table_destroy(provider->user_routes);
        g_hash_table_destroy(provider->setting_strings);
-       if (provider->resolv != NULL) {
+       if (provider->resolv) {
                g_resolv_unref(provider->resolv);
                provider->resolv = NULL;
        }
@@ -1035,7 +1038,7 @@ int __vpn_provider_disconnect(struct vpn_provider *provider)
 
        DBG("provider %p", provider);
 
-       if (provider->driver != NULL && provider->driver->disconnect != NULL)
+       if (provider->driver && provider->driver->disconnect)
                err = provider->driver->disconnect(provider);
        else
                return -EOPNOTSUPP;
@@ -1055,7 +1058,7 @@ static void connect_cb(struct vpn_provider *provider, void *user_data,
 
        if (error != 0) {
                DBusMessage *reply = __connman_error_failed(pending, error);
-               if (reply != NULL)
+               if (reply)
                        g_dbus_send_message(connection, reply);
 
                vpn_provider_indicate_error(provider,
@@ -1073,9 +1076,11 @@ int __vpn_provider_connect(struct vpn_provider *provider, DBusMessage *msg)
 
        DBG("provider %p", provider);
 
-       if (provider->driver != NULL && provider->driver->connect != NULL) {
+       if (provider->driver && provider->driver->connect) {
                dbus_message_ref(msg);
-               err = provider->driver->connect(provider, connect_cb, msg);
+               err = provider->driver->connect(provider, connect_cb,
+                                               dbus_message_get_sender(msg),
+                                               msg);
        } else
                return -EOPNOTSUPP;
 
@@ -1092,7 +1097,7 @@ static void connection_removed_signal(struct vpn_provider *provider)
 
        signal = dbus_message_new_signal(VPN_MANAGER_PATH,
                        VPN_MANAGER_INTERFACE, "ConnectionRemoved");
-       if (signal == NULL)
+       if (!signal)
                return;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -1110,7 +1115,7 @@ static char *get_ident(const char *path)
                return NULL;
 
        pos = strrchr(path, '/');
-       if (pos == NULL)
+       if (!pos)
                return NULL;
 
        return pos + 1;
@@ -1126,7 +1131,7 @@ int __vpn_provider_remove(const char *path)
        ident = get_ident(path);
 
        provider = __vpn_provider_lookup(ident);
-       if (provider != NULL)
+       if (provider)
                return __vpn_provider_delete(provider);
 
        return -ENXIO;
@@ -1153,7 +1158,7 @@ static void append_ipv4(DBusMessageIter *iter, void *user_data)
        const char *address, *gateway, *peer;
 
        address = __vpn_ipconfig_get_local(provider->ipconfig_ipv4);
-       if (address != NULL) {
+       if (address) {
                in_addr_t addr;
                struct in_addr netmask;
                char *mask;
@@ -1174,12 +1179,12 @@ static void append_ipv4(DBusMessageIter *iter, void *user_data)
        }
 
        gateway = __vpn_ipconfig_get_gateway(provider->ipconfig_ipv4);
-       if (gateway != NULL)
+       if (gateway)
                connman_dbus_dict_append_basic(iter, "Gateway",
                                                DBUS_TYPE_STRING, &gateway);
 
        peer = __vpn_ipconfig_get_peer(provider->ipconfig_ipv4);
-       if (peer != NULL)
+       if (peer)
                connman_dbus_dict_append_basic(iter, "Peer",
                                                DBUS_TYPE_STRING, &peer);
 }
@@ -1190,7 +1195,7 @@ static void append_ipv6(DBusMessageIter *iter, void *user_data)
        const char *address, *gateway, *peer;
 
        address = __vpn_ipconfig_get_local(provider->ipconfig_ipv6);
-       if (address != NULL) {
+       if (address) {
                unsigned char prefixlen;
 
                connman_dbus_dict_append_basic(iter, "Address",
@@ -1204,12 +1209,12 @@ static void append_ipv6(DBusMessageIter *iter, void *user_data)
        }
 
        gateway = __vpn_ipconfig_get_gateway(provider->ipconfig_ipv6);
-       if (gateway != NULL)
+       if (gateway)
                connman_dbus_dict_append_basic(iter, "Gateway",
                                                DBUS_TYPE_STRING, &gateway);
 
        peer = __vpn_ipconfig_get_peer(provider->ipconfig_ipv6);
-       if (peer != NULL)
+       if (peer)
                connman_dbus_dict_append_basic(iter, "Peer",
                                                DBUS_TYPE_STRING, &peer);
 }
@@ -1240,7 +1245,7 @@ static void append_nameservers(DBusMessageIter *iter, char **servers)
 
        DBG("%p", servers);
 
-       for (i = 0; servers[i] != NULL; i++) {
+       for (i = 0; servers[i]; i++) {
                DBG("servers[%d] %s", i, servers[i]);
                dbus_message_iter_append_basic(iter,
                                        DBUS_TYPE_STRING, &servers[i]);
@@ -1251,7 +1256,7 @@ static void append_dns(DBusMessageIter *iter, void *user_data)
 {
        struct vpn_provider *provider = user_data;
 
-       if (provider->nameservers != NULL)
+       if (provider->nameservers)
                append_nameservers(iter, provider->nameservers);
 }
 
@@ -1263,7 +1268,7 @@ static int provider_indicate_state(struct vpn_provider *provider,
 
        str = state2string(state);
        DBG("provider %p state %s/%d", provider, str, state);
-       if (str == NULL)
+       if (!str)
                return -EINVAL;
 
        old_state = provider->state;
@@ -1289,7 +1294,7 @@ static int provider_indicate_state(struct vpn_provider *provider,
                                                DBUS_TYPE_STRING,
                                                append_dns, provider);
 
-               if (provider->domain != NULL)
+               if (provider->domain)
                        connman_dbus_property_changed_basic(provider->path,
                                                VPN_CONNECTION_INTERFACE,
                                                "Domain",
@@ -1346,31 +1351,33 @@ static void append_properties(DBusMessageIter *iter,
        DBusMessageIter dict;
        GHashTableIter hash;
        gpointer value, key;
+       dbus_bool_t immutable;
 
        connman_dbus_dict_open(iter, &dict);
 
        append_state(&dict, provider);
 
-       if (provider->type != NULL)
+       if (provider->type)
                connman_dbus_dict_append_basic(&dict, "Type",
                                        DBUS_TYPE_STRING, &provider->type);
 
-       if (provider->name != NULL)
+       if (provider->name)
                connman_dbus_dict_append_basic(&dict, "Name",
                                        DBUS_TYPE_STRING, &provider->name);
 
-       if (provider->host != NULL)
+       if (provider->host)
                connman_dbus_dict_append_basic(&dict, "Host",
                                        DBUS_TYPE_STRING, &provider->host);
        if (provider->index >= 0)
                connman_dbus_dict_append_basic(&dict, "Index",
                                        DBUS_TYPE_INT32, &provider->index);
-       if (provider->domain != NULL)
+       if (provider->domain)
                connman_dbus_dict_append_basic(&dict, "Domain",
                                        DBUS_TYPE_STRING, &provider->domain);
 
+       immutable = provider->immutable;
        connman_dbus_dict_append_basic(&dict, "Immutable", DBUS_TYPE_BOOLEAN,
-                                       &provider->immutable);
+                                       &immutable);
 
        if (provider->family == AF_INET)
                connman_dbus_dict_append_dict(&dict, "IPv4", append_ipv4,
@@ -1390,14 +1397,14 @@ static void append_properties(DBusMessageIter *iter,
                                DBUS_TYPE_DICT_ENTRY, append_routes,
                                provider->routes);
 
-       if (provider->setting_strings != NULL) {
+       if (provider->setting_strings) {
                g_hash_table_iter_init(&hash, provider->setting_strings);
 
-               while (g_hash_table_iter_next(&hash, &key, &value) == TRUE) {
+               while (g_hash_table_iter_next(&hash, &key, &value)) {
                        struct vpn_setting *setting = value;
 
-                       if (setting->hide_value == FALSE &&
-                                                       setting->value != NULL)
+                       if (!setting->hide_value &&
+                                                       setting->value)
                                connman_dbus_dict_append_basic(&dict, key,
                                                        DBUS_TYPE_STRING,
                                                        &setting->value);
@@ -1414,7 +1421,7 @@ static void connection_added_signal(struct vpn_provider *provider)
 
        signal = dbus_message_new_signal(VPN_MANAGER_PATH,
                        VPN_MANAGER_INTERFACE, "ConnectionAdded");
-       if (signal == NULL)
+       if (!signal)
                return;
 
        dbus_message_iter_init_append(signal, &iter);
@@ -1426,19 +1433,19 @@ static void connection_added_signal(struct vpn_provider *provider)
        dbus_message_unref(signal);
 }
 
-static connman_bool_t check_host(char **hosts, char *host)
+static bool check_host(char **hosts, char *host)
 {
        int i;
 
-       if (hosts == NULL)
-               return FALSE;
+       if (!hosts)
+               return false;
 
-       for (i = 0; hosts[i] != NULL; i++) {
+       for (i = 0; hosts[i]; i++) {
                if (g_strcmp0(hosts[i], host) == 0)
-                       return TRUE;
+                       return true;
        }
 
-       return FALSE;
+       return false;
 }
 
 static void provider_append_routes(gpointer key, gpointer value,
@@ -1448,7 +1455,7 @@ static void provider_append_routes(gpointer key, gpointer value,
        struct vpn_provider *provider = user_data;
        int index = provider->index;
 
-       if (handle_routes == FALSE)
+       if (!handle_routes)
                return;
 
        /*
@@ -1456,7 +1463,7 @@ static void provider_append_routes(gpointer key, gpointer value,
         * VPN server, then we must discard that because the
         * server cannot be contacted via VPN tunnel.
         */
-       if (check_host(provider->host_ip, route->network) == TRUE) {
+       if (check_host(provider->host_ip, route->network)) {
                DBG("Discarding VPN route to %s via %s at index %d",
                        route->network, route->gateway, index);
                return;
@@ -1476,14 +1483,14 @@ static void provider_append_routes(gpointer key, gpointer value,
 }
 
 static int set_connected(struct vpn_provider *provider,
-                                       connman_bool_t connected)
+                                       bool connected)
 {
        struct vpn_ipconfig *ipconfig;
 
        DBG("provider %p id %s connected %d", provider,
                                        provider->identifier, connected);
 
-       if (connected == TRUE) {
+       if (connected) {
                if (provider->family == AF_INET6)
                        ipconfig = provider->ipconfig_ipv6;
                else
@@ -1491,7 +1498,7 @@ static int set_connected(struct vpn_provider *provider,
 
                __vpn_ipconfig_address_add(ipconfig, provider->family);
 
-               if (handle_routes == TRUE)
+               if (handle_routes)
                        __vpn_ipconfig_gateway_add(ipconfig, provider->family);
 
                provider_indicate_state(provider,
@@ -1517,18 +1524,18 @@ static int set_connected(struct vpn_provider *provider,
 int vpn_provider_set_state(struct vpn_provider *provider,
                                        enum vpn_provider_state state)
 {
-       if (provider == NULL)
+       if (!provider)
                return -EINVAL;
 
        switch (state) {
        case VPN_PROVIDER_STATE_UNKNOWN:
                return -EINVAL;
        case VPN_PROVIDER_STATE_IDLE:
-               return set_connected(provider, FALSE);
+               return set_connected(provider, false);
        case VPN_PROVIDER_STATE_CONNECT:
                return provider_indicate_state(provider, state);
        case VPN_PROVIDER_STATE_READY:
-               return set_connected(provider, TRUE);
+               return set_connected(provider, true);
        case VPN_PROVIDER_STATE_DISCONNECT:
                return provider_indicate_state(provider, state);
        case VPN_PROVIDER_STATE_FAILURE:
@@ -1562,7 +1569,7 @@ static int connection_unregister(struct vpn_provider *provider)
 {
        DBG("provider %p path %s", provider, provider->path);
 
-       if (provider->path == NULL)
+       if (!provider->path)
                return -EALREADY;
 
        g_dbus_unregister_interface(connection, provider->path,
@@ -1578,7 +1585,7 @@ static int connection_register(struct vpn_provider *provider)
 {
        DBG("provider %p path %s", provider, provider->path);
 
-       if (provider->path != NULL)
+       if (provider->path)
                return -EALREADY;
 
        provider->path = g_strdup_printf("%s/connection/%s", VPN_PATH,
@@ -1613,7 +1620,7 @@ static void provider_initialize(struct vpn_provider *provider)
        provider->type = NULL;
        provider->domain = NULL;
        provider->identifier = NULL;
-       provider->immutable = FALSE;
+       provider->immutable = false;
        provider->user_networks = NULL;
        provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
                                        NULL, free_route);
@@ -1628,7 +1635,7 @@ static struct vpn_provider *vpn_provider_new(void)
        struct vpn_provider *provider;
 
        provider = g_try_new0(struct vpn_provider, 1);
-       if (provider == NULL)
+       if (!provider)
                return NULL;
 
        provider->refcount = 1;
@@ -1644,11 +1651,11 @@ static struct vpn_provider *vpn_provider_get(const char *identifier)
        struct vpn_provider *provider;
 
        provider = g_hash_table_lookup(provider_hash, identifier);
-       if (provider != NULL)
+       if (provider)
                return provider;
 
        provider = vpn_provider_new();
-       if (provider == NULL)
+       if (!provider)
                return NULL;
 
        DBG("provider %p", provider);
@@ -1682,21 +1689,21 @@ static struct vpn_provider *provider_create_from_keyfile(GKeyFile *keyfile,
 {
        struct vpn_provider *provider;
 
-       if (keyfile == NULL || ident == NULL)
+       if (!keyfile || !ident)
                return NULL;
 
        provider = __vpn_provider_lookup(ident);
-       if (provider == NULL) {
+       if (!provider) {
                provider = vpn_provider_get(ident);
-               if (provider == NULL) {
+               if (!provider) {
                        DBG("can not create provider");
                        return NULL;
                }
 
                provider_load_from_keyfile(provider, keyfile);
 
-               if (provider->name == NULL || provider->host == NULL ||
-                               provider->domain == NULL) {
+               if (!provider->name || !provider->host ||
+                               !provider->domain) {
                        DBG("cannot get name, host or domain");
                        vpn_provider_unref(provider);
                        return NULL;
@@ -1719,10 +1726,10 @@ static void provider_create_all_from_type(const char *provider_type)
 
        providers = __connman_storage_get_providers();
 
-       if (providers == NULL)
+       if (!providers)
                return;
 
-       for (i = 0; providers[i] != NULL; i+=1) {
+       for (i = 0; providers[i]; i += 1) {
 
                if (strncmp(providers[i], "provider_", 9) != 0)
                        continue;
@@ -1730,10 +1737,10 @@ static void provider_create_all_from_type(const char *provider_type)
                id = providers[i] + 9;
                keyfile = __connman_storage_load_provider(id);
 
-               if (keyfile == NULL)
+               if (!keyfile)
                        continue;
 
-               type = g_key_file_get_string(keyfile, id, "Type", NULL);
+               type = __vpn_config_get_string(keyfile, id, "Type", NULL);
 
                DBG("keyfile %p id %s type %s", keyfile, id, type);
 
@@ -1743,7 +1750,7 @@ static void provider_create_all_from_type(const char *provider_type)
                        continue;
                }
 
-               if (provider_create_from_keyfile(keyfile, id) == NULL)
+               if (!provider_create_from_keyfile(keyfile, id))
                        DBG("could not create provider");
 
                g_free(type);
@@ -1757,7 +1764,7 @@ char *__vpn_provider_create_identifier(const char *host, const char *domain)
        char *ident;
 
        ident = g_strdup_printf("%s_%s", host, domain);
-       if (ident == NULL)
+       if (!ident)
                return NULL;
 
        provider_dbus_ident(ident);
@@ -1790,18 +1797,18 @@ int __vpn_provider_create(DBusMessage *msg)
 
                switch (dbus_message_iter_get_arg_type(&value)) {
                case DBUS_TYPE_STRING:
-                       if (g_str_equal(key, "Type") == TRUE)
+                       if (g_str_equal(key, "Type"))
                                dbus_message_iter_get_basic(&value, &type);
-                       else if (g_str_equal(key, "Name") == TRUE)
+                       else if (g_str_equal(key, "Name"))
                                dbus_message_iter_get_basic(&value, &name);
-                       else if (g_str_equal(key, "Host") == TRUE)
+                       else if (g_str_equal(key, "Host"))
                                dbus_message_iter_get_basic(&value, &host);
-                       else if (g_str_equal(key, "VPN.Domain") == TRUE ||
-                                       g_str_equal(key, "Domain") == TRUE)
+                       else if (g_str_equal(key, "VPN.Domain") ||
+                                       g_str_equal(key, "Domain"))
                                dbus_message_iter_get_basic(&value, &domain);
                        break;
                case DBUS_TYPE_ARRAY:
-                       if (g_str_equal(key, "UserRoutes") == TRUE)
+                       if (g_str_equal(key, "UserRoutes"))
                                networks = get_user_networks(&value);
                        break;
                }
@@ -1809,21 +1816,21 @@ int __vpn_provider_create(DBusMessage *msg)
                dbus_message_iter_next(&array);
        }
 
-       if (host == NULL || domain == NULL)
+       if (!host || !domain)
                return -EINVAL;
 
        DBG("Type %s name %s networks %p", type, name, networks);
 
-       if (type == NULL || name == NULL)
+       if (!type || !name)
                return -EOPNOTSUPP;
 
        ident = __vpn_provider_create_identifier(host, domain);
        DBG("ident %s", ident);
 
        provider = __vpn_provider_lookup(ident);
-       if (provider == NULL) {
+       if (!provider) {
                provider = vpn_provider_get(ident);
-               if (provider == NULL) {
+               if (!provider) {
                        DBG("can not create provider");
                        g_free(ident);
                        return -EOPNOTSUPP;
@@ -1840,7 +1847,7 @@ int __vpn_provider_create(DBusMessage *msg)
                provider_resolv_host_addr(provider);
        }
 
-       if (networks != NULL) {
+       if (networks) {
                g_slist_free_full(provider->user_networks, free_route);
                provider->user_networks = networks;
                set_user_networks(provider, provider->user_networks);
@@ -1904,25 +1911,25 @@ static GSList *parse_user_networks(const char *network_str)
        char **elems;
        int i = 0;
 
-       if (network_str == NULL)
+       if (!network_str)
                return NULL;
 
        elems = g_strsplit(network_str, ",", 0);
-       if (elems == NULL)
+       if (!elems)
                return NULL;
 
-       while (elems[i] != NULL) {
+       while (elems[i]) {
                struct vpn_route *vpn_route;
                char *network, *netmask, *gateway;
                int family;
                char **route;
 
                route = g_strsplit(elems[i], "/", 0);
-               if (route == NULL)
+               if (!route)
                        goto next;
 
                network = route[0];
-               if (network == NULL || network[0] == '\0')
+               if (!network || network[0] == '\0')
                        goto next;
 
                family = connman_inet_check_ipaddress(network);
@@ -1944,13 +1951,13 @@ static GSList *parse_user_networks(const char *network_str)
                }
 
                netmask = route[1];
-               if (netmask == NULL || netmask[0] == '\0')
+               if (!netmask || netmask[0] == '\0')
                        goto next;
 
                gateway = route[2];
 
                vpn_route = g_try_new0(struct vpn_route, 1);
-               if (vpn_route == NULL) {
+               if (!vpn_route) {
                        g_strfreev(route);
                        break;
                }
@@ -1994,14 +2001,14 @@ int __vpn_provider_create_from_config(GHashTable *settings,
        networks_str = get_string(settings, "Networks");
        networks = parse_user_networks(networks_str);
 
-       if (host == NULL || domain == NULL) {
+       if (!host || !domain) {
                err = -EINVAL;
                goto fail;
        }
 
        DBG("type %s name %s networks %s", type, name, networks_str);
 
-       if (type == NULL || name == NULL) {
+       if (!type || !name) {
                err = -EOPNOTSUPP;
                goto fail;
        }
@@ -2010,9 +2017,9 @@ int __vpn_provider_create_from_config(GHashTable *settings,
        DBG("ident %s", ident);
 
        provider = __vpn_provider_lookup(ident);
-       if (provider == NULL) {
+       if (!provider) {
                provider = vpn_provider_get(ident);
-               if (provider == NULL) {
+               if (!provider) {
                        DBG("can not create provider");
                        err = -EOPNOTSUPP;
                        goto fail;
@@ -2031,7 +2038,7 @@ int __vpn_provider_create_from_config(GHashTable *settings,
                provider_resolv_host_addr(provider);
        }
 
-       if (networks != NULL) {
+       if (networks) {
                g_slist_free_full(provider->user_networks, free_route);
                provider->user_networks = networks;
                set_user_networks(provider, provider->user_networks);
@@ -2039,10 +2046,10 @@ int __vpn_provider_create_from_config(GHashTable *settings,
 
        g_hash_table_iter_init(&hash, settings);
 
-       while (g_hash_table_iter_next(&hash, &key, &value) == TRUE)
+       while (g_hash_table_iter_next(&hash, &key, &value))
                __vpn_provider_set_string_immutable(provider, key, value);
 
-       provider->immutable = TRUE;
+       provider->immutable = true;
 
        vpn_provider_save(provider);
 
@@ -2076,12 +2083,12 @@ static void append_connection_structs(DBusMessageIter *iter, void *user_data)
 
        g_hash_table_iter_init(&hash, provider_hash);
 
-       while (g_hash_table_iter_next(&hash, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&hash, &key, &value)) {
                struct vpn_provider *provider = value;
 
                DBG("path %s", provider->path);
 
-               if (provider->identifier == NULL)
+               if (!provider->identifier)
                        continue;
 
                dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT,
@@ -2100,7 +2107,7 @@ DBusMessage *__vpn_provider_get_connections(DBusMessage *msg)
        DBG("");
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        __connman_dbus_append_objpath_dict_array(reply,
@@ -2109,9 +2116,9 @@ DBusMessage *__vpn_provider_get_connections(DBusMessage *msg)
        return reply;
 }
 
-const char * __vpn_provider_get_ident(struct vpn_provider *provider)
+const char *__vpn_provider_get_ident(struct vpn_provider *provider)
 {
-       if (provider == NULL)
+       if (!provider)
                return NULL;
 
        return provider->identifier;
@@ -2119,26 +2126,26 @@ const char * __vpn_provider_get_ident(struct vpn_provider *provider)
 
 static int set_string(struct vpn_provider *provider,
                        const char *key, const char *value,
-                       gboolean hide_value, gboolean immutable)
+                       bool hide_value, bool immutable)
 {
        DBG("provider %p key %s immutable %s value %s", provider, key,
                immutable ? "yes" : "no",
                hide_value ? "<not printed>" : value);
 
-       if (g_str_equal(key, "Type") == TRUE) {
+       if (g_str_equal(key, "Type")) {
                g_free(provider->type);
                provider->type = g_ascii_strdown(value, -1);
                send_value(provider->path, "Type", provider->type);
-       } else if (g_str_equal(key, "Name") == TRUE) {
+       } else if (g_str_equal(key, "Name")) {
                g_free(provider->name);
                provider->name = g_strdup(value);
                send_value(provider->path, "Name", provider->name);
-       } else if (g_str_equal(key, "Host") == TRUE) {
+       } else if (g_str_equal(key, "Host")) {
                g_free(provider->host);
                provider->host = g_strdup(value);
                send_value(provider->path, "Host", provider->host);
-       } else if (g_str_equal(key, "VPN.Domain") == TRUE ||
-                       g_str_equal(key, "Domain") == TRUE) {
+       } else if (g_str_equal(key, "VPN.Domain") ||
+                       g_str_equal(key, "Domain")) {
                g_free(provider->domain);
                provider->domain = g_strdup(value);
                send_value(provider->path, "Domain", provider->domain);
@@ -2146,23 +2153,23 @@ static int set_string(struct vpn_provider *provider,
                struct vpn_setting *setting;
 
                setting = g_hash_table_lookup(provider->setting_strings, key);
-               if (setting != NULL && immutable == FALSE &&
-                                               setting->immutable == TRUE) {
+               if (setting && !immutable &&
+                                               setting->immutable) {
                        DBG("Trying to set immutable variable %s", key);
                        return -EPERM;
                }
 
                setting = g_try_new0(struct vpn_setting, 1);
-               if (setting == NULL)
+               if (!setting)
                        return -ENOMEM;
 
                setting->value = g_strdup(value);
                setting->hide_value = hide_value;
 
-               if (immutable == TRUE)
-                       setting->immutable = TRUE;
+               if (immutable)
+                       setting->immutable = true;
 
-               if (hide_value == FALSE)
+               if (!hide_value)
                        send_value(provider->path, key, setting->value);
 
                g_hash_table_replace(provider->setting_strings,
@@ -2175,19 +2182,19 @@ static int set_string(struct vpn_provider *provider,
 int vpn_provider_set_string(struct vpn_provider *provider,
                                        const char *key, const char *value)
 {
-       return set_string(provider, key, value, FALSE, FALSE);
+       return set_string(provider, key, value, false, false);
 }
 
 int vpn_provider_set_string_hide_value(struct vpn_provider *provider,
                                        const char *key, const char *value)
 {
-       return set_string(provider, key, value, TRUE, FALSE);
+       return set_string(provider, key, value, true, false);
 }
 
 int __vpn_provider_set_string_immutable(struct vpn_provider *provider,
                                        const char *key, const char *value)
 {
-       return set_string(provider, key, value, FALSE, TRUE);
+       return set_string(provider, key, value, false, true);
 }
 
 const char *vpn_provider_get_string(struct vpn_provider *provider,
@@ -2197,43 +2204,43 @@ const char *vpn_provider_get_string(struct vpn_provider *provider,
 
        DBG("provider %p key %s", provider, key);
 
-       if (g_str_equal(key, "Type") == TRUE)
+       if (g_str_equal(key, "Type"))
                return provider->type;
-       else if (g_str_equal(key, "Name") == TRUE)
+       else if (g_str_equal(key, "Name"))
                return provider->name;
-       else if (g_str_equal(key, "Host") == TRUE)
+       else if (g_str_equal(key, "Host"))
                return provider->host;
-       else if (g_str_equal(key, "HostIP") == TRUE) {
-               if (provider->host_ip == NULL ||
-                               provider->host_ip[0] == NULL)
+       else if (g_str_equal(key, "HostIP")) {
+               if (!provider->host_ip ||
+                               !provider->host_ip[0])
                        return provider->host;
                else
                        return provider->host_ip[0];
-       } else if (g_str_equal(key, "VPN.Domain") == TRUE ||
-                       g_str_equal(key, "Domain") == TRUE)
+       } else if (g_str_equal(key, "VPN.Domain") ||
+                       g_str_equal(key, "Domain"))
                return provider->domain;
 
        setting = g_hash_table_lookup(provider->setting_strings, key);
-       if (setting == NULL)
+       if (!setting)
                return NULL;
 
        return setting->value;
 }
 
-connman_bool_t __vpn_provider_check_routes(struct vpn_provider *provider)
+bool __vpn_provider_check_routes(struct vpn_provider *provider)
 {
-       if (provider == NULL)
-               return FALSE;
+       if (!provider)
+               return false;
 
-       if (provider->user_routes != NULL &&
+       if (provider->user_routes &&
                        g_hash_table_size(provider->user_routes) > 0)
-               return TRUE;
+               return true;
 
-       if (provider->routes != NULL &&
+       if (provider->routes &&
                        g_hash_table_size(provider->routes) > 0)
-               return TRUE;
+               return true;
 
-       return FALSE;
+       return false;
 }
 
 void *vpn_provider_get_data(struct vpn_provider *provider)
@@ -2250,10 +2257,10 @@ void vpn_provider_set_index(struct vpn_provider *provider, int index)
 {
        DBG("index %d provider %p", index, provider);
 
-       if (provider->ipconfig_ipv4 == NULL) {
+       if (!provider->ipconfig_ipv4) {
                provider->ipconfig_ipv4 = __vpn_ipconfig_create(index,
                                                                AF_INET);
-               if (provider->ipconfig_ipv4 == NULL) {
+               if (!provider->ipconfig_ipv4) {
                        DBG("Couldnt create ipconfig for IPv4");
                        goto done;
                }
@@ -2261,10 +2268,10 @@ void vpn_provider_set_index(struct vpn_provider *provider, int index)
 
        __vpn_ipconfig_set_index(provider->ipconfig_ipv4, index);
 
-       if (provider->ipconfig_ipv6 == NULL) {
+       if (!provider->ipconfig_ipv6) {
                provider->ipconfig_ipv6 = __vpn_ipconfig_create(index,
                                                                AF_INET6);
-               if (provider->ipconfig_ipv6 == NULL) {
+               if (!provider->ipconfig_ipv6) {
                        DBG("Couldnt create ipconfig for IPv6");
                        goto done;
                }
@@ -2300,7 +2307,7 @@ int vpn_provider_set_ipaddress(struct vpn_provider *provider,
        DBG("provider %p ipconfig %p family %d", provider, ipconfig,
                                                        ipaddress->family);
 
-       if (ipconfig == NULL)
+       if (!ipconfig)
                return -EINVAL;
 
        provider->family = ipaddress->family;
@@ -2342,7 +2349,7 @@ int vpn_provider_set_nameservers(struct vpn_provider *provider,
        g_strfreev(provider->nameservers);
        provider->nameservers = NULL;
 
-       if (nameservers == NULL)
+       if (!nameservers)
                return 0;
 
        provider->nameservers = g_strsplit(nameservers, " ", 0);
@@ -2367,13 +2374,13 @@ static int route_env_parse(struct vpn_provider *provider, const char *key,
        DBG("name %s", provider->name);
 
        if (!strcmp(provider->type, "openvpn")) {
-               if (g_str_has_prefix(key, "route_network_") == TRUE) {
+               if (g_str_has_prefix(key, "route_network_")) {
                        start = key + strlen("route_network_");
                        *type = PROVIDER_ROUTE_TYPE_ADDR;
-               } else if (g_str_has_prefix(key, "route_netmask_") == TRUE) {
+               } else if (g_str_has_prefix(key, "route_netmask_")) {
                        start = key + strlen("route_netmask_");
                        *type = PROVIDER_ROUTE_TYPE_MASK;
-               } else if (g_str_has_prefix(key, "route_gateway_") == TRUE) {
+               } else if (g_str_has_prefix(key, "route_gateway_")) {
                        start = key + strlen("route_gateway_");
                        *type = PROVIDER_ROUTE_TYPE_GW;
                } else
@@ -2383,11 +2390,11 @@ static int route_env_parse(struct vpn_provider *provider, const char *key,
                *idx = g_ascii_strtoull(start, &end, 10);
 
        } else if (!strcmp(provider->type, "openconnect")) {
-               if (g_str_has_prefix(key, "CISCO_SPLIT_INC_") == TRUE) {
+               if (g_str_has_prefix(key, "CISCO_SPLIT_INC_")) {
                        *family = AF_INET;
                        start = key + strlen("CISCO_SPLIT_INC_");
                } else if (g_str_has_prefix(key,
-                                       "CISCO_IPV6_SPLIT_INC_") == TRUE) {
+                                       "CISCO_IPV6_SPLIT_INC_")) {
                        *family = AF_INET6;
                        start = key + strlen("CISCO_IPV6_SPLIT_INC_");
                } else
@@ -2426,9 +2433,9 @@ int vpn_provider_append_route(struct vpn_provider *provider,
        DBG("idx %lu family %d type %d", idx, family, type);
 
        route = g_hash_table_lookup(provider->routes, GINT_TO_POINTER(idx));
-       if (route == NULL) {
+       if (!route) {
                route = g_try_new0(struct vpn_route, 1);
-               if (route == NULL) {
+               if (!route) {
                        connman_error("out of memory");
                        return -ENOMEM;
                }
@@ -2453,9 +2460,9 @@ int vpn_provider_append_route(struct vpn_provider *provider,
                break;
        }
 
-       if (handle_routes == FALSE) {
-               if (route->netmask != NULL && route->gateway != NULL &&
-                                                       route->network != NULL)
+       if (!handle_routes) {
+               if (route->netmask && route->gateway &&
+                                                       route->network)
                        provider_schedule_changed(provider);
        }
 
@@ -2464,7 +2471,7 @@ int vpn_provider_append_route(struct vpn_provider *provider,
 
 const char *vpn_provider_get_driver_name(struct vpn_provider *provider)
 {
-       if (provider->driver == NULL)
+       if (!provider->driver)
                return NULL;
 
        return provider->driver->name;
@@ -2484,7 +2491,7 @@ static void clean_provider(gpointer key, gpointer value, gpointer user_data)
 {
        struct vpn_provider *provider = value;
 
-       if (provider->driver != NULL && provider->driver->remove)
+       if (provider->driver && provider->driver->remove)
                provider->driver->remove(provider);
 
        connection_unregister(provider);
@@ -2510,10 +2517,10 @@ void vpn_provider_driver_unregister(struct vpn_provider_driver *driver)
        driver_list = g_slist_remove(driver_list, driver);
 
        g_hash_table_iter_init(&iter, provider_hash);
-       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct vpn_provider *provider = value;
 
-               if (provider != NULL && provider->driver != NULL &&
+               if (provider && provider->driver &&
                                provider->driver->type == driver->type &&
                                g_strcmp0(provider->driver->name,
                                                        driver->name) == 0) {
@@ -2555,7 +2562,7 @@ static struct connman_agent_driver agent_driver = {
        .remove         = agent_remove,
 };
 
-static void remove_unprovisioned_providers()
+static void remove_unprovisioned_providers(void)
 {
        gchar **providers;
        GKeyFile *keyfile, *configkeyfile;
@@ -2563,30 +2570,30 @@ static void remove_unprovisioned_providers()
        int i = 0;
 
        providers = __connman_storage_get_providers();
-       if (providers == NULL)
+       if (!providers)
                return;
 
-       for (; providers[i] != NULL; i++) {
+       for (; providers[i]; i++) {
                char *group = providers[i] + sizeof("provider_") - 1;
                file = section = NULL;
                keyfile = configkeyfile = NULL;
 
                keyfile = __connman_storage_load_provider(group);
-               if (keyfile == NULL)
+               if (!keyfile)
                        continue;
 
-               file = g_key_file_get_string(keyfile, group,
+               file = __vpn_config_get_string(keyfile, group,
                                        "Config.file", NULL);
-               if (file == NULL)
+               if (!file)
                        goto next;
 
-               section = g_key_file_get_string(keyfile, group,
+               section = __vpn_config_get_string(keyfile, group,
                                        "Config.ident", NULL);
-               if (section == NULL)
+               if (!section)
                        goto next;
 
                configkeyfile = __connman_storage_load_provider_config(file);
-               if (configkeyfile == NULL) {
+               if (!configkeyfile) {
                        /*
                         * Config file is missing, remove the provisioned
                         * service.
@@ -2595,7 +2602,7 @@ static void remove_unprovisioned_providers()
                        goto next;
                }
 
-               if (g_key_file_has_group(configkeyfile, section) == FALSE)
+               if (!g_key_file_has_group(configkeyfile, section))
                        /*
                         * Config section is missing, remove the provisioned
                         * service.
@@ -2603,10 +2610,10 @@ static void remove_unprovisioned_providers()
                        __connman_storage_remove_provider(group);
 
        next:
-               if (keyfile != NULL)
+               if (keyfile)
                        g_key_file_free(keyfile);
 
-               if (configkeyfile != NULL)
+               if (configkeyfile)
                        g_key_file_free(configkeyfile);
 
                g_free(section);
@@ -2616,7 +2623,7 @@ static void remove_unprovisioned_providers()
        g_strfreev(providers);
 }
 
-int __vpn_provider_init(gboolean do_routes)
+int __vpn_provider_init(bool do_routes)
 {
        int err;
 
@@ -2644,12 +2651,12 @@ void __vpn_provider_cleanup(void)
 {
        DBG("");
 
+       connman_agent_driver_unregister(&agent_driver);
+
        g_hash_table_foreach(provider_hash, clean_provider, NULL);
 
        g_hash_table_destroy(provider_hash);
        provider_hash = NULL;
 
-       connman_agent_driver_unregister(&agent_driver);
-
        dbus_connection_unref(connection);
 }
index 5626645..22b2062 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -22,8 +22,9 @@
 #ifndef __VPN_PROVIDER_H
 #define __VPN_PROVIDER_H
 
+#include <stdbool.h>
+
 #include <glib.h>
-#include <connman/types.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -125,7 +126,8 @@ struct vpn_provider_driver {
        int (*probe) (struct vpn_provider *provider);
        int (*remove) (struct vpn_provider *provider);
        int (*connect) (struct vpn_provider *provider,
-                       vpn_provider_connect_cb_t cb, void *user_data);
+                       vpn_provider_connect_cb_t cb, const char *dbus_sender,
+                       void *user_data);
        int (*disconnect) (struct vpn_provider *provider);
        int (*save) (struct vpn_provider *provider, GKeyFile *keyfile);
 };
index 5ce14e4..a7565db 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -69,7 +69,6 @@ static guint update_timeout = 0;
 
 struct interface_data {
        int index;
-       char *name;
        char *ident;
 };
 
@@ -80,7 +79,6 @@ static void free_interface(gpointer data)
        struct interface_data *interface = data;
 
        g_free(interface->ident);
-       g_free(interface->name);
        g_free(interface);
 }
 
@@ -100,7 +98,7 @@ unsigned int vpn_rtnl_add_newlink_watch(int index,
        struct watch_data *watch;
 
        watch = g_try_new0(struct watch_data, 1);
-       if (watch == NULL)
+       if (!watch)
                return 0;
 
        watch->id = ++watch_id;
@@ -237,24 +235,24 @@ static void extract_link(struct ifinfomsg *msg, int bytes,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case IFLA_ADDRESS:
-                       if (address != NULL)
+                       if (address)
                                memcpy(address, RTA_DATA(attr), ETH_ALEN);
                        break;
                case IFLA_IFNAME:
-                       if (ifname != NULL)
+                       if (ifname)
                                *ifname = RTA_DATA(attr);
                        break;
                case IFLA_MTU:
-                       if (mtu != NULL)
+                       if (mtu)
                                *mtu = *((unsigned int *) RTA_DATA(attr));
                        break;
                case IFLA_STATS:
-                       if (stats != NULL)
+                       if (stats)
                                memcpy(stats, RTA_DATA(attr),
                                        sizeof(struct rtnl_link_stats));
                        break;
                case IFLA_OPERSTATE:
-                       if (operstate != NULL)
+                       if (operstate)
                                *operstate = *((unsigned char *) RTA_DATA(attr));
                        break;
                case IFLA_LINKMODE:
@@ -315,10 +313,9 @@ static void process_newlink(unsigned short type, int index, unsigned flags,
                                                operstate2str(operstate));
 
        interface = g_hash_table_lookup(interface_list, GINT_TO_POINTER(index));
-       if (interface == NULL) {
+       if (!interface) {
                interface = g_new0(struct interface_data, 1);
                interface->index = index;
-               interface->name = g_strdup(ifname);
                interface->ident = g_strdup(ident);
 
                g_hash_table_insert(interface_list,
@@ -387,15 +384,15 @@ static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case RTA_DST:
-                       if (dst != NULL)
+                       if (dst)
                                *dst = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case RTA_GATEWAY:
-                       if (gateway != NULL)
+                       if (gateway)
                                *gateway = *((struct in_addr *) RTA_DATA(attr));
                        break;
                case RTA_OIF:
-                       if (index != NULL)
+                       if (index)
                                *index = *((int *) RTA_DATA(attr));
                        break;
                }
@@ -412,16 +409,16 @@ static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
                                        attr = RTA_NEXT(attr, bytes)) {
                switch (attr->rta_type) {
                case RTA_DST:
-                       if (dst != NULL)
+                       if (dst)
                                *dst = *((struct in6_addr *) RTA_DATA(attr));
                        break;
                case RTA_GATEWAY:
-                       if (gateway != NULL)
+                       if (gateway)
                                *gateway =
                                        *((struct in6_addr *) RTA_DATA(attr));
                        break;
                case RTA_OIF:
-                       if (index != NULL)
+                       if (index)
                                *index = *((int *) RTA_DATA(attr));
                        break;
                }
@@ -726,20 +723,20 @@ static void rtnl_route(struct nlmsghdr *hdr)
        }
 }
 
-static connman_bool_t is_route_rtmsg(struct rtmsg *msg)
+static bool is_route_rtmsg(struct rtmsg *msg)
 {
 
        if (msg->rtm_table != RT_TABLE_MAIN)
-               return FALSE;
+               return false;
 
        if (msg->rtm_protocol != RTPROT_BOOT &&
                        msg->rtm_protocol != RTPROT_KERNEL)
-               return FALSE;
+               return false;
 
        if (msg->rtm_type != RTN_UNICAST)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
 static void rtnl_newroute(struct nlmsghdr *hdr)
@@ -859,13 +856,13 @@ static int process_response(guint32 seq)
        debug("seq %d", seq);
 
        req = find_request(seq);
-       if (req != NULL) {
+       if (req) {
                request_list = g_slist_remove(request_list, req);
                g_free(req);
        }
 
        req = g_slist_nth_data(request_list, 0);
-       if (req == NULL)
+       if (!req)
                return 0;
 
        return send_request(req);
@@ -923,8 +920,7 @@ static void rtnl_message(void *buf, size_t len)
        }
 }
 
-static gboolean netlink_event(GIOChannel *chan,
-                               GIOCondition cond, gpointer data)
+static gboolean netlink_event(GIOChannel *chan, GIOCondition cond, gpointer data)
 {
        unsigned char buf[4096];
        struct sockaddr_nl nladdr;
@@ -969,7 +965,7 @@ static int send_getlink(void)
        debug("");
 
        req = g_try_malloc0(RTNL_REQUEST_SIZE);
-       if (req == NULL)
+       if (!req)
                return -ENOMEM;
 
        req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
@@ -989,7 +985,7 @@ static int send_getaddr(void)
        debug("");
 
        req = g_try_malloc0(RTNL_REQUEST_SIZE);
-       if (req == NULL)
+       if (!req)
                return -ENOMEM;
 
        req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
@@ -1009,7 +1005,7 @@ static int send_getroute(void)
        debug("");
 
        req = g_try_malloc0(RTNL_REQUEST_SIZE);
-       if (req == NULL)
+       if (!req)
                return -ENOMEM;
 
        req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
@@ -1080,7 +1076,7 @@ unsigned int __vpn_rtnl_update_interval_remove(unsigned int interval)
 
        update_list = g_slist_remove(update_list, GINT_TO_POINTER(interval));
 
-       if (update_list != NULL)
+       if (update_list)
                min = GPOINTER_TO_UINT(g_slist_nth_data(update_list, 0));
 
        if (min > update_interval)
index 53b117d..3fca03c 100644 (file)
--- a/vpn/vpn.h
+++ b/vpn/vpn.h
@@ -2,7 +2,7 @@
  *
  *  ConnMan VPN daemon
  *
- *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012-2013  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
  *
  */
 
+#include <stdbool.h>
+
 #include <glib.h>
 
 #define VPN_API_SUBJECT_TO_CHANGE
 
 #include <connman/dbus.h>
-#include <connman/types.h>
 
 int __vpn_manager_init(void);
 void __vpn_manager_cleanup(void);
@@ -72,7 +73,7 @@ void __vpn_ipconfig_cleanup(void);
 #include "vpn-provider.h"
 
 char *__vpn_provider_create_identifier(const char *host, const char *domain);
-connman_bool_t __vpn_provider_check_routes(struct vpn_provider *provider);
+bool __vpn_provider_check_routes(struct vpn_provider *provider);
 int __vpn_provider_append_user_route(struct vpn_provider *provider,
                                int family, const char *network,
                                const char *netmask, const char *gateway);
@@ -96,7 +97,7 @@ int __vpn_provider_disconnect(struct vpn_provider *provider);
 int __vpn_provider_remove(const char *path);
 int __vpn_provider_delete(struct vpn_provider *provider);
 void __vpn_provider_cleanup(void);
-int __vpn_provider_init(gboolean handle_routes);
+int __vpn_provider_init(bool handle_routes);
 
 #include "vpn-rtnl.h"
 
@@ -111,3 +112,7 @@ int __vpn_rtnl_send(const void *buf, size_t len);
 
 int __vpn_config_init(void);
 void __vpn_config_cleanup(void);
+char *__vpn_config_get_string(GKeyFile *key_file,
+        const char *group_name, const char *key, GError **error);
+char **__vpn_config_get_string_list(GKeyFile *key_file,
+        const char *group_name, const char *key, gsize *length, GError **error);