From c39587c1c20e7f184b7db80c69b3ad6b006507de Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 24 Jun 2004 14:18:37 +0000 Subject: [PATCH] Initial revision git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- AUTHORS | 2 + ChangeLog | 0 Makefile.am | 1 + Makefile.in | 493 ++++ NEWS | 0 NetworkManager-0.1.tar.gz | Bin 0 -> 94555 bytes README | 0 aclocal.m4 | 893 +++++++ autogen.sh | 68 + configure | 4802 ++++++++++++++++++++++++++++++++++ configure.in | 23 + initscript/Makefile.am | 4 + initscript/Makefile.in | 272 ++ initscript/NetworkManager | 71 + inode.c | 124 + src/Makefile.am | 31 + src/Makefile.in | 446 ++++ src/NetworkManager.c | 688 +++++ src/NetworkManager.conf | 12 + src/NetworkManager.h | 52 + src/NetworkManagerAP.c | 289 ++ src/NetworkManagerAP.h | 63 + src/NetworkManagerDbus.c | 690 +++++ src/NetworkManagerDbus.h | 41 + src/NetworkManagerDevice.c | 837 ++++++ src/NetworkManagerDevice.h | 79 + src/NetworkManagerPolicy.c | 437 ++++ src/NetworkManagerPolicy.h | 32 + src/NetworkManagerUtils.c | 147 ++ src/NetworkManagerUtils.h | 47 + src/NetworkManagerWireless.c | 215 ++ src/NetworkManagerWireless.h | 28 + test/Makefile.am | 11 + test/Makefile.in | 366 +++ test/nmclienttest.c | 435 +++ 35 files changed, 11699 insertions(+) create mode 100644 AUTHORS create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 NetworkManager-0.1.tar.gz create mode 100644 README create mode 100644 aclocal.m4 create mode 100755 autogen.sh create mode 100755 configure create mode 100644 configure.in create mode 100644 initscript/Makefile.am create mode 100644 initscript/Makefile.in create mode 100755 initscript/NetworkManager create mode 100644 inode.c create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/NetworkManager.c create mode 100644 src/NetworkManager.conf create mode 100644 src/NetworkManager.h create mode 100644 src/NetworkManagerAP.c create mode 100644 src/NetworkManagerAP.h create mode 100644 src/NetworkManagerDbus.c create mode 100644 src/NetworkManagerDbus.h create mode 100644 src/NetworkManagerDevice.c create mode 100644 src/NetworkManagerDevice.h create mode 100644 src/NetworkManagerPolicy.c create mode 100644 src/NetworkManagerPolicy.h create mode 100644 src/NetworkManagerUtils.c create mode 100644 src/NetworkManagerUtils.h create mode 100644 src/NetworkManagerWireless.c create mode 100644 src/NetworkManagerWireless.h create mode 100644 test/Makefile.am create mode 100644 test/Makefile.in create mode 100644 test/nmclienttest.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..ec90c0413 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Dan Williams + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000..e69de29bb diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 000000000..a86a7897f --- /dev/null +++ b/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src initscript test diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 000000000..7252630f4 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,493 @@ +# Makefile.in generated by automake 1.7.9 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +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 = : +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IWLIB = @IWLIB@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +NM_CFLAGS = @NM_CFLAGS@ +NM_LIBS = @NM_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build_alias = @build_alias@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +SUBDIRS = src initscript test +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +DIST_SOURCES = + +RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ + ps-recursive install-info-recursive uninstall-info-recursive \ + all-recursive install-data-recursive install-exec-recursive \ + installdirs-recursive install-recursive uninstall-recursive \ + check-recursive installcheck-recursive +DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/configure AUTHORS \ + COPYING ChangeLog INSTALL Makefile.am NEWS aclocal.m4 configure \ + configure.in depcomp install-sh missing mkinstalldirs +DIST_SUBDIRS = $(SUBDIRS) +all: all-recursive + +.SUFFIXES: + +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe) + +$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +$(ACLOCAL_M4): configure.in + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +tags: TAGS + +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; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if (etags --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + else \ + include_option=--include; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + 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; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + 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; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = . +distdir = $(PACKAGE)-$(VERSION) + +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } + +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print + +distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -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 $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist dist-all: distdir + $(AMTAR) chof - $(distdir) | 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 + $(am__remove_distdir) + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(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 ../.. && $(mkinstalldirs) "$$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-gzip \ + && rm -f $(distdir).tar.gz \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @echo "$(distdir).tar.gz is ready for distribution" | \ + sed 'h;s/./=/g;p;x;p;x' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { 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 +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: + +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ + clean-generic clean-recursive ctags ctags-recursive dist \ + dist-all dist-gzip distcheck distclean distclean-generic \ + distclean-recursive distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am dvi-recursive info info-am \ + info-recursive install install-am install-data install-data-am \ + install-data-recursive install-exec install-exec-am \ + install-exec-recursive install-info install-info-am \ + install-info-recursive install-man install-recursive \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am installdirs-recursive maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive mostlyclean \ + mostlyclean-generic mostlyclean-recursive pdf pdf-am \ + pdf-recursive ps ps-am ps-recursive tags tags-recursive \ + uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-recursive + +# 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: diff --git a/NEWS b/NEWS new file mode 100644 index 000000000..e69de29bb diff --git a/NetworkManager-0.1.tar.gz b/NetworkManager-0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..91fd35207b275972b5263e63e690c291a6c40053 GIT binary patch literal 94555 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 P{`oH|A9agi0viJWxO|Za literal 0 HcmV?d00001 diff --git a/README b/README new file mode 100644 index 000000000..e69de29bb diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 000000000..ff15585c3 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,893 @@ +# generated automatically by aclocal 1.7.9 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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. + +# Do all the work for Automake. -*- Autoconf -*- + +# 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. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 10 + +AC_PREREQ([2.54]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# 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_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +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 + 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) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# 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([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 +]) +]) + + +# 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_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright 2002 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# 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. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.7.9])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _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], +[AC_FOREACH([_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. +# + +# Copyright 1996, 1997, 2000, 2001 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# 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 +# 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)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# 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 +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# 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 +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# 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. + +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright 2001 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# 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="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# -*- Autoconf -*- +# Copyright (C) 2003 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# 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])]) + +# serial 5 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# 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], 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'. + 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 + 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 + : > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + 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 + ;; + none) break ;; + esac + # 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. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} 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 + # (even with -Werror). So we grep stderr for any message + # that says an option was ignored. + if grep 'ignoring option' 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 builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright 1999, 2000, 2001, 2002 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; 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. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # 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 -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //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"]) +]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# 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 done +.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 +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright 1997, 2000, 2001 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 5 + +AC_PREREQ(2.52) + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +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])]) + + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN(PKG_CHECK_MODULES, [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 000000000..c20d2c91b --- /dev/null +++ b/autogen.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir +PROJECT=NetworkManager +TEST_TYPE=-d +FILE=src + +DIE=0 + +if $have_libtool ; then : ; else + echo + echo "You must have libtool 1.4 installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at http://ftp.gnu.org/gnu/libtool/" + DIE=1 +fi + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/" + DIE=1 +} + +if automake-1.7 --version < /dev/null > /dev/null 2>&1 ; then + AUTOMAKE=automake-1.7 + ACLOCAL=aclocal-1.7 +else + echo + echo "You must have automake 1.7.x installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at http://ftp.gnu.org/gnu/automake/" + DIE=1 +fi + +if test "$DIE" -eq 1; then + exit 1 +fi + +test $TEST_TYPE $FILE || { + echo "You must run this script in the top-level $PROJECT directory" + exit 1 +} + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + if test -z "$*"; then + echo "I am going to run ./configure with no arguments - if you wish " + echo "to pass any to it, please specify them on the $0 command line." + fi +fi + +$ACLOCAL -I . $ACLOCALFLAGS || exit $? +$AUTOMAKE --add-missing || exit $? +autoconf || exit $? +cd $ORIGDIR || exit $? + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + $srcdir/configure --enable-maintainer-mode $AUTOGEN_CONFIGURE_ARGS "$@" || exit $? + + echo + echo "Now type 'make' to compile $PROJECT." +fi diff --git a/configure b/configure new file mode 100755 index 000000000..12331bba7 --- /dev/null +++ b/configure @@ -0,0 +1,4802 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59 for NetworkManager 0.1. +# +# Copyright (C) 2003 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 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='NetworkManager' +PACKAGE_TARNAME='networkmanager' +PACKAGE_VERSION='0.1' +PACKAGE_STRING='NetworkManager 0.1' +PACKAGE_BUGREPORT='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP IWLIB PKG_CONFIG NM_CFLAGS NM_LIBS LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$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 ;; + + -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 ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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 ;; + + -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=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 ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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 + + +# 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 its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 NetworkManager 0.1 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --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] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_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 +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of NetworkManager 0.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +NetworkManager configure 0.1 +generated by GNU Autoconf 2.59 + +Copyright (C) 2003 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 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by NetworkManager $as_me 0.1, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >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 + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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 + + + + + + + + + + + + + + + + + + + + + + + + + + + +am__api_version="1.7" +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 + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# 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. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# 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". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}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 $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 + + # test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +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=NetworkManager + VERSION=0.1 + + +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"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + + +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* 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 -std1 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 -std1. */ +int osf4_cc_array ['\x00' == 0 ? 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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext 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 +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-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='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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'. + 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 + 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 + : > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + 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 + ;; + none) break ;; + esac + # 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. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} 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 + # (even with -Werror). So we grep stderr for any message + # that says an option was ignored. + if grep 'ignoring option' 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 +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$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 + + + + +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 +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 to if __STDC__ is defined, since + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f 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 +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$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 to if __STDC__ is defined, since + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +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 + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#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)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +if test "${ac_cv_header_iwlib_h+set}" = set; then + echo "$as_me:$LINENO: checking for iwlib.h" >&5 +echo $ECHO_N "checking for iwlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_iwlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_iwlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_iwlib_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking iwlib.h usability" >&5 +echo $ECHO_N "checking iwlib.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking iwlib.h presence" >&5 +echo $ECHO_N "checking iwlib.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: iwlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: iwlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: iwlib.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: iwlib.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: iwlib.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: iwlib.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: iwlib.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: iwlib.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: iwlib.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: iwlib.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: iwlib.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: iwlib.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: iwlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: iwlib.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: iwlib.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: iwlib.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ----------------------------------------- ## +## Report this to the NetworkManager lists. ## +## ----------------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for iwlib.h" >&5 +echo $ECHO_N "checking for iwlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_iwlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_iwlib_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_iwlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_iwlib_h" >&6 + +fi +if test $ac_cv_header_iwlib_h = yes; then + : +else + { { echo "$as_me:$LINENO: error: iwlib.h not found. Install wireless-tools." >&5 +echo "$as_me: error: iwlib.h not found. Install wireless-tools." >&2;} + { (exit 1); exit 1; }; } +fi + + +echo "$as_me:$LINENO: checking for iw_scan in -liw" >&5 +echo $ECHO_N "checking for iw_scan in -liw... $ECHO_C" >&6 +if test "${ac_cv_lib_iw_iw_scan+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liw $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char iw_scan (); +int +main () +{ +iw_scan (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_iw_iw_scan=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_iw_iw_scan=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_iw_iw_scan" >&5 +echo "${ECHO_T}$ac_cv_lib_iw_iw_scan" >&6 +if test $ac_cv_lib_iw_iw_scan = yes; then + IWLIB=-liw +else + { { echo "$as_me:$LINENO: error: wireless-tools 27.pre23 not installed or not functional" >&5 +echo "$as_me: error: wireless-tools 27.pre23 not installed or not functional" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + succeeded=no + + if test -z "$PKG_CONFIG"; then + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG + +if test -n "$PKG_CONFIG"; then + echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 +echo "${ECHO_T}$PKG_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + echo "$as_me:$LINENO: checking for dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0" >&5 +echo $ECHO_N "checking for dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0... $ECHO_C" >&6 + + if $PKG_CONFIG --exists "dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0" ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + succeeded=yes + + echo "$as_me:$LINENO: checking NM_CFLAGS" >&5 +echo $ECHO_N "checking NM_CFLAGS... $ECHO_C" >&6 + NM_CFLAGS=`$PKG_CONFIG --cflags "dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0"` + echo "$as_me:$LINENO: result: $NM_CFLAGS" >&5 +echo "${ECHO_T}$NM_CFLAGS" >&6 + + echo "$as_me:$LINENO: checking NM_LIBS" >&5 +echo $ECHO_N "checking NM_LIBS... $ECHO_C" >&6 + NM_LIBS=`$PKG_CONFIG --libs "dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0"` + echo "$as_me:$LINENO: result: $NM_LIBS" >&5 +echo "${ECHO_T}$NM_LIBS" >&6 + else + NM_CFLAGS="" + NM_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + NM_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0"` + echo $NM_PKG_ERRORS + fi + + + + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + : + else + { { echo "$as_me:$LINENO: error: Library requirements (dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." >&5 +echo "$as_me: error: Library requirements (dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." >&2;} + { (exit 1); exit 1; }; } + fi + + + + + ac_config_files="$ac_config_files Makefile test/Makefile src/Makefile initscript/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by NetworkManager $as_me 0.1, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -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 + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +NetworkManager config.status 0.1 +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "test/Makefile" ) CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; + "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "initscript/Makefile" ) CONFIG_FILES="$CONFIG_FILES initscript/Makefile" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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_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 to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@AMTAR@,$AMTAR,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@am__leading_dot@,$am__leading_dot,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@IWLIB@,$IWLIB,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t +s,@NM_CFLAGS@,$NM_CFLAGS,;t t +s,@NM_LIBS@,$NM_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +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 + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # 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 -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //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=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 000000000..e396998ae --- /dev/null +++ b/configure.in @@ -0,0 +1,23 @@ +AC_PREREQ(2.52) + +AC_INIT(NetworkManager, 0.1) +AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) + +AC_PROG_CC + +AC_CHECK_HEADER(iwlib.h, [], + [AC_MSG_ERROR(iwlib.h not found. Install wireless-tools.)], []) +AC_CHECK_LIB(iw, iw_scan, [ IWLIB=-liw ], + [AC_MSG_ERROR(wireless-tools 27.pre23 not installed or not functional)], []) +AC_SUBST(IWLIB) + +PKG_CHECK_MODULES(NM, dbus-glib-1 >= 0.20 hal >= 0.2.91 gthread-2.0) +AC_SUBST(NM_CFLAGS) +AC_SUBST(NM_LIBS) + +AC_OUTPUT([ +Makefile +test/Makefile +src/Makefile +initscript/Makefile +]) diff --git a/initscript/Makefile.am b/initscript/Makefile.am new file mode 100644 index 000000000..21ddd3173 --- /dev/null +++ b/initscript/Makefile.am @@ -0,0 +1,4 @@ +EXTRA_DIST = NetworkManager + +rcddir = $(sysconfdir)/rc.d/init.d +rcd_DATA = NetworkManager diff --git a/initscript/Makefile.in b/initscript/Makefile.in new file mode 100644 index 000000000..03a877ff2 --- /dev/null +++ b/initscript/Makefile.in @@ -0,0 +1,272 @@ +# Makefile.in generated by automake 1.7.9 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +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 = : +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IWLIB = @IWLIB@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +NM_CFLAGS = @NM_CFLAGS@ +NM_LIBS = @NM_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build_alias = @build_alias@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = NetworkManager + +rcddir = $(sysconfdir)/rc.d/init.d +rcd_DATA = NetworkManager +subdir = initscript +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DATA = $(rcd_DATA) + +DIST_COMMON = $(srcdir)/Makefile.in Makefile.am +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu initscript/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +uninstall-info-am: +rcdDATA_INSTALL = $(INSTALL_DATA) +install-rcdDATA: $(rcd_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(rcddir) + @list='$(rcd_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(rcdDATA_INSTALL) $$d$$p $(DESTDIR)$(rcddir)/$$f"; \ + $(rcdDATA_INSTALL) $$d$$p $(DESTDIR)$(rcddir)/$$f; \ + done + +uninstall-rcdDATA: + @$(NORMAL_UNINSTALL) + @list='$(rcd_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f $(DESTDIR)$(rcddir)/$$f"; \ + rm -f $(DESTDIR)$(rcddir)/$$f; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(rcddir) +install: 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: install-rcdDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-rcdDATA + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-rcdDATA install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ + uninstall-am uninstall-info-am uninstall-rcdDATA + +# 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: diff --git a/initscript/NetworkManager b/initscript/NetworkManager new file mode 100755 index 000000000..c6a7cada4 --- /dev/null +++ b/initscript/NetworkManager @@ -0,0 +1,71 @@ +#!/bin/sh +# +# NetworkManager: NetworkManager daemon +# +# chkconfig: 345 98 02 +# description: This is a daemon for automatically switching network \ +# connections to the best available connection. \ +# +# processname: NetworkManager +# pidfile: /var/run/NetworkManager.pid +# + +# Sanity checks. +[ -x /usr/bin/NetworkManager ] || exit 0 + +# Source function library. +. /etc/rc.d/init.d/functions + +# so we can rearrange this easily +processname=NetworkManager +servicename=NetworkManager + +RETVAL=0 + +start() { + echo -n $"Starting NetworkManager daemon: " + daemon --check $servicename $processname + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename && echo `/sbin/pidof $processname` > /var/run/NetworkManager.pid +} + +stop() { + echo -n $"Stopping NetworkManager daemon: " + + killproc $servicename -TERM + RETVAL=$? + echo + if [ $RETVAL -eq 0 ]; then + rm -f /var/lock/subsys/$servicename + rm -f /var/run/NetworkManager.pid + fi +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + status $processname + RETVAL=$? + ;; + restart) + stop + start + ;; + condrestart) + if [ -f /var/lock/subsys/$servicename ]; then + stop + start + fi + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart}" + ;; +esac +exit $RETVAL diff --git a/inode.c b/inode.c new file mode 100644 index 000000000..52b4faf17 --- /dev/null +++ b/inode.c @@ -0,0 +1,124 @@ +/* -*- mode: C; c-file-style: "linux" -*- */ + +/* MemProf -- memory profiler and leak detector + * Copyright 1999, 2000, 2001, Red Hat, Inc. + * Copyright 2002, Kristian Rietveld + * + * 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. + */ +/*====*/ + +#include +#include +#include +#include "memprof.h" + +/************************************************************ + * Inode finding code - not needed for kernel 2.2 or greater + ************************************************************/ + +GHashTable *inode_table = NULL; + +typedef struct { + dev_t device; + ino_t inode; + gchar *name; +} Inode; + +static guint +inode_hash (gconstpointer data) +{ + return (((Inode *)data)->device + (((Inode *)data)->inode << 11)); +} + +static gint +inode_compare (gconstpointer a, gconstpointer b) +{ + return ((((Inode *)a)->device == ((Inode *)b)->device) && + (((Inode *)a)->inode == ((Inode *)b)->inode)); +} + +void +read_inode (const gchar *path) +{ + struct stat stbuf; + + g_return_if_fail (path != NULL); + + if (!inode_table) + inode_table = g_hash_table_new (inode_hash, inode_compare); + + if (!stat (path, &stbuf)) { + Inode *inode = g_new (Inode, 1); + inode->device = stbuf.st_dev; + inode->inode = stbuf.st_ino; + if (!g_hash_table_lookup (inode_table, inode)) { + inode->name = g_strdup (path); + g_hash_table_insert (inode_table, inode, inode); + } else + g_free (inode); + } +} + +static void +read_inodes () +{ + static const char *directories[] = { + "/lib", + "/usr/lib", + "/usr/X11R6/lib", + "/usr/local/lib", + "/opt/gnome/lib", + NULL + }; + + const char **dirname; + + for (dirname = directories; *dirname; dirname++) + { + DIR *dir = opendir (*dirname); + + if (dir) { + struct dirent *ent; + while ((ent = readdir (dir))) { + gchar buf[1024]; + snprintf(buf, 1024-1, "%s/%s", *dirname, ent->d_name); + read_inode (buf); + } + + closedir (dir); + } + } +} + +gchar * +locate_inode (dev_t device, ino_t inode) +{ + Inode lookup; + Inode *result; + + lookup.device = device; + lookup.inode = inode; + + if (!inode_table) + read_inodes (); + + result = g_hash_table_lookup (inode_table, &lookup); + if (result) + return result->name; + else + return NULL; +} + diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 000000000..53c50b84b --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,31 @@ +EXTRA_DIST = NetworkManager.conf + +INCLUDES = \ + $(NM_CFLAGS) \ + -DDBUS_API_SUBJECT_TO_CHANGE \ + -DBINDIR=\"$(bindir)\" \ + -DDATADIR=\"$(datadir)\" + +bin_PROGRAMS = NetworkManager + +NetworkManager_SOURCES = \ + NetworkManagerAP.c \ + NetworkManagerAP.h \ + NetworkManagerDbus.c \ + NetworkManagerDbus.h \ + NetworkManagerDevice.c \ + NetworkManagerDevice.h \ + NetworkManager.c \ + NetworkManager.h \ + NetworkManagerPolicy.c \ + NetworkManagerPolicy.h \ + NetworkManagerUtils.c \ + NetworkManagerUtils.h \ + NetworkManagerWireless.c \ + NetworkManagerWireless.h + +NetworkManager_LDADD = $(NM_LIBS) $(IWLIB) + +dbusservicedir = $(sysconfdir)/dbus-1/system.d +dbusservice_DATA = NetworkManager.conf + diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 000000000..c6253ad60 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,446 @@ +# Makefile.in generated by automake 1.7.9 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +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 = : +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IWLIB = @IWLIB@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +NM_CFLAGS = @NM_CFLAGS@ +NM_LIBS = @NM_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build_alias = @build_alias@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = NetworkManager.conf + +INCLUDES = \ + $(NM_CFLAGS) \ + -DDBUS_API_SUBJECT_TO_CHANGE \ + -DBINDIR=\"$(bindir)\" \ + -DDATADIR=\"$(datadir)\" + + +bin_PROGRAMS = NetworkManager + +NetworkManager_SOURCES = \ + NetworkManagerAP.c \ + NetworkManagerAP.h \ + NetworkManagerDbus.c \ + NetworkManagerDbus.h \ + NetworkManagerDevice.c \ + NetworkManagerDevice.h \ + NetworkManager.c \ + NetworkManager.h \ + NetworkManagerPolicy.c \ + NetworkManagerPolicy.h \ + NetworkManagerUtils.c \ + NetworkManagerUtils.h \ + NetworkManagerWireless.c \ + NetworkManagerWireless.h + + +NetworkManager_LDADD = $(NM_LIBS) $(IWLIB) + +dbusservicedir = $(sysconfdir)/dbus-1/system.d +dbusservice_DATA = NetworkManager.conf +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +bin_PROGRAMS = NetworkManager$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + +am_NetworkManager_OBJECTS = NetworkManagerAP.$(OBJEXT) \ + NetworkManagerDbus.$(OBJEXT) NetworkManagerDevice.$(OBJEXT) \ + NetworkManager.$(OBJEXT) NetworkManagerPolicy.$(OBJEXT) \ + NetworkManagerUtils.$(OBJEXT) NetworkManagerWireless.$(OBJEXT) +NetworkManager_OBJECTS = $(am_NetworkManager_OBJECTS) +NetworkManager_DEPENDENCIES = +NetworkManager_LDFLAGS = + +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/NetworkManager.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/NetworkManagerAP.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/NetworkManagerDbus.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/NetworkManagerDevice.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/NetworkManagerPolicy.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/NetworkManagerUtils.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/NetworkManagerWireless.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DIST_SOURCES = $(NetworkManager_SOURCES) +DATA = $(dbusservice_DATA) + +DIST_COMMON = $(srcdir)/Makefile.in Makefile.am +SOURCES = $(NetworkManager_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ + rm -f $(DESTDIR)$(bindir)/$$f; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +NetworkManager$(EXEEXT): $(NetworkManager_OBJECTS) $(NetworkManager_DEPENDENCIES) + @rm -f NetworkManager$(EXEEXT) + $(LINK) $(NetworkManager_LDFLAGS) $(NetworkManager_OBJECTS) $(NetworkManager_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManager.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManagerAP.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManagerDbus.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManagerDevice.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManagerPolicy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManagerUtils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetworkManagerWireless.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` +uninstall-info-am: +dbusserviceDATA_INSTALL = $(INSTALL_DATA) +install-dbusserviceDATA: $(dbusservice_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(dbusservicedir) + @list='$(dbusservice_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(dbusserviceDATA_INSTALL) $$d$$p $(DESTDIR)$(dbusservicedir)/$$f"; \ + $(dbusserviceDATA_INSTALL) $$d$$p $(DESTDIR)$(dbusservicedir)/$$f; \ + done + +uninstall-dbusserviceDATA: + @$(NORMAL_UNINSTALL) + @list='$(dbusservice_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f $(DESTDIR)$(dbusservicedir)/$$f"; \ + rm -f $(DESTDIR)$(dbusservicedir)/$$f; \ + done + +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +tags: TAGS + +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; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + 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; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + 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; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(DATA) + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(dbusservicedir) +install: 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: install-dbusserviceDATA + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-dbusserviceDATA \ + uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-dbusserviceDATA install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-dbusserviceDATA uninstall-info-am + +# 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: diff --git a/src/NetworkManager.c b/src/NetworkManager.c new file mode 100644 index 000000000..33aa0597b --- /dev/null +++ b/src/NetworkManager.c @@ -0,0 +1,688 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "NetworkManager.h" +#include "NetworkManagerUtils.h" +#include "NetworkManagerDevice.h" +#include "NetworkManagerPolicy.h" +#include "NetworkManagerWireless.h" +#include "NetworkManagerDbus.h" + + +/* + * Globals + */ +static GMainLoop *loop = NULL; +static NMData *nm_data = NULL; +gboolean debug = TRUE; +static gboolean quit = FALSE; + + + +static void nm_data_free (NMData *data); + + +/* + * nm_create_device_and_add_to_list + * + * Create a new NLM device and add it to our device list. + * + * Returns: newly allocated device on success + * NULL on failure + */ +NMDevice * nm_create_device_and_add_to_list (NMData *data, const char *udi) +{ + NMDevice *dev = NULL; + gboolean success = FALSE; + + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (udi != NULL, NULL); + + if (hal_device_property_exists (data->hal_ctx, udi, "net.interface")) + { + gchar *iface_name = hal_device_get_property_string (data->hal_ctx, udi, "net.interface"); + + /* Make sure the device is not already in the device list */ + dev = nm_get_device_by_iface (data, iface_name); + if (dev) + { + NM_DEBUG_PRINT_1 ("nm_create_device_and_add_to_list() device %s was already in the list\n", iface_name); + hal_free_string (iface_name); + return (NULL); + } + + dev = nm_device_new (iface_name); + if (dev) + { + + /* Build up the device structure */ + nm_device_set_udi (dev, udi); + + /* Attempt to acquire mutex for device list addition. If acquire fails, + * just ignore the device addition entirely. + */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + NM_DEBUG_PRINT_3( "nm_create_device_and_add_to_list() adding udi='%s', iface='%s', iface_type=%s\n", + nm_device_get_udi (dev), nm_device_get_iface (dev), nm_device_get_iface_type (dev) == NM_IFACE_TYPE_WIRELESS_ETHERNET ? "wireless" : "wired" ); + + data->dev_list = g_slist_append (data->dev_list, dev); + + /* Initialize and bring up all new devices */ + if (nm_device_get_iface_type (dev) == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + /* Disable WEP */ + nm_device_bring_down (dev); + nm_device_set_wep_key (dev, NULL); + nm_device_set_essid (dev, NULL); + nm_device_bring_up (dev); + } + else + { + if (!nm_device_is_up (dev)) + nm_device_bring_up (dev); + } + success = TRUE; + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + NM_DEBUG_PRINT( "nm_create_device_and_add_to_list() could not acquire device list mutex.\n" ); + } + else + NM_DEBUG_PRINT( "nm_create_device_and_add_to_list() could not allocate device data.\n" ); + + hal_free_string (iface_name); + + if (!success) + { + /* If we couldn't add the device to our list, free its data. */ + nm_device_unref (dev); + dev = NULL; + } + } + else + NM_DEBUG_PRINT_1( "nm_create_device_and_add_to_list(): device %s does not have 'net.interface' property\n", udi ); + + return (dev); +} + + +/* + * nm_remove_device_from_list + * + * Searches for a device entry in the NLM device list by udi, + * and if found, removes that element from the list and frees + * its data. + */ +void nm_remove_device_from_list (NMData *data, const char *udi) +{ + GSList *element; + + g_return_if_fail (data != NULL); + g_return_if_fail (udi != NULL); + + /* Attempt to acquire mutex for device list deletion. If acquire fails, + * just ignore the device deletion entirely. + */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + element = data->dev_list; + while (element) + { + NMDevice *dev = (NMDevice *)(element->data); + + if (dev) + { + if (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0) + { + if ( data->active_device + && (dev == data->active_device)) + { + nm_device_unref (data->active_device); + data->active_device = NULL; + } + + /* Remove the device entry from the device list and free its data */ + data->dev_list = g_slist_remove_link (data->dev_list, element); + nm_device_unref (element->data); + g_slist_free (element); + + break; + } + } + + element = g_slist_next (element); + } + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + NM_DEBUG_PRINT( "nm_remove_device_from_list() could not acquire device list mutex.\n" ); +} + + +/* + * nm_hal_mainloop_integration + * + */ +static void nm_hal_mainloop_integration (LibHalContext *ctx, DBusConnection * dbus_connection) +{ + dbus_connection_setup_with_g_main (dbus_connection, NULL); +} + + +/* + * nm_hal_device_added + * + */ +static void nm_hal_device_added (LibHalContext *ctx, const char *udi) +{ + NMData *data = (NMData *)hal_ctx_get_user_data (ctx); + + g_return_if_fail (data != NULL); + + NM_DEBUG_PRINT_1( "nm_hal_device_added() called with udi = %s\n", udi ); + + /* Sometimes the device's properties (like net.interface) are not set up yet, + * so this call will fail, and it will actually be added when hal sets the device's + * capabilities a bit later on. + */ + nm_create_device_and_add_to_list (data, udi); +} + + +/* + * nm_hal_device_removed + * + */ +static void nm_hal_device_removed (LibHalContext *ctx, const char *udi) +{ + NMData *data = (NMData *)hal_ctx_get_user_data (ctx); + + g_return_if_fail (data != NULL); + + NM_DEBUG_PRINT_1( "nm_hal_device_removed() called with udi = %s\n", udi ); + + nm_remove_device_from_list (data, udi); +} + + +/* + * nm_hal_device_new_capability + * + */ +static void nm_hal_device_new_capability (LibHalContext *ctx, const char *udi, const char *capability) +{ + NMData *data = (NMData *)hal_ctx_get_user_data (ctx); + + g_return_if_fail (data != NULL); + + NM_DEBUG_PRINT_2( "nm_hal_device_new_capability() called with udi = %s, capability = %s\n", udi, capability ); + + if (capability && (strcmp (capability, "net.ethernet") == 0)) + nm_create_device_and_add_to_list (data, udi); +} + + +/* + * nm_hal_device_lost_capability + * + */ +static void nm_hal_device_lost_capability (LibHalContext *ctx, const char *udi, const char *capability) +{ + NM_DEBUG_PRINT_2( "nm_hal_device_lost_capability() called with udi = %s, capability = %s\n", udi, capability ); +} + + +/* + * nm_hal_device_property_modified + * + */ +static void nm_hal_device_property_modified (LibHalContext *ctx, const char *udi, const char *key, dbus_bool_t is_removed, dbus_bool_t is_added) +{ +/* + NM_DEBUG_PRINT_4( "nm_hal_device_property_modified() called with udi = %s, key = %s, is_removed = %d, is_added = %d\n", udi, key, is_removed, is_added ); +*/ +} + + +/* + * nm_add_current_devices + * + * Add all devices that hal knows about right now (ie not hotplug devices) + * + */ +static void nm_add_current_devices (NMData *data) +{ + char **net_devices; + int num_net_devices; + int i; + + g_return_if_fail (data != NULL); + + /* Grab a list of network devices */ + net_devices = hal_find_device_by_capability (data->hal_ctx, "net.ethernet", &num_net_devices); + for (i = 0; i < num_net_devices; i++) + nm_create_device_and_add_to_list (data, net_devices[i]); + + hal_free_string_array (net_devices); +} + + +/* + * nm_link_state_monitor + * + * Called every 2s to poll cards and determine if they have a link + * or not. + * + */ +gboolean nm_link_state_monitor (gpointer user_data) +{ + NMData *data = (NMData *)user_data; + GSList *element; + + g_return_val_if_fail (data != NULL, TRUE); + + /* Attempt to acquire mutex for device list iteration. + * If the acquire fails, just ignore the device deletion entirely. + */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + element = data->dev_list; + while (element) + { + NMDevice *dev = (NMDevice *)(element->data); + + if (dev) + { + /* Make sure the device is up first. It doesn't have to have + * an IP address or anything, but most devices cannot do link + * detection when they are down. + */ + if (!nm_device_is_up (dev)) + nm_device_bring_up (dev); + + nm_device_update_link_active (dev, FALSE); + } + + element = g_slist_next (element); + } + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + NM_DEBUG_PRINT( "nm_link_state_monitor() could not acquire device list mutex.\n" ); + + return (TRUE); +} + + +/* + * nm_data_allowed_ap_list_free + * + * Frees the allowed access point list + * + */ +void nm_data_allowed_ap_list_free (NMData *data) +{ + GSList *element; + + g_return_if_fail (data != NULL); + + if (!data->allowed_ap_list) + return; + + element = data->allowed_ap_list; + while (element) + { + if (element->data) + { + nm_ap_unref (element->data); + element->data = NULL; + } + + element = g_slist_next (element); + } + + g_slist_free (data->allowed_ap_list); + data->allowed_ap_list = NULL; +} + + +/* + * libhal callback function structure + */ +static LibHalFunctions hal_functions = +{ + nm_hal_mainloop_integration, + nm_hal_device_added, + nm_hal_device_removed, + nm_hal_device_new_capability, + nm_hal_device_lost_capability, + nm_hal_device_property_modified, + NULL +}; + + +/* + * nm_data_new + * + * Create data structure used in callbacks from libhal. + * + */ +static NMData *nm_data_new (void) +{ + NMData *data; + + data = g_new0 (NMData, 1); + if (!data) + { + NM_DEBUG_PRINT("Could not allocate our NetworkManager data... Not enough memory?\n"); + return (NULL); + } + + /* Initialize the device list mutex to protect additions/deletions to it. */ + data->dev_list_mutex = g_mutex_new (); + if (!data->dev_list_mutex) + { + nm_data_free (data); + NM_DEBUG_PRINT("Could not create device list mutex. Whacky shit going on?\n"); + return (NULL); + } + + /* Initialize the state modified mutex. */ + data->state_modified_mutex = g_mutex_new (); + if (!data->state_modified_mutex) + { + nm_data_free (data); + NM_DEBUG_PRINT("Could not create state_modified mutex. Whacky shit going on?\n"); + return (NULL); + } + + /* Initialize the allowed access point list mutex */ + data->allowed_ap_list_mutex = g_mutex_new (); + if (!data->allowed_ap_list_mutex) + { + nm_data_free (data); + NM_DEBUG_PRINT("Could not create state_modified mutex. Whacky shit going on?\n"); + return (NULL); + } + + data->state_modified = TRUE; + + return (data); +} + + +/* + * nm_data_dev_list_element_free + * + * Frees each member of the device list before the list is + * disposed of. + * + */ +static void nm_data_dev_list_element_free (void *element, void *user_data) +{ + nm_device_unref (element); +} + + +/* + * nm_data_free + * + * Free data structure used in callbacks. + * + */ +static void nm_data_free (NMData *data) +{ + g_return_if_fail (data != NULL); + + g_slist_foreach (data->dev_list, nm_data_dev_list_element_free, NULL); + g_slist_free (data->dev_list); + g_mutex_free (data->dev_list_mutex); + nm_device_unref (data->active_device); + + nm_data_allowed_ap_list_free (data); + nm_ap_unref (data->desired_ap); +} + + +/* + * nm_get_global_data + * + * Return the global data structure + * + */ +NMData * nm_get_global_data (void) +{ + return (nm_data); +} + +/* + * nm_data_set_state_modified + * + * Locked function to protect state modification changes. + * + */ +void nm_data_set_state_modified (NMData *data, gboolean modified) +{ + g_return_if_fail (data != NULL); + + g_mutex_lock (data->state_modified_mutex); + data->state_modified = modified; + g_mutex_unlock (data->state_modified_mutex); +} + + +/* + * nm_print_usage + * + * Prints program usage. + * + */ +static void nm_print_usage (void) +{ + fprintf (stderr, "\n" "usage : NetworkManager [--daemon=yes|no] [--help]\n"); + fprintf (stderr, + "\n" + " --daemon=yes|no Become a daemon\n" + " --help Show this information and exit\n" + "\n" + "NetworkManager monitors all network connections and automatically\n" + "chooses the best connection to use. It also allows the user to\n" + "specify wireless access points which wireless cards in the computer\n" + "should associate with.\n" + "\n"); +} + + +/* + * main + * + */ +int main( int argc, char *argv[] ) +{ + LibHalContext *ctx = NULL; + guint link_source; + guint policy_source; + guint wireless_scan_source; + gboolean become_daemon = TRUE; + + /* Parse options */ + while (1) + { + int c; + int option_index = 0; + const char *opt; + + static struct option options[] = { + {"daemon", 1, NULL, 0}, + {"help", 0, NULL, 0}, + {NULL, 0, NULL, 0} + }; + + c = getopt_long (argc, argv, "", options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + opt = options[option_index].name; + if (strcmp (opt, "help") == 0) + { + nm_print_usage (); + return 0; + } + else if (strcmp (opt, "daemon") == 0) + { + if (strcmp ("yes", optarg) == 0) + become_daemon = TRUE; + else if (strcmp ("no", optarg) == 0) + become_daemon = FALSE; + else + { + nm_print_usage (); + return 1; + } + } + break; + + default: + nm_print_usage (); + return 1; + break; + } + } + + if (become_daemon) + { + int child_pid; + int dev_null_fd; + + if (chdir ("/") < 0) + { + fprintf( stderr, "NetworkManager could not chdir to /. errno=%d", errno); + return 1; + } + + child_pid = fork (); + switch (child_pid) + { + case -1: + fprintf( stderr, "NetworkManager could not daemonize. errno = %d\n", errno ); + break; + + case 0: + /* Child */ + break; + + default: + exit (0); + break; + } + } + + g_type_init (); + if (!g_thread_supported ()) + g_thread_init (NULL); + + /* Initialize libhal. We get a connection to the hal daemon here. */ + if ((ctx = hal_initialize (&hal_functions, FALSE)) == NULL) + { + NM_DEBUG_PRINT("hal_initialize() failed, exiting... Make sure the hal daemon is running?\n"); + exit (1); + } + + /* Initialize our instance data */ + nm_data = nm_data_new (); + if (!nm_data) + { + NM_DEBUG_PRINT("nm_data_new() failed... Not enough memory?\n"); + exit (1); + } + + nm_data->hal_ctx = ctx; + hal_ctx_set_user_data (nm_data->hal_ctx, nm_data); + + /* Grab network devices that are already present and add them to our list */ + nm_add_current_devices (nm_data); + + /* Initialize our list of allowed access points */ + nm_policy_update_allowed_access_points (nm_data); + + /* Create our dbus service */ + nm_data->dbus_connection = nm_dbus_init (); + if (nm_data->dbus_connection) + { + /* Create a watch function that monitors cards for link status (hal doesn't do + * this for wireless cards yet). + */ + link_source = g_timeout_add (5000, nm_link_state_monitor, nm_data); + + /* Another watch function which handles networking state changes and applies + * the correct policy on a change. + */ + policy_source = g_timeout_add (3000, nm_state_modification_monitor, nm_data); + + /* Yet another watch function which scans for access points and + * attempts to associate with approved ones in a users' list. + */ + wireless_scan_source = g_timeout_add (10000, nm_wireless_scan_monitor, nm_data); + + /* Watch all devices that HAL knows about for state changes */ + /* Don't need this now because our polling function takes care of it and + * HAL drops the ball for some cards. + */ + hal_device_property_watch_all (nm_data->hal_ctx); + + /* Since we do what dhclient does, and do it better, kill dhclient */ + system ("killall dhclient"); + + /* Run the main loop, all events processed by callbacks from libhal. */ + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + /* Kill the watch functions */ + g_source_remove (link_source); + g_source_remove (policy_source); + g_source_remove (wireless_scan_source); + } + + /* Cleanup */ + if (hal_shutdown (nm_data->hal_ctx) != 0) + g_warning ("hal_shutdown() failed\n"); + + nm_data_free (nm_data); + + return 0; +} diff --git a/src/NetworkManager.conf b/src/NetworkManager.conf new file mode 100644 index 000000000..1d88e00c4 --- /dev/null +++ b/src/NetworkManager.conf @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/NetworkManager.h b/src/NetworkManager.h new file mode 100644 index 000000000..f7b6fea71 --- /dev/null +++ b/src/NetworkManager.h @@ -0,0 +1,52 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_H +#define NETWORK_MANAGER_H + +#include +#include +#include +#include "NetworkManagerAP.h" + +struct NMData +{ + LibHalContext *hal_ctx; + GSList *dev_list; + GMutex *dev_list_mutex; + struct NMDevice *active_device; + gboolean state_modified; + GMutex *state_modified_mutex; + GSList *allowed_ap_list; + GMutex *allowed_ap_list_mutex; + NMAccessPoint *desired_ap; + DBusConnection *dbus_connection; +}; + +typedef struct NMData NMData; + +void nm_data_set_state_modified (NMData *data, gboolean modified); + +void nm_data_allowed_ap_list_free (NMData *data); + +NMData *nm_get_global_data (void); + +#endif diff --git a/src/NetworkManagerAP.c b/src/NetworkManagerAP.c new file mode 100644 index 000000000..ef4b7224a --- /dev/null +++ b/src/NetworkManagerAP.c @@ -0,0 +1,289 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include "NetworkManagerAP.h" +#include "NetworkManagerUtils.h" + +extern gboolean debug; + + +/* + * Encapsulates Access Point information + */ +struct NMAccessPoint +{ + guint refcount; + gchar *essid; + gchar *address; + guint8 quality; + double freq; + guint16 rate; + time_t stamp; + + /* Things from user prefs */ + gchar *wep_key; + guint priority; +}; + + +/* + * nm_ap_new + * + * Create a new, blank user access point info structure + * + */ +NMAccessPoint * nm_ap_new (void) +{ + NMAccessPoint *ap; + + ap = g_new0 (NMAccessPoint, 1); + if (!ap) + NM_DEBUG_PRINT( "nm_ap_new() could not allocate a new user access point info structure. Not enough memory?" ); + + ap->priority = NM_AP_PRIORITY_WORST; + ap->refcount = 1; + + return (ap); +} + + +/* + * nm_ap_new_from_ap + * + * Create a new user access point info structure, duplicating an existing one + * + */ +NMAccessPoint * nm_ap_new_from_ap (NMAccessPoint *src_ap) +{ + NMAccessPoint *new_ap; + + g_return_val_if_fail (src_ap != NULL, NULL); + + new_ap = nm_ap_new(); + if (!new_ap) + NM_DEBUG_PRINT( "nm_ap_new_from_uap() could not allocate a new user access point info structure. Not enough memory?" ); + + new_ap->refcount = 1; + + if (src_ap->essid && (strlen (src_ap->essid) > 0)) + new_ap->essid = g_strdup (src_ap->essid); + if (src_ap->address && (strlen (src_ap->address) > 0)) + new_ap->address = g_strdup (src_ap->address); + new_ap->quality = src_ap->quality; + new_ap->freq = src_ap->freq; + new_ap->rate = src_ap->rate; + + if (src_ap->wep_key && (strlen (src_ap->wep_key) > 0)) + new_ap->wep_key = g_strdup (src_ap->wep_key); + new_ap->priority = src_ap->priority; + + return (new_ap); +} + + +/* + * AP refcounting functions + */ +void nm_ap_ref (NMAccessPoint *ap) +{ + g_return_if_fail (ap != NULL); + + ap->refcount++; +} + +void nm_ap_unref (NMAccessPoint *ap) +{ + g_return_if_fail (ap != NULL); + + ap->refcount--; + if (ap->refcount == 0) + { + g_free (ap->essid); + g_free (ap->address); + g_free (ap->wep_key); + + ap->essid = NULL; + ap->wep_key = NULL; + + g_free (ap); + } +} + + +/* + * Get/set functions for priority + * + */ +guint nm_ap_get_priority (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, 0); + + return (ap->priority); +} + +void nm_ap_set_priority (NMAccessPoint *ap, guint priority) +{ + g_return_if_fail (ap != NULL); + + ap->priority = priority; +} + + +/* + * Get/set functions for essid + * + */ +gchar * nm_ap_get_essid (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, NULL); + + return (ap->essid); +} + +void nm_ap_set_essid (NMAccessPoint *ap, gchar * essid) +{ + g_return_if_fail (ap != NULL); + + if (ap->essid) + g_free (ap->essid); + + ap->essid = g_strdup (essid); +} + + +/* + * Get/set functions for WEP key + * + */ +gchar * nm_ap_get_wep_key (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, NULL); + + return (ap->wep_key); +} + +void nm_ap_set_wep_key (NMAccessPoint *ap, gchar * wep_key) +{ + g_return_if_fail (ap != NULL); + + if (ap->wep_key) + g_free (ap->wep_key); + + ap->wep_key = g_strdup (wep_key); +} + + +/* + * Get/set functions for address + * + */ +gchar * nm_ap_get_address (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, NULL); + + return (ap->address); +} + +void nm_ap_set_address (NMAccessPoint *ap, gchar * address) +{ + g_return_if_fail (ap != NULL); + + if (ap->address) + g_free (ap->address); + + ap->address = g_strdup (address); +} + + +/* + * Get/set functions for quality + * + */ +guint8 nm_ap_get_quality (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, 0); + + return (ap->quality); +} + +void nm_ap_set_quality (NMAccessPoint *ap, guint8 quality) +{ + g_return_if_fail (ap != NULL); + + ap->quality = quality; +} + + +/* + * Get/set functions for frequency + * + */ +double nm_ap_get_freq (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, 0); + + return (ap->freq); +} + +void nm_ap_set_freq (NMAccessPoint *ap, double freq) +{ + g_return_if_fail (ap != NULL); + + ap->freq = freq; +} + + +/* + * Get/set functions for rate + * + */ +guint16 nm_ap_get_rate (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, 0); + + return (ap->rate); +} + +void nm_ap_set_rate (NMAccessPoint *ap, guint16 rate) +{ + g_return_if_fail (ap != NULL); + + ap->rate = rate; +} + + +/* + * Get/set functions for timestamp + * + */ +time_t nm_ap_get_stamp (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, 0); + + return (ap->stamp); +} + +void nm_ap_set_stamp (NMAccessPoint *ap, time_t stamp) +{ + g_return_if_fail (ap != NULL); + + ap->stamp = stamp; +} diff --git a/src/NetworkManagerAP.h b/src/NetworkManagerAP.h new file mode 100644 index 000000000..df44c5082 --- /dev/null +++ b/src/NetworkManagerAP.h @@ -0,0 +1,63 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_AP_H +#define NETWORK_MANAGER_AP_H + +#include +#include + +typedef struct NMAccessPoint NMAccessPoint; + +#define NM_AP_PRIORITY_WORST 1000 + + +NMAccessPoint *nm_ap_new (void); +NMAccessPoint *nm_ap_new_from_ap (NMAccessPoint *ap); + +void nm_ap_unref (NMAccessPoint *ap); +void nm_ap_ref (NMAccessPoint *ap); + +guint nm_ap_get_priority (NMAccessPoint *ap); +void nm_ap_set_priority (NMAccessPoint *ap, guint priority); + +gchar * nm_ap_get_essid (NMAccessPoint *ap); +void nm_ap_set_essid (NMAccessPoint *ap, gchar * essid); + +gchar * nm_ap_get_wep_key (NMAccessPoint *ap); +void nm_ap_set_wep_key (NMAccessPoint *ap, gchar * wep_key); + +gchar * nm_ap_get_address (NMAccessPoint *ap); +void nm_ap_set_address (NMAccessPoint *ap, gchar * address); + +guint8 nm_ap_get_quality (NMAccessPoint *ap); +void nm_ap_set_quality (NMAccessPoint *ap, guint8 quality); + +double nm_ap_get_freq (NMAccessPoint *ap); +void nm_ap_set_freq (NMAccessPoint *ap, double freq); + +guint16 nm_ap_get_rate (NMAccessPoint *ap); +void nm_ap_set_rate (NMAccessPoint *ap, guint16 rate); + +time_t nm_ap_get_stamp (NMAccessPoint *ap); +void nm_ap_set_stamp (NMAccessPoint *ap, time_t stamp); + +#endif diff --git a/src/NetworkManagerDbus.c b/src/NetworkManagerDbus.c new file mode 100644 index 000000000..ad55175f3 --- /dev/null +++ b/src/NetworkManagerDbus.c @@ -0,0 +1,690 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include + +extern gboolean debug; + +#include "NetworkManager.h" +#include "NetworkManagerUtils.h" +#include "NetworkManagerDevice.h" +#include "NetworkManagerDbus.h" +#include "NetworkManagerAP.h" + + +/* + * nm_dbus_create_error_message + * + * Make a DBus error message + * + */ +static DBusMessage *nm_dbus_create_error_message (DBusMessage *message, const char *exception_namespace, + const char *exception, const char *format, ...) +{ + DBusMessage *reply_message; + va_list args; + char error_text[512]; + + + va_start (args, format); + vsnprintf (error_text, 512, format, args); + va_end (args); + + char *exception_text = g_strdup_printf ("%s.%s", exception_namespace, exception); + reply_message = dbus_message_new_error (message, exception_text, error_text); + g_free (exception_text); + + return (reply_message); +} + + +/* + * nm_dbus_get_object_path_from_device + * + * Copies the object path for a device object into a provided buffer + * + */ +void nm_dbus_get_object_path_from_device (NMDevice *dev, unsigned char *buf, unsigned int buf_len, gboolean lock_dev_list) +{ + NMData *data = nm_get_global_data (); + + g_return_if_fail (buf != NULL); + g_return_if_fail (buf_len > 0); + memset (buf, 0, buf_len); + + g_return_if_fail (dev != NULL); + g_return_if_fail (data != NULL); + + /* Iterate over device list */ + if (!lock_dev_list || nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + NMDevice *list_dev = NULL; + GSList *element = data->dev_list; + int i = 0; + + while (element) + { + list_dev = (NMDevice *)(element->data); + if (dev == list_dev) + { + snprintf (buf, buf_len-1, "%s/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, i); + break; + } + + i++; + element = g_slist_next (element); + } + + if (lock_dev_list) + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } +} + + +/* + * nm_dbus_get_device_from_object_path + * + * Returns the device associated with a dbus object path + * + */ +NMDevice *nm_dbus_get_device_from_object_path (const char *path, int *dev_index) +{ + NMData *data = nm_get_global_data (); + NMDevice *dev = NULL; + + *dev_index = -1; + + g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (data != NULL, NULL); + + /* FIXME + * This function could be much more efficient, for example we could + * actually _parse_ the object path, but that's a lot more code and + * stupid stuff. The approach below is slower, less efficient, but + * less code and less error-prone. + */ + + /* Iterate over device list */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + GSList *element = data->dev_list; + char compare_path[100]; + int i = 0; + + while (element) + { + snprintf (compare_path, 100, "%s/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, i); + + /* Compare against our constructed path, but ignore any trailing elements */ + dev = (NMDevice *)(element->data); + if (dev && (strncmp (path, compare_path, strlen (compare_path)) == 0)) + { + *dev_index = i; + break; + } + else + dev = NULL; + + i++; + element = g_slist_next (element); + } + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + + return (dev); +} + + +/* + * nm_dbus_get_network_by_object_path + * + * Returns the network (ap) associated with a dbus object path + * + */ +NMAccessPoint *nm_dbus_get_network_by_object_path (const char *path, NMDevice *dev, int dev_index, int *ap_index) +{ + NMData *data; + NMAccessPoint *ap = NULL; + int i = 0; + char compare_path[100]; + + *ap_index = -1; + + g_return_val_if_fail (path != NULL, NULL); + + while (ap = nm_device_ap_list_get_ap (dev, i)) + { + snprintf (compare_path, 100, "%s/%d/Networks/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, dev_index, i); + if (strncmp (path, compare_path, strlen (compare_path)) == 0) + { + *ap_index = i; + break; + } + else + ap = NULL; + + i++; + } + + return (ap); +} + + +/* + * nm_dbus_nm_get_active_device + * + * Returns the object path of the currently active device + * + */ +static DBusMessage *nm_dbus_nm_get_active_device (DBusConnection *connection, DBusMessage *message) +{ + DBusMessage *reply_message = NULL; + DBusMessageIter iter; + NMData *data; + + data = nm_get_global_data (); + if (!data) + { + /* If we can't get our global data, something is really wrong... */ + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "NoGlobalData", + "NetworkManager couldn't get its global data."); + goto end; + } + + if (!data->active_device) + { + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + dbus_message_iter_append_string (&iter, ""); + + goto end; + } + + /* Iterate over device list and grab index of "active device" */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + GSList *element = data->dev_list; + int i = 0; + + while (element) + { + NMDevice *dev = (NMDevice *)(element->data); + + if (dev && (dev == data->active_device)) + { + char *object_path = g_strdup_printf ("%s/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, i); + + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + dbus_message_iter_append_string (&iter, object_path); + g_free (object_path); + + break; + } + + i++; + element = g_slist_next (element); + } + + if (!reply_message) + { + /* If the active device wasn't in the list, its been removed. */ + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + dbus_message_iter_append_string (&iter, ""); + } + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + { + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "Retry", + "NetworkManager could not lock device list, try again."); + } + + end: + return (reply_message); +} + + +/* + * nm_dbus_nm_get_devices + * + * Returns a string array of object paths corresponding to the + * devices in the device list. + * + */ +static DBusMessage *nm_dbus_nm_get_devices (DBusConnection *connection, DBusMessage *message) +{ + DBusMessage *reply_message = NULL; + DBusMessageIter iter; + DBusMessageIter iter_array; + NMData *data; + + data = nm_get_global_data (); + if (!data) + { + /* If we can't get our global data, something is really wrong... */ + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "NoGlobalData", + "NetworkManager couldn't get its global data."); + goto end; + } + + /* Check for no devices */ + if (!data->dev_list) + { + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + dbus_message_iter_append_array (&iter, &iter_array, DBUS_TYPE_STRING); + dbus_message_iter_append_string (&iter_array, ""); + + goto end; + } + + /* Iterate over device list and grab index of "active device" */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + GSList *element = data->dev_list; + int i = 0; + gboolean appended = FALSE; + + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + dbus_message_iter_append_array (&iter, &iter_array, DBUS_TYPE_STRING); + + while (element) + { + NMDevice *dev = (NMDevice *)(element->data); + + if (dev) + { + char *object_path = g_strdup_printf ("%s/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, i); + dbus_message_iter_append_string (&iter_array, object_path); + g_free (object_path); + appended = TRUE; + } + + i++; + element = g_slist_next (element); + } + + /* If by some chance there is a device list, but it has no devices in it + * (something which should never happen), append an empty string like + * there are no devices in the list. + */ + if (!appended) + dbus_message_iter_append_string (&iter_array, ""); + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + { + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "Retry", + "NetworkManager could not lock device list, try again."); + } + + end: + return (reply_message); +} + + +/*-------------------------------------------------------------*/ +/* Handler code */ +/*-------------------------------------------------------------*/ + + +/* + * nm_dbus_signal_device_no_longer_active + * + * Notifies the bus that a particular device is no longer active. + * + */ +void nm_dbus_signal_device_no_longer_active (DBusConnection *connection, NMDevice *dev) +{ + DBusMessage *message; + unsigned char *object_path = g_new0 (unsigned char, 100); + + g_return_if_fail (object_path != NULL); + + message = dbus_message_new_signal (NM_DBUS_NM_OBJECT_PATH_PREFIX, NM_DBUS_NM_NAMESPACE, "DeviceNoLongerActive"); + if (!message) + { + NM_DEBUG_PRINT ("nm_dbus_signal_device_no_longer_active(): Not enough memory for new dbus message!\n"); + } + + nm_dbus_get_object_path_from_device (dev, object_path, 100, FALSE); + dbus_message_append_args (message, DBUS_TYPE_STRING, object_path, DBUS_TYPE_INVALID); + g_free (object_path); + + if (!dbus_connection_send (connection, message, NULL)) + NM_DEBUG_PRINT ("nm_dbus_signal_device_no_longer_active(): Could not raise the DeviceNoLongerActive signal!\n"); + + dbus_message_unref (message); +} + + +/* + * nm_dbus_signal_device_now_active + * + * Notifies the bus that a particular device is newly active. + * + */ +void nm_dbus_signal_device_now_active (DBusConnection *connection, NMDevice *dev) +{ + DBusMessage *message; + unsigned char *object_path = g_new0 (unsigned char, 100); + + message = dbus_message_new_signal (NM_DBUS_NM_OBJECT_PATH_PREFIX, NM_DBUS_NM_NAMESPACE, "DeviceNowActive"); + if (!message) + { + NM_DEBUG_PRINT ("nm_dbus_signal_device_now_active(): Not enough memory for new dbus message!\n"); + } + + nm_dbus_get_object_path_from_device (dev, object_path, 100, FALSE); + dbus_message_append_args (message, DBUS_TYPE_STRING, object_path, DBUS_TYPE_INVALID); + g_free (object_path); + + if (!dbus_connection_send (connection, message, NULL)) + NM_DEBUG_PRINT ("nm_dbus_signal_device_now_active(): Could not raise the DeviceNowActive signal!\n"); + + dbus_message_unref (message); +} + + +/* + * nm_dbus_devices_handle_networks_request + * + * Converts a property request on a _network_ into a dbus message. + * + */ +static DBusMessage *nm_dbus_devices_handle_networks_request (DBusConnection *connection, DBusMessage *message, + const char *path, const char *request, NMDevice *dev, int dev_index) +{ + NMAccessPoint *ap; + DBusMessage *reply_message = NULL; + DBusMessageIter iter; + int ap_index; + + ap = nm_dbus_get_network_by_object_path (path, dev, dev_index, &ap_index); + if (!ap || (ap_index == -1)) + { + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "NetworkNotFound", + "The requested network does not exist for this device."); + return (reply_message); + } + + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + + if (strcmp ("getName", request) == 0) + dbus_message_iter_append_string (&iter, nm_ap_get_essid (ap)); + else if (strcmp ("getAddress", request) == 0) + dbus_message_iter_append_string (&iter, nm_ap_get_address (ap)); + else if (strcmp ("getQuality", request) == 0) + dbus_message_iter_append_int32 (&iter, nm_ap_get_quality (ap)); + else if (strcmp ("getFrequency", request) == 0) + dbus_message_iter_append_double (&iter, nm_ap_get_freq (ap)); + else if (strcmp ("getRate", request) == 0) + dbus_message_iter_append_int32 (&iter, nm_ap_get_rate (ap)); + else if (strcmp ("getStamp", request) == 0) + dbus_message_iter_append_int32 (&iter, nm_ap_get_stamp (ap)); + else + { + /* Must destroy the allocated message */ + dbus_message_unref (reply_message); + + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "UnknownMethod", + "NetworkManager knows nothing about the method %s for object %s", request, path); + } + + return (reply_message); +} + + +/* + * nm_dbus_devices_handle_request + * + * Converts a property request into a dbus message. + * + */ +static DBusMessage *nm_dbus_devices_handle_request (DBusConnection *connection, DBusMessage *message, const char *path, const char *request) +{ + NMDevice *dev; + DBusMessage *reply_message = NULL; + DBusMessageIter iter; + int dev_index; + char *object_path; + + dev = nm_dbus_get_device_from_object_path (path, &dev_index); + if (!dev || (dev_index == -1)) + { + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "DeviceNotFound", + "The requested network device does not exist."); + return (reply_message); + } + + /* Test whether or not the _networks_ of a device were queried instead of the device itself */ + object_path = g_strdup_printf ("%s/%d/Networks/", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, dev_index); + if (strncmp (path, object_path, strlen (object_path)) == 0) + { + free (object_path); + reply_message = nm_dbus_devices_handle_networks_request (connection, message, path, request, dev, dev_index); + return (reply_message); + } + free (object_path); + + reply_message = dbus_message_new_method_return (message); + dbus_message_iter_init (reply_message, &iter); + + if (strcmp ("getName", request) == 0) + dbus_message_iter_append_string (&iter, nm_device_get_iface (dev)); + else if (strcmp ("getType", request) == 0) + dbus_message_iter_append_int32 (&iter, nm_device_get_iface_type (dev)); + else if (strcmp ("getActiveNetwork", request) == 0) + { + NMAccessPoint *ap = NULL; + int i = 0; + + while (ap = nm_device_ap_list_get_ap (dev, i)) + { + if (nm_null_safe_strcmp (nm_ap_get_essid (ap), nm_device_get_essid (dev)) == 0) + { + object_path = g_strdup_printf ("%s/%d/Networks/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, dev_index, i); + dbus_message_iter_append_string (&iter, object_path); + g_free (object_path); + break; + } + i++; + ap = NULL; + } + + /* If we didn't find the devices current network among the known networks, just append a blank item */ + if (!ap) + dbus_message_iter_append_string (&iter, ""); + } + else if (strcmp ("getNetworks", request) == 0) + { + DBusMessageIter iter_array; + NMAccessPoint *ap = NULL; + int i = 0; + + dbus_message_iter_append_array (&iter, &iter_array, DBUS_TYPE_STRING); + + while (ap = nm_device_ap_list_get_ap (dev, i)) + { + object_path = g_strdup_printf ("%s/%d/Networks/%d", NM_DBUS_DEVICES_OBJECT_PATH_PREFIX, dev_index, i); + dbus_message_iter_append_string (&iter_array, object_path); + g_free (object_path); + + i++; + } + } + else + { + /* Must destroy the allocated message */ + dbus_message_unref (reply_message); + + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "UnknownMethod", + "NetworkManager knows nothing about the method %s for object %s", request, path); + } + + return (reply_message); +} + + +/* + * nm_dbus_nm_message_handler + * + * Dispatch messages against our NetworkManager object + * + */ +static DBusHandlerResult nm_dbus_nm_message_handler (DBusConnection *connection, DBusMessage *message, void *user_data) +{ + const char *method; + const char *path; + DBusMessage *reply_message = NULL; + + method = dbus_message_get_member (message); + path = dbus_message_get_path (message); + + NM_DEBUG_PRINT_2 ("nm_dbus_devices_message_handler() got method %s for path %s\n", method, path); + + if (strcmp ("getActiveDevice", method) == 0) + { + reply_message = nm_dbus_nm_get_active_device (connection, message); + } + else if (strcmp ("getDevices", method) == 0) + { + reply_message = nm_dbus_nm_get_devices (connection, message); + } + else + { + reply_message = nm_dbus_create_error_message (message, NM_DBUS_NM_NAMESPACE, "UnknownMethod", + "NetworkManager knows nothing about the method %s for object %s", method, path); + } + + dbus_connection_send (connection, reply_message, NULL); + + return DBUS_HANDLER_RESULT_HANDLED; +} + + +/* + * nm_dbus_nm_unregister_handler + * + * Nothing happens here. + * + */ +void nm_dbus_nm_unregister_handler (DBusConnection *connection, void *user_data) +{ + /* do nothing */ +} + + +/* + * nm_dbus_devices_message_handler + * + * Dispatch messages against individual network devices + * + */ +static DBusHandlerResult nm_dbus_devices_message_handler (DBusConnection *connection, DBusMessage *message, void *user_data) +{ + const char *method; + const char *path; + DBusMessage *reply_message = NULL; + + method = dbus_message_get_member (message); + path = dbus_message_get_path (message); + + /* NM_DEBUG_PRINT_2 ("nm_dbus_nm_message_handler() got method %s for path %s\n", method, path); */ + + reply_message = nm_dbus_devices_handle_request (connection, message, path, method); + dbus_connection_send (connection, reply_message, NULL); + + return DBUS_HANDLER_RESULT_HANDLED; +} + + +/* + * nm_dbus_devices_unregister_handler + * + * Nothing happens here. + * + */ +void nm_dbus_devices_unregister_handler (DBusConnection *connection, void *user_data) +{ + /* do nothing */ +} + + +/* + * nm_dbus_init + * + * Connect to the system messagebus and register ourselves as a service. + * + */ +DBusConnection *nm_dbus_init (void) +{ + DBusError dbus_error; + dbus_bool_t success; + DBusConnection *dbus_connection; + DBusObjectPathVTable nm_vtable = { &nm_dbus_nm_unregister_handler, &nm_dbus_nm_message_handler, NULL, NULL, NULL, NULL }; + const char *nm_path[] = { "org", "freedesktop", "NetworkManager", NULL }; + DBusObjectPathVTable devices_vtable = { &nm_dbus_devices_unregister_handler, &nm_dbus_devices_message_handler, NULL, NULL, NULL, NULL }; + const char *devices_path[] = { "org", "freedesktop", "NetworkManager", "Devices", NULL }; + + dbus_connection_set_change_sigpipe (TRUE); + + dbus_error_init (&dbus_error); + dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error); + if (dbus_connection == NULL) + { + NM_DEBUG_PRINT ("nm_dbus_init() could not get the system bus. Make sure the message bus daemon is running?\n"); + return (NULL); + } + + dbus_connection_set_exit_on_disconnect (dbus_connection, FALSE); + dbus_connection_setup_with_g_main (dbus_connection, NULL); + dbus_bus_acquire_service (dbus_connection, NM_DBUS_NM_NAMESPACE, 0, &dbus_error); + if (dbus_error_is_set (&dbus_error)) + { + NM_DEBUG_PRINT_1 ("nm_dbus_init() could not acquire its service. dbus_bus_acquire_service() says: '%s'\n", dbus_error.message); + return (NULL); + } + + success = dbus_connection_register_object_path (dbus_connection, nm_path, &nm_vtable, NULL); + if (!success) + { + NM_DEBUG_PRINT ("nm_dbus_init() could not register a handler for NetworkManager. Not enough memory?\n"); + return (NULL); + } + + success = dbus_connection_register_fallback (dbus_connection, devices_path, &devices_vtable, NULL); + if (!success) + { + NM_DEBUG_PRINT ("nm_dbus_init() could not register a handler for NetworkManager devices. Not enough memory?\n"); + return (NULL); + } + + return (dbus_connection); +} diff --git a/src/NetworkManagerDbus.h b/src/NetworkManagerDbus.h new file mode 100644 index 000000000..17efa44a3 --- /dev/null +++ b/src/NetworkManagerDbus.h @@ -0,0 +1,41 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_DBUS_H +#define NETWORK_MANAGER_DBUS_H + +#include +#include + + +#define NM_DBUS_NM_OBJECT_PATH_PREFIX "/org/freedesktop/NetworkManager" +#define NM_DBUS_NM_NAMESPACE "org.freedesktop.NetworkManager" +#define NM_DBUS_DEVICES_OBJECT_PATH_PREFIX "/org/freedesktop/NetworkManager/Devices" +#define NM_DBUS_DEVICES_NAMESPACE "org.freedesktop.NetworkManager.Devices" + + +DBusConnection * nm_dbus_init (void); + +void nm_dbus_signal_device_no_longer_active (DBusConnection *connection, NMDevice *dev); + +void nm_dbus_signal_device_now_active (DBusConnection *connection, NMDevice *dev); + +#endif diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c new file mode 100644 index 000000000..2da37c3ae --- /dev/null +++ b/src/NetworkManagerDevice.c @@ -0,0 +1,837 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "NetworkManager.h" +#include "NetworkManagerDevice.h" +#include "NetworkManagerUtils.h" + +extern gboolean debug; + +static gboolean mii_get_link (NMDevice *dev); +static void nm_device_link_detection_init (NMDevice *dev); + +/* + * nm_device_is_wireless + * + * Test whether a given device is a wireless one or not. + * + */ +static gboolean nm_device_is_wireless (NMDevice *dev) +{ + int iwlib_socket; + int error; + iwstats stats; + + g_return_val_if_fail (dev != NULL, FALSE); + + iwlib_socket = iw_sockets_open (); + error = iw_get_stats (iwlib_socket, nm_device_get_iface (dev), &stats, NULL, FALSE); + close (iwlib_socket); + return (error == 0); +} + + +/* + * nm_device_supports_wireless_scan + * + * Test whether a given device is a wireless one or not. + * + */ +static gboolean nm_device_supports_wireless_scan (NMDevice *dev) +{ + int iwlib_socket; + int error; + iwstats stats; + gboolean can_scan = TRUE; + wireless_scan_head scan_data; + + g_return_val_if_fail (dev != NULL, FALSE); + + iwlib_socket = iw_sockets_open (); + error = iw_scan (iwlib_socket, nm_device_get_iface (dev), WIRELESS_EXT, &scan_data); + nm_dispose_scan_results (scan_data.result); + if ((error == -1) && (errno == EOPNOTSUPP)) + can_scan = FALSE; + close (iwlib_socket); + return (can_scan); +} + + +/* + * nm_get_device_by_udi + * + * Search through the device list for a device with a given UDI. + * + * NOTE: the caller MUST hold the device list mutex already to make + * this routine thread-safe. + * + */ +NMDevice *nm_get_device_by_udi (NMData *data, const char *udi) +{ + NMDevice *dev = NULL; + GSList *element; + + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (udi != NULL, NULL); + + element = data->dev_list; + while (element) + { + dev = (NMDevice *)(element->data); + if (dev) + { + if (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0) + break; + } + + element = g_slist_next (element); + } + + return (dev); +} + + +/* + * nm_get_device_by_iface + * + * Search through the device list for a device with a given iface. + * + * NOTE: the caller MUST hold the device list mutex already to make + * this routine thread-safe. + * + */ +NMDevice *nm_get_device_by_iface (NMData *data, const char *iface) +{ + NMDevice *iter_dev = NULL; + NMDevice *found_dev = NULL; + GSList *element; + + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (iface != NULL, NULL); + + element = data->dev_list; + while (element) + { + iter_dev = (NMDevice *)(element->data); + if (iter_dev) + { + if (nm_null_safe_strcmp (nm_device_get_iface (iter_dev), iface) == 0) + { + found_dev = iter_dev; + break; + } + } + + element = g_slist_next (element); + } + + return (found_dev); +} + + +/*****************************************************************************/ +/* NMDevice object routines */ +/*****************************************************************************/ + +typedef struct NMDeviceWirelessOptions +{ + gchar *cur_essid; + gboolean supports_wireless_scan; + GMutex *ap_list_mutex; + GSList *ap_list; +} NMDeviceWirelessOptions; + +typedef struct NMDeviceWiredOptions +{ + int foo; +} NMDeviceWiredOptions; + +typedef union NMDeviceOptions +{ + NMDeviceWirelessOptions wireless; + NMDeviceWiredOptions wired; +} NMDeviceOptions; + +/* + * NetworkManager device structure + */ +struct NMDevice +{ + guint refcount; + gchar *udi; + gchar *iface; + NMIfaceType iface_type; + gboolean link_active; + NMDeviceOptions dev_options; +}; + + +/* + * nm_device_new + * + * Creates and initializes the structure representation of an NLM device. + * + */ +NMDevice *nm_device_new (const char *iface) +{ + NMDevice *dev; + + g_return_val_if_fail (iface != NULL, NULL); + + dev = g_new0 (NMDevice, 1); + if (!dev) + { + NM_DEBUG_PRINT("nm_device_new() could not allocate a new device... Not enough memory?\n"); + return (NULL); + } + + dev->refcount = 1; + dev->iface = g_strdup (iface); + dev->iface_type = nm_device_is_wireless (dev) ? + NM_IFACE_TYPE_WIRELESS_ETHERNET : NM_IFACE_TYPE_WIRED_ETHERNET; + + if (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + dev->dev_options.wireless.supports_wireless_scan = nm_device_supports_wireless_scan (dev); + + dev->dev_options.wireless.ap_list_mutex = g_mutex_new(); + if (!dev->dev_options.wireless.ap_list_mutex) + { + g_free (dev->iface); + return (NULL); + } + } + + /* Have to bring the device up before checking link status. */ + if (!nm_device_is_up (dev)) + nm_device_bring_up (dev); + nm_device_update_link_active (dev, TRUE); + + return (dev); +} + + +/* + * Refcounting functions + */ +void nm_device_ref (NMDevice *dev) +{ + g_return_if_fail (dev != NULL); + + dev->refcount++; +} + +void nm_device_unref (NMDevice *dev) +{ + g_return_if_fail (dev != NULL); + + dev->refcount--; + if (dev->refcount == 0) + { + nm_device_ap_list_clear (dev); + dev->dev_options.wireless.ap_list = NULL; + + g_free (dev->udi); + g_free (dev->iface); + if (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + g_free (dev->dev_options.wireless.cur_essid); + g_mutex_free (dev->dev_options.wireless.ap_list_mutex); + } + + dev->udi = NULL; + dev->iface = NULL; + } +} + + +/* + * Get/set functions for UDI + */ +char * nm_device_get_udi (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, NULL); + + return (dev->udi); +} + +void nm_device_set_udi (NMDevice *dev, const char *udi) +{ + g_return_if_fail (dev != NULL); + g_return_if_fail (udi != NULL); + + if (dev->udi) + g_free (dev->udi); + + dev->udi = g_strdup (udi); +} + + +/* + * Get/set functions for iface + */ +char * nm_device_get_iface (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, NULL); + + return (dev->iface); +} + + +/* + * Get/set functions for iface_type + */ +guint nm_device_get_iface_type (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, NM_IFACE_TYPE_DONT_KNOW); + + return (dev->iface_type); +} + + +/* + * Get/set functions for link_active + */ +gboolean nm_device_get_link_active (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, FALSE); + + return (dev->link_active); +} + +void nm_device_set_link_active (NMDevice *dev, const gboolean link_active) +{ + g_return_if_fail (dev != NULL); + + dev->link_active = link_active; +} + + +/* + * Get function for supports_wireless_scan + */ +gboolean nm_device_get_supports_wireless_scan (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, FALSE); + + return (dev->dev_options.wireless.supports_wireless_scan); +} + + +/* + * nm_device_update_link_active + * + * Updates the link state for a particular device. + * + */ +gboolean nm_device_update_link_active (NMDevice *dev, gboolean check_mii) +{ + gboolean link_active = FALSE; + + g_return_val_if_fail (dev != NULL, FALSE); + + /* FIXME + * For wireless cards, the best indicator of a "link" at this time + * seems to be whether the card has a valid access point MAC address. + * Is there a better way? + */ + + switch (nm_device_get_iface_type (dev)) + { + case NM_IFACE_TYPE_WIRELESS_ETHERNET: + { + struct iwreq wrq; + int iwlib_socket; + + iwlib_socket = iw_sockets_open (); + if (iw_get_ext (iwlib_socket, nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0) + { + struct ether_addr invalid_addr1; + struct ether_addr invalid_addr2; + struct ether_addr invalid_addr3; + struct ether_addr ap_addr; + + /* Compare the AP address the card has with invalid ethernet MAC addresses. + */ + memcpy (&ap_addr, &(wrq.u.ap_addr.sa_data), sizeof (struct ether_addr)); + memset (&invalid_addr1, 0xFF, sizeof(struct ether_addr)); + memset (&invalid_addr2, 0x00, sizeof(struct ether_addr)); + memset (&invalid_addr2, 0x44, sizeof(struct ether_addr)); + if ( (memcmp(&ap_addr, &invalid_addr1, sizeof(struct ether_addr)) != 0) + && (memcmp(&ap_addr, &invalid_addr2, sizeof(struct ether_addr)) != 0) + && (memcmp(&ap_addr, &invalid_addr3, sizeof(struct ether_addr)) != 0)) + link_active = TRUE; + } + close (iwlib_socket); + break; + } + + case NM_IFACE_TYPE_WIRED_ETHERNET: + { + if (check_mii) + link_active = mii_get_link (dev); + else + if (hal_device_property_exists (nm_get_global_data()->hal_ctx, nm_device_get_udi (dev), "net.ethernet.link")) + link_active = hal_device_get_property_bool (nm_get_global_data()->hal_ctx, nm_device_get_udi (dev), "net.ethernet.link"); + break; + } + + default: + link_active = nm_device_get_link_active (dev); /* Can't get link info for this device, so don't change link status */ + break; + } + + /* Update device link status and global state variable if the status changed */ + if (link_active != nm_device_get_link_active (dev)) + { + nm_device_set_link_active (dev, link_active); + nm_data_set_state_modified (nm_get_global_data(), TRUE); + } + return (link_active); +} + + +/* + * nm_device_get_essid + * + * If a device is wireless, return the essid that it is attempting + * to use. + * + * Returns: allocated string containing essid. Must be freed by caller. + * + */ +char * nm_device_get_essid (NMDevice *dev) +{ + int iwlib_socket; + int err; + struct iwreq wreq; + char essid[IW_ESSID_MAX_SIZE + 1]; + + g_return_val_if_fail (dev != NULL, NULL); + g_return_val_if_fail (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET, NULL); + + iwlib_socket = iw_sockets_open (); + if (iwlib_socket >= 0) + { + wreq.u.essid.pointer = (caddr_t) essid; + wreq.u.essid.length = IW_ESSID_MAX_SIZE + 1; + wreq.u.essid.flags = 0; + err = iw_get_ext (iwlib_socket, nm_device_get_iface (dev), SIOCGIWESSID, &wreq); + if (err >= 0) + { + if (dev->dev_options.wireless.cur_essid) + g_free (dev->dev_options.wireless.cur_essid); + dev->dev_options.wireless.cur_essid = g_strdup (essid); + } + else + NM_DEBUG_PRINT_2 ("nm_device_get_essid(): error setting ESSID for device %s. errno = %d\n", nm_device_get_iface (dev), errno); + + close (iwlib_socket); + } + + return (dev->dev_options.wireless.cur_essid); +} + + +/* + * nm_device_set_essid + * + * If a device is wireless, set the essid that it should use. + */ +void nm_device_set_essid (NMDevice *dev, const char *essid) +{ + int iwlib_socket; + int err; + struct iwreq wreq; + unsigned char safe_essid[IW_ESSID_MAX_SIZE + 1] = "\0"; + + g_return_if_fail (dev != NULL); + g_return_if_fail (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET); + + /* Make sure the essid we get passed is a valid size */ + if (!essid) + safe_essid[0] = '\0'; + else + { + strncpy (safe_essid, essid, IW_ESSID_MAX_SIZE); + safe_essid[IW_ESSID_MAX_SIZE] = '\0'; + } + + iwlib_socket = iw_sockets_open (); + if (iwlib_socket >= 0) + { + wreq.u.essid.pointer = (caddr_t) safe_essid; + wreq.u.essid.length = strlen (safe_essid) + 1; + wreq.u.essid.flags = 1; /* Enable essid on card */ + + err = iw_set_ext (iwlib_socket, nm_device_get_iface (dev), SIOCSIWESSID, &wreq); + if (err == -1) + NM_DEBUG_PRINT_2 ("nm_device_set_essid(): error setting ESSID for device %s. errno = %d\n", nm_device_get_iface (dev), errno); + + close (iwlib_socket); + } +} + + +/* + * nm_device_set_wep_key + * + * If a device is wireless, set the WEP key that it should use. + * + * wep_key: WEP key to use, or NULL or "" to disable WEP + */ +void nm_device_set_wep_key (NMDevice *dev, const char *wep_key) +{ + int iwlib_socket; + int err; + struct iwreq wreq; + int keylen; + unsigned char safe_key[IW_ENCODING_TOKEN_MAX]; + gboolean set_key = FALSE; + + char *it = NULL; + + g_return_if_fail (dev != NULL); + g_return_if_fail (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET); + + /* Make sure the essid we get passed is a valid size */ + if (!wep_key) + safe_key[0] = '\0'; + else + { + strncpy (safe_key, wep_key, IW_ENCODING_TOKEN_MAX); + safe_key[IW_ENCODING_TOKEN_MAX] = '\0'; + } + + iwlib_socket = iw_sockets_open (); + if (iwlib_socket >= 0) + { + wreq.u.data.pointer = (caddr_t) NULL; + wreq.u.data.flags = IW_ENCODE_ENABLED; + wreq.u.data.length = 0; + + if (strlen (safe_key) == 0) + { + wreq.u.data.flags = IW_ENCODE_DISABLED | IW_ENCODE_NOKEY; /* Disable WEP */ + set_key = TRUE; + } + else + { + keylen = iw_in_key_full(iwlib_socket, nm_device_get_iface (dev), "", safe_key, &wreq.u.data.flags); + if (keylen > 0) + { + wreq.u.data.pointer = (caddr_t) safe_key; + wreq.u.data.length = keylen; + set_key = TRUE; + } + } + + if (set_key) + { + err = iw_set_ext (iwlib_socket, nm_device_get_iface (dev), SIOCSIWENCODE, &wreq); + if (err == -1) + NM_DEBUG_PRINT_2 ("nm_device_set_wep_key(): error setting key for device %s. errno = %d\n", nm_device_get_iface (dev), errno); + } + + close (iwlib_socket); + } +} + + +/* + * nm_device_set_up_down + * + * Set the up flag on the device on or off + * + */ +static void nm_device_set_up_down (NMDevice *dev, gboolean up) +{ + struct ifreq ifr; + int iface_fd; + int err; + guint32 flags = up ? IFF_UP : ~IFF_UP; + + g_return_if_fail (dev != NULL); + + iface_fd = nm_get_network_control_socket (); + if (iface_fd < 0) + return; + + /* Get flags already there */ + strcpy (ifr.ifr_name, nm_device_get_iface (dev)); + err = ioctl (iface_fd, SIOCGIFFLAGS, &ifr); + if (!err) + { + /* If the interface doesn't have those flags already, + * set them on it. + */ + if ((ifr.ifr_flags^flags) & IFF_UP) + { + ifr.ifr_flags &= ~IFF_UP; + ifr.ifr_flags |= IFF_UP & flags; + err = ioctl (iface_fd, SIOCSIFFLAGS, &ifr); + if (err) + NM_DEBUG_PRINT_3 ("nm_device_set_up_down() could not bring device %s %s. errno = %d\n", nm_device_get_iface (dev), (up ? "up" : "down"), errno ); + } + } + else + NM_DEBUG_PRINT_2 ("nm_device_set_up_down() could not get flags for device %s. errno = %d\n", nm_device_get_iface (dev), errno ); + + close (iface_fd); +} + + +/* + * Interface state functions: bring up, down, check + * + */ +void nm_device_bring_up (NMDevice *dev) +{ + g_return_if_fail (dev != NULL); + + nm_device_set_up_down (dev, TRUE); +} + +void nm_device_bring_down (NMDevice *dev) +{ + int fd; + + g_return_if_fail (dev != NULL); + + nm_device_set_up_down (dev, FALSE); +} + +gboolean nm_device_is_up (NMDevice *dev) +{ + int iface_fd; + struct ifreq ifr; + int err; + + g_return_if_fail (dev != NULL); + + iface_fd = nm_get_network_control_socket (); + if (iface_fd < 0) + return (FALSE); + + /* Get device's flags */ + strcpy (ifr.ifr_name, nm_device_get_iface (dev)); + err = ioctl (iface_fd, SIOCGIFFLAGS, &ifr); + close (iface_fd); + if (!err) + return (!((ifr.ifr_flags^IFF_UP) & IFF_UP)); + + NM_DEBUG_PRINT_2 ("nm_device_is_up() could not get flags for device %s. errno = %d\n", nm_device_get_iface (dev), errno ); + return (FALSE); +} + + +/* + * nm_device_ap_list_add + * + * Add an access point to the devices internal AP list. + * + */ +void nm_device_ap_list_add (NMDevice *dev, NMAccessPoint *ap) +{ + g_return_if_fail (dev != NULL); + g_return_if_fail (ap != NULL); + g_return_if_fail (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET); + + if (nm_try_acquire_mutex (dev->dev_options.wireless.ap_list_mutex, __FUNCTION__)) + { + nm_ap_ref (ap); + dev->dev_options.wireless.ap_list = g_slist_append (dev->dev_options.wireless.ap_list, ap); + + nm_unlock_mutex (dev->dev_options.wireless.ap_list_mutex, __FUNCTION__); + } +} + + +/* + * nm_device_ap_list_clear + * + * Clears out the device's internal list of available access points. + * + */ +void nm_device_ap_list_clear (NMDevice *dev) +{ + GSList *element; + + g_return_if_fail (dev != NULL); + g_return_if_fail (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET); + + if (!dev->dev_options.wireless.ap_list) + return; + + if (nm_try_acquire_mutex (dev->dev_options.wireless.ap_list_mutex, __FUNCTION__)) + { + element = dev->dev_options.wireless.ap_list; + while (element) + { + if (element->data) + { + nm_ap_unref (element->data); + element->data = NULL; + } + + element = g_slist_next (element); + } + + g_slist_free (dev->dev_options.wireless.ap_list); + dev->dev_options.wireless.ap_list = NULL; + + nm_unlock_mutex (dev->dev_options.wireless.ap_list_mutex, __FUNCTION__); + } +} + + +/* + * nm_device_ap_list_get_copy + * + * Copy the list of ESSIDs + * + */ +NMAccessPoint *nm_device_ap_list_get_ap (NMDevice *dev, int index) +{ + GSList *element; + NMAccessPoint *ap = NULL; + + g_return_val_if_fail (dev != NULL, NULL); + g_return_val_if_fail (dev->iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET, NULL); + + if (!dev->dev_options.wireless.ap_list) + return; + + if (nm_try_acquire_mutex (dev->dev_options.wireless.ap_list_mutex, __FUNCTION__)) + { + int i = 0; + + element = dev->dev_options.wireless.ap_list; + while (element) + { + if (element->data && (index == i)) + { + ap = (NMAccessPoint *)(element->data); + break; + } + + i++; + element = g_slist_next (element); + } + nm_unlock_mutex (dev->dev_options.wireless.ap_list_mutex, __FUNCTION__); + } + + return (ap); +} + + +/****************************************/ +/* Code ripped from HAL */ +/* minor modifications made for */ +/* integration with NLM */ +/****************************************/ + +/** Read a word from the MII transceiver management registers + * + * @param iface Which interface + * @param location Which register + * @return Word that is read + */ +static guint16 mdio_read (int sockfd, struct ifreq *ifr, int location, gboolean new_ioctl_nums) +{ + guint16 *data = (guint16 *) &(ifr->ifr_data); + + data[1] = location; + if (ioctl (sockfd, new_ioctl_nums ? 0x8948 : SIOCDEVPRIVATE + 1, ifr) < 0) + { + NM_DEBUG_PRINT_2("SIOCGMIIREG on %s failed: %s\n", ifr->ifr_name, strerror (errno)); + return -1; + } + return data[3]; +} + +static gboolean mii_get_link (NMDevice *dev) +{ + int sockfd; + struct ifreq ifr; + gboolean new_ioctl_nums; + guint16 status_word; + gboolean link_active = FALSE; + + sockfd = socket (AF_INET, SOCK_DGRAM, 0); + if (sockfd < 0) + { + NM_DEBUG_PRINT_2("cannot open socket on interface %s; errno=%d", nm_device_get_iface (dev), errno); + return (FALSE); + } + + snprintf (ifr.ifr_name, IFNAMSIZ, nm_device_get_iface (dev)); + if (ioctl (sockfd, 0x8947, &ifr) >= 0) + new_ioctl_nums = TRUE; + else if (ioctl (sockfd, SIOCDEVPRIVATE, &ifr) >= 0) + new_ioctl_nums = FALSE; + else + { + NM_DEBUG_PRINT_2("SIOCGMIIPHY on %s failed: %s", ifr.ifr_name, strerror (errno)); + close (sockfd); + return (FALSE); + } + + /* Refer to http://www.scyld.com/diag/mii-status.html for + * the full explanation of the numbers + * + * 0x8000 Capable of 100baseT4. + * 0x7800 Capable of 10/100 HD/FD (most common). + * 0x0040 Preamble suppression permitted. + * 0x0020 Autonegotiation complete. + * 0x0010 Remote fault. + * 0x0008 Capable of Autonegotiation. + * 0x0004 Link established ("sticky"* on link failure) + * 0x0002 Jabber detected ("sticky"* on transmit jabber) + * 0x0001 Extended MII register exist. + * + */ + + /* We have to read it twice to clear any "sticky" bits */ + status_word = mdio_read (sockfd, &ifr, 1, new_ioctl_nums); + status_word = mdio_read (sockfd, &ifr, 1, new_ioctl_nums); + + if ((status_word & 0x0016) == 0x0004) + link_active = TRUE; + else + link_active = FALSE; + + close (sockfd); + + return (link_active); +} + +/****************************************/ +/* End Code ripped from HAL */ +/****************************************/ diff --git a/src/NetworkManagerDevice.h b/src/NetworkManagerDevice.h new file mode 100644 index 000000000..86ade2ac7 --- /dev/null +++ b/src/NetworkManagerDevice.h @@ -0,0 +1,79 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_DEVICE_H +#define NETWORK_MANAGER_DEVICE_H + +#include "NetworkManager.h" + +/* + * Types of NetworkManager devices + */ +enum NMIfaceType +{ + NM_IFACE_TYPE_DONT_KNOW, + NM_IFACE_TYPE_WIRED_ETHERNET, + NM_IFACE_TYPE_WIRELESS_ETHERNET +}; + +typedef struct NMDevice NMDevice; +typedef enum NMIfaceType NMIfaceType; + + +NMDevice * nm_device_new (const char *iface); + +void nm_device_ref (NMDevice *dev); +void nm_device_unref (NMDevice *dev); + +char * nm_device_get_udi (NMDevice *dev); +void nm_device_set_udi (NMDevice *dev, const char *udi); + +char * nm_device_get_iface (NMDevice *dev); + +NMIfaceType nm_device_get_iface_type (NMDevice *dev); +/* There is no nm_device_set_iface_type() because that's determined when you set the device's iface */ + +gboolean nm_device_get_link_active (NMDevice *dev); +void nm_device_set_link_active (NMDevice *dev, const gboolean active); +gboolean nm_device_update_link_active (NMDevice *dev, gboolean check_mii); + +gboolean nm_device_check_link_status (NMDevice *dev); + +char * nm_device_get_essid (NMDevice *dev); +void nm_device_set_essid (NMDevice *dev, const char *essid); + +gboolean nm_device_get_supports_wireless_scan (NMDevice *dev); + +/* There is no function to get the WEP key since that's a slight security risk */ +void nm_device_set_wep_key (NMDevice *dev, const char *wep_key); + +void nm_device_bring_up (NMDevice *dev); +void nm_device_bring_down (NMDevice *dev); +gboolean nm_device_is_up (NMDevice *dev); + +void nm_device_ap_list_add (NMDevice *dev, NMAccessPoint *ap); +void nm_device_ap_list_clear (NMDevice *dev); +NMAccessPoint *nm_device_ap_list_get_ap (NMDevice *dev, int index); + +NMDevice * nm_get_device_by_udi (NMData *data, const char *udi); +NMDevice * nm_get_device_by_iface (NMData *data, const char *iface); + +#endif diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c new file mode 100644 index 000000000..1aaf0a88a --- /dev/null +++ b/src/NetworkManagerPolicy.c @@ -0,0 +1,437 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include +#include +#include +#include + +#include "NetworkManagerPolicy.h" +#include "NetworkManagerUtils.h" +#include "NetworkManagerAP.h" + +extern gboolean debug; + + +/* + * nm_policy_activate_interface + * + * Performs interface switching and related networking goo. + * + */ +static void nm_policy_switch_interface (NMData *data, NMDevice *switch_to_dev, NMDevice *old_dev) +{ + unsigned char buf[500]; + unsigned char hostname[500] = "\0"; + const unsigned char *new_iface; + int host_err; + int dhclient_err; + FILE *pidfile; + unsigned char pid[20]; + + g_return_if_fail (data != NULL); + g_return_if_fail (switch_to_dev != NULL); + g_return_if_fail (nm_device_get_iface (switch_to_dev)); + g_return_if_fail (strlen (nm_device_get_iface (switch_to_dev)) >= 0); + + /* If its a wireless device, set the ESSID and WEP key */ + if (nm_device_get_iface_type (switch_to_dev) == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + /* If there is a desired AP to connect to, use that essid and possible WEP key */ + if ( data->desired_ap + && (nm_ap_get_essid (data->desired_ap) != NULL)) + { + nm_device_bring_down (switch_to_dev); + + nm_device_set_essid (switch_to_dev, nm_ap_get_essid (data->desired_ap)); + + /* Disable WEP */ + nm_device_set_wep_key (switch_to_dev, NULL); + if (nm_ap_get_wep_key (data->desired_ap)) + nm_device_set_wep_key (switch_to_dev, nm_ap_get_wep_key (data->desired_ap)); + } + else + { + /* If the card isn't up, bring it up so that we can scan. We may be too early here to have + * gotten all the scanning results, and therefore have no desired_ap. Just wait. + */ + if (!nm_device_is_up (switch_to_dev)); + nm_device_bring_up (switch_to_dev); + + NM_DEBUG_PRINT ("nm_policy_activate_interface() could not find a desired AP. Card doesn't support scanning?\n"); + return; /* Don't associate with any non-allowed access points */ + } + + NM_DEBUG_PRINT_1 ("nm_policy_activate_interface() using essid '%s'\n", nm_ap_get_essid (data->desired_ap)); + } + + host_err = gethostname (hostname, 500); + + /* Take out any entries in the routing table and any IP address the old interface + * had. + */ + if (old_dev && strlen (nm_device_get_iface (old_dev))) + { + /* Remove routing table entries */ + snprintf (buf, 500, "/sbin/ip route flush dev %s", nm_device_get_iface (old_dev)); + system (buf); + + /* Remove ip address */ + snprintf (buf, 500, "/sbin/ip address flush dev %s", nm_device_get_iface (old_dev)); + system (buf); + } + + /* Bring the device up */ + if (!nm_device_is_up (switch_to_dev)); + nm_device_bring_up (switch_to_dev); + + /* Kill the old default route */ + snprintf (buf, 500, "/sbin/ip route del default"); + system (buf); + + /* Find and kill the previous dhclient process for this interface */ + new_iface = nm_device_get_iface (switch_to_dev); + snprintf (buf, 500, "/var/run/dhclient-%s.pid", new_iface); + pidfile = fopen (buf, "r"); + if (pidfile) + { + int len; + + fgets (pid, 20, pidfile); + len = strnlen (buf, 20); + if (len >= 20) + pid[0] = '\0'; + else + pid[len-1] = '\0'; + fclose (pidfile); + + snprintf (buf, 500, "kill -9 %s", pid); + system (buf); + } + + snprintf (buf, 500, "/sbin/dhclient -1 -q -lf /var/lib/dhcp/dhclient-%s.leases -pf /var/run/dhclient-%s.pid -cf /etc/dhclient-%s.conf %s\n", + new_iface, new_iface, new_iface, new_iface); + dhclient_err = system (buf); + if (dhclient_err != 0) + { + /* Wireless devices cannot be down if they are the active interface, + * otherwise we cannot use them for scanning. + */ + if (nm_device_get_iface_type (switch_to_dev) == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + nm_device_set_essid (switch_to_dev, ""); + nm_device_set_wep_key (switch_to_dev, NULL); + nm_device_bring_up (switch_to_dev); + } + } + + /* Set the hostname back to what it was before so that X11 doesn't + * puke when the hostname changes, so that users can actually launch stuff. + */ + if (host_err >= 0) + sethostname (hostname, strlen (hostname)); + + /* Restart the nameservice caching daemon to make apps aware of new DNS servers */ + snprintf (buf, 500, "/sbin/service nscd restart"); + system (buf); +} + + +/* + * nm_state_modification_monitor + * + * Called every 2s and figures out which interface to switch the active + * network connection to if our global network state has changed. + * Global network state changes are triggered by: + * 1) insertion/deletion of interfaces + * 2) link state change of an interface + * 3) appearance/disappearance of an allowed wireless access point + * + */ +gboolean nm_state_modification_monitor (gpointer user_data) +{ + NMData *data = (NMData *)user_data; + gboolean modified = FALSE; + + g_return_val_if_fail (data != NULL, TRUE); + + /* Check global state modified variable, and reset it with + * appropriate locking. + */ + g_mutex_lock (data->state_modified_mutex); + modified = data->state_modified; + if (data->state_modified) + data->state_modified = FALSE; + g_mutex_unlock (data->state_modified_mutex); + + /* If any modifications to the data model were made, update + * network state based on policy applied to the data model. + */ + if (modified) + { + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + GSList *element = data->dev_list; + NMDevice *dev = NULL; + NMDevice *best_wired_dev = NULL; + guint best_wired_prio = 0; + NMDevice *best_wireless_dev = NULL; + guint best_wireless_prio = 0; + guint highest_priority = 0; + NMDevice *highest_priority_dev = NULL; + gboolean essid_change_needed = FALSE; + + while (element) + { + guint priority = 0; + guint iface_type; + gboolean link_active; + + dev = (NMDevice *)(element->data); + + iface_type = nm_device_get_iface_type (dev); + link_active = nm_device_get_link_active (dev); + + if (iface_type == NM_IFACE_TYPE_WIRED_ETHERNET) + { + guint prio = 0; + + if (link_active) + prio += 1; + + if (data->active_device + && (dev == data->active_device) + && link_active) + prio += 1; + if (prio > best_wired_prio) + { + best_wired_dev = dev; + best_wired_prio = prio; + } + } + else if (iface_type == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + guint prio = 0; + + if (link_active) + prio += 1; + + if (nm_device_get_supports_wireless_scan (dev)) + prio += 2; + + if ( data->active_device + && (dev == data->active_device) + && link_active) + prio += 3; + + if (prio > best_wireless_prio) + { + best_wireless_dev = dev; + best_wireless_prio = prio; + } + } + + element = g_slist_next (element); + } + + NM_DEBUG_PRINT_1 ("Best wired device = %s\n", best_wired_dev ? nm_device_get_iface (best_wired_dev) : "(null)"); + NM_DEBUG_PRINT_1 ("Best wireless device = %s\n", best_wireless_dev ? nm_device_get_iface (best_wireless_dev) : "(null)"); + + if (best_wireless_dev || best_wired_dev) + { + if (best_wired_dev) + highest_priority_dev = best_wired_dev; + else + highest_priority_dev = best_wireless_dev; + } + else + { + /* No devices at all, wait for them to change status */ + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + return (TRUE); + } + + /* If the current essid of the wireless card and the desired ap's essid are different, + * trigger an interface switch. We switch to the same interface, but we still need to bring + * the device up again to get a new DHCP address. However, don't switch if there is no + * desired ap. + */ + if (nm_device_get_iface_type (highest_priority_dev) == NM_IFACE_TYPE_WIRELESS_ETHERNET) + { + /* If we don't yet have a desired AP, attempt to get one. */ + if (!data->desired_ap) + nm_wireless_do_scan (data, highest_priority_dev); + + if ( data->desired_ap + && (nm_null_safe_strcmp (nm_device_get_essid (highest_priority_dev), nm_ap_get_essid (data->desired_ap)) != 0) + && (strlen (nm_ap_get_essid (data->desired_ap)) > 0)) + essid_change_needed = TRUE; + } + + /* If the highest priority device is different than data->active_device, switch the connection. */ + if ( essid_change_needed + || (!data->active_device || (highest_priority_dev == data->active_device))) + { + + NM_DEBUG_PRINT_2 ("**** Switching active interface from '%s' to '%s'\n", + data->active_device ? nm_device_get_iface (data->active_device) : "(null)", + nm_device_get_iface (highest_priority_dev)); + + /* FIXME + * How long should we wait between the signal to the bus, + * and deactivating the device? + */ + if (data->active_device) + { + nm_dbus_signal_device_no_longer_active (data->dbus_connection, data->active_device); + sleep (2); + } + + nm_policy_switch_interface (data, highest_priority_dev, data->active_device); + + if (data->active_device) + nm_device_unref (data->active_device); + data->active_device = highest_priority_dev; + nm_device_ref (data->active_device); + + nm_dbus_signal_device_now_active (data->dbus_connection, data->active_device); + + NM_DEBUG_PRINT ("**** Switched.\n"); + } + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + NM_DEBUG_PRINT("nm_state_modification_monitor() could not get device list mutex\n"); + } + + return (TRUE); +} + + +/* + * nm_policy_update_allowed_access_points + * + * Grabs a list of allowed access points from the user's preferences + * + */ +void nm_policy_update_allowed_access_points (NMData *data) +{ +#define NM_ALLOWED_AP_FILE "/etc/sysconfig/networking/allowed_access_points" + + FILE *ap_file; + + g_return_if_fail (data != NULL); + + if (nm_try_acquire_mutex (data->allowed_ap_list_mutex, NULL)) + { + ap_file = fopen (NM_ALLOWED_AP_FILE, "r"); + if (ap_file) + { + gchar line[ 500 ]; + gchar prio[ 20 ]; + gchar essid[ 50 ]; + gchar wep_key[ 50 ]; + + /* Free the old list of allowed access points */ + nm_data_allowed_ap_list_free (data); + + while (fgets (line, 499, ap_file)) + { + guint len = strnlen (line, 499); + gchar *p = &line[0]; + gchar *end = strchr (line, '\n'); + guint op = 0; + + strcpy (prio, "\0"); + strcpy (essid, "\0"); + strcpy (wep_key, "\0"); + + if (end) + *end = '\0'; + else + end = p + len - 1; + + while ((end-p > 0) && (*p=='\t')) + p++; + + while (end-p > 0) + { + switch (op) + { + case 0: + strncat (prio, p, 1); + break; + case 1: + strncat (essid, p, 1); + break; + case 2: + strncat (wep_key, p, 1); + break; + default: + break; + } + p++; + + if ((end-p > 0) && (*p=='\t')) + { + op++; + while ((end-p > 0) && (*p=='\t')) + p++; + } + } + + /* Create a new entry for this essid */ + if (strlen (essid) > 0) + { + NMAccessPoint *ap; + guint prio_num = atoi (prio); + + if (prio_num < 1) + prio_num = NM_AP_PRIORITY_WORST; + else if (prio_num > NM_AP_PRIORITY_WORST) + prio_num = NM_AP_PRIORITY_WORST; + + ap = nm_ap_new (); + nm_ap_set_priority (ap, prio_num); + nm_ap_set_essid (ap, essid); + nm_ap_set_wep_key (ap, wep_key); + + data->allowed_ap_list = g_slist_append (data->allowed_ap_list, ap); + /* + NM_DEBUG_PRINT_3( "FOUND: allowed ap, prio=%d essid=%s wep_key=%s\n", prio_num, essid, wep_key ); + */ + } + } + + fclose (ap_file); + } + else + NM_DEBUG_PRINT_1( "nm_policy_update_allowed_access_points() could not open and lock allowed ap list file %s. errno %d\n", NM_ALLOWED_AP_FILE ); + + nm_unlock_mutex (data->allowed_ap_list_mutex, NULL); + } + else + NM_DEBUG_PRINT( "nm_policy_update_allowed_access_points() could not lock allowed ap list mutex\n" ); +} + diff --git a/src/NetworkManagerPolicy.h b/src/NetworkManagerPolicy.h new file mode 100644 index 000000000..5fd5f8533 --- /dev/null +++ b/src/NetworkManagerPolicy.h @@ -0,0 +1,32 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_POLICY_H +#define NETWORK_MANAGER_POLICY_H + +#include "NetworkManager.h" +#include "NetworkManagerDevice.h" + +gboolean nm_state_modification_monitor (gpointer user_data); + +void nm_policy_update_allowed_access_points (NMData *data); + +#endif diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c new file mode 100644 index 000000000..2d80e862f --- /dev/null +++ b/src/NetworkManagerUtils.c @@ -0,0 +1,147 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include +#include + +#include "NetworkManager.h" +#include "NetworkManagerUtils.h" + +extern gboolean debug; + + +/* + * nm_try_acquire_mutex + * + * Tries to acquire a given mutex, sleeping a bit between tries. + * + * Returns: FALSE if mutex was not acquired + * TRUE if mutex was successfully acquired + */ +gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func) +{ + gint i = 5; + + g_return_val_if_fail (mutex != NULL, FALSE); + + while (i > 0) + { + if (g_mutex_trylock (mutex)) + { +/* + if (func) + NM_DEBUG_PRINT_1 ("MUTEX: %s got mutex\n", func); +*/ + return (TRUE); + } + usleep (500); + i++; + } + + return (FALSE); +} + + +/* + * nm_unlock_mutex + * + * Simply unlocks a mutex, balances nm_try_acquire_mutex() + * + */ +void nm_unlock_mutex (GMutex *mutex, const char *func) +{ + g_return_if_fail (mutex != NULL); + +/* + if (func) + NM_DEBUG_PRINT_1 ("MUTEX: %s released mutex\n", func); +*/ + g_mutex_unlock (mutex); +} + + +/* + * nm_null_safe_strcmp + * + * Doesn't freaking segfault if s1/s2 are NULL + * + */ +int nm_null_safe_strcmp (const char *s1, const char *s2) +{ + if (!s1 && !s2) + return 0; + if (!s1 && s2) + return -1; + if (s1 && !s2) + return 1; + + return (strcmp (s1, s2)); +} + + + +/* + * nm_get_network_control_socket + * + * Get a control socket for network operations. + * + */ +int nm_get_network_control_socket (void) +{ + int fd; + + /* Try to grab a control socket */ + fd = socket(PF_INET, SOCK_DGRAM, 0); + if (fd >= 0) + return (fd); + fd = socket(PF_PACKET, SOCK_DGRAM, 0); + if (fd >= 0) + return (fd); + fd = socket(PF_INET6, SOCK_DGRAM, 0); + if (fd >= 0) + return (fd); + + NM_DEBUG_PRINT ("nm_get_network_control_socket() could not get network control socket.\n"); + return (-1); +} + + + +/* + * nm_dispose_scan_results + * + * Free memory used by the wireless scan results structure + * + */ +void nm_dispose_scan_results (wireless_scan *result_list) +{ + wireless_scan *tmp = result_list; + + while (tmp) + { + wireless_scan *tmp2 = tmp; + + tmp = tmp->next; + free (tmp2); + } +} diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h new file mode 100644 index 000000000..07cef689f --- /dev/null +++ b/src/NetworkManagerUtils.h @@ -0,0 +1,47 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_UTILS_H +#define NETWORK_MANAGER_UTILS_H + +#include +#include +#include + +#include "NetworkManager.h" + +#define NM_DEBUG_PRINT( s ) if (debug) fprintf( stderr, s ); +#define NM_DEBUG_PRINT_1( s, a ) if (debug) fprintf( stderr, s, a ); +#define NM_DEBUG_PRINT_2( s, a, b ) if (debug) fprintf( stderr, s, a, b ); +#define NM_DEBUG_PRINT_3( s, a, b, c ) if (debug) fprintf( stderr, s, a, b, c ); +#define NM_DEBUG_PRINT_4( s, a, b, c, d ) if (debug) fprintf( stderr, s, a, b, c, d ); + + +gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func); +void nm_unlock_mutex (GMutex *mutex, const char *func); + +int nm_null_safe_strcmp (const char *s1, const char *s2); + +int nm_get_network_control_socket (void); + +void nm_dispose_scan_results (wireless_scan *result_list); + +#endif diff --git a/src/NetworkManagerWireless.c b/src/NetworkManagerWireless.c new file mode 100644 index 000000000..52f2690e4 --- /dev/null +++ b/src/NetworkManagerWireless.c @@ -0,0 +1,215 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include "NetworkManager.h" +#include "NetworkManagerDevice.h" +#include "NetworkManagerWireless.h" +#include "NetworkManagerPolicy.h" +#include "NetworkManagerUtils.h" + +extern gboolean debug; + + +/* + * nm_wireless_is_most_prefered_ap + * + * For a given AP, filter it through the allowed list and return TRUE if its + * both allowed _and_ has a better priority than highest_priority. + * + */ +static gboolean nm_wireless_is_most_prefered_ap (NMAccessPoint *ap, int *highest_priority) +{ + NMData *data = nm_get_global_data (); + GSList *element; + gboolean is_most_preferred = FALSE; + + g_return_val_if_fail (ap != NULL, FALSE); + + /* Attempt to acquire mutex for device list iteration. + * If the acquire fails, just ignore the scan completely. + */ + if (nm_try_acquire_mutex (data->allowed_ap_list_mutex, __FUNCTION__)) + { + element = data->allowed_ap_list; + while (element) + { + NMAccessPoint *allowed_ap = (NMAccessPoint *)(element->data); + + /* If the essid of the scanned ap matches one in our allowed list, and this AP is + * a higher priority than one we may possibly have already found. + */ + if ( allowed_ap + && (nm_null_safe_strcmp (nm_ap_get_essid (allowed_ap), nm_ap_get_essid (ap)) == 0) + && (nm_ap_get_priority (allowed_ap) < *highest_priority)) + { + is_most_preferred = TRUE; + break; + } + + element = g_slist_next (element); + } + nm_unlock_mutex (data->allowed_ap_list_mutex, __FUNCTION__); + } + else + NM_DEBUG_PRINT( "nm_wireless_is_most_prefered_ap() could not acquire allowed access point mutex.\n" ); + + return (is_most_preferred); +} + + +/* + * nm_wireless_do_scan + * + * Runs the actual scan fore access points. + * + */ +void nm_wireless_do_scan (NMData *data, NMDevice *dev) +{ + int iwlib_socket; + + g_return_if_fail (data != NULL); + g_return_if_fail (dev != NULL); + + if (nm_device_get_iface_type (dev) != NM_IFACE_TYPE_WIRELESS_ETHERNET) + return; + + if (nm_device_get_supports_wireless_scan (dev) == FALSE) + return; + + /* Device must be up before we can scan */ + if (!nm_device_is_up (dev)) + nm_device_bring_up (dev); + + iwlib_socket = iw_sockets_open (); + if (iwlib_socket >= 0) + { + wireless_scan_head scan_results = { NULL, 0 }; + wireless_scan *tmp_ap; + int err; + NMAccessPoint *highest_priority_ap = NULL; + int highest_priority = NM_AP_PRIORITY_WORST; + + /* Clear out the device's ap list */ + nm_device_ap_list_clear (dev); + + err = iw_scan (iwlib_socket, nm_device_get_iface (dev), WIRELESS_EXT, &scan_results); + + /* Iterate over scan results and pick a "most" preferred access point. */ + tmp_ap = scan_results.result; + while (tmp_ap) + { + /* Blank essids usually indicate an AP that is not broadcasting its essid, + * but since its not broadcasting the essid, we cannot use that ap yet. + */ + if (tmp_ap->b.has_essid && tmp_ap->b.essid_on && (strlen (tmp_ap->b.essid) > 0)) + { + NMAccessPoint *nm_ap = nm_ap_new (); + + /* Copy over info from scan to local structure */ + nm_ap_set_essid (nm_ap, tmp_ap->b.essid); + + if (tmp_ap->has_ap_addr) + { + char buf[20]; + + memset (&buf[0], 0, 20); + iw_ether_ntop((const struct ether_addr *) (tmp_ap->ap_addr.sa_data), &buf[0]); + nm_ap_set_address (nm_ap, buf); + } + + nm_ap_set_quality (nm_ap, tmp_ap->stats.qual.qual); + + if (tmp_ap->b.has_freq) + nm_ap_set_freq (nm_ap, tmp_ap->b.freq); + + /* Add the AP to the device's AP list, no matter if its allowed or not */ + nm_device_ap_list_add (dev, nm_ap); + + if (nm_wireless_is_most_prefered_ap (nm_ap, &highest_priority)) + { + if (highest_priority_ap) + nm_ap_unref (highest_priority_ap); + + highest_priority_ap = nm_ap_new_from_ap (nm_ap); + } + nm_ap_unref (nm_ap); + } + tmp_ap = tmp_ap->next; + } + nm_dispose_scan_results (scan_results.result); + + /* If we have the "most" preferred access point, and its different than the current + * access point, switch to it during the next cycle. + */ + if ( highest_priority_ap + && (!data->desired_ap || (nm_null_safe_strcmp (nm_device_get_essid (dev), nm_ap_get_essid (highest_priority_ap)) != 0))) + { + if (data->desired_ap) + nm_ap_unref (data->desired_ap); + + data->desired_ap = nm_ap_new_from_ap (highest_priority_ap); + data->state_modified = TRUE; + + nm_ap_unref (highest_priority_ap); + } + close (iwlib_socket); + } + else + NM_DEBUG_PRINT ("nm_wireless_do_scan() could not get a control socket for the wireless card.\n" ); +} + + +/* + * nm_wireless_scan_monitor + * + * Called every 10s to get a list of access points. + * + */ +gboolean nm_wireless_scan_monitor (gpointer user_data) +{ + NMData *data = (NMData *)user_data; + GSList *element; + NMDevice *dev; + + g_return_val_if_fail (data != NULL, TRUE); + if (!data->active_device) + return (TRUE); + + /* Grab a current list of allowed access points */ + nm_policy_update_allowed_access_points (data); + + /* Attempt to acquire mutex for device list iteration. + * If the acquire fails, just ignore the scan completely. + */ + if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) + { + if (data->active_device && (nm_device_get_iface_type (data->active_device) == NM_IFACE_TYPE_WIRELESS_ETHERNET)) + nm_wireless_do_scan (data, data->active_device); + + nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); + } + else + NM_DEBUG_PRINT( "nm_wireless_scan_monitor() could not acquire device list mutex.\n" ); + + return (TRUE); +} diff --git a/src/NetworkManagerWireless.h b/src/NetworkManagerWireless.h new file mode 100644 index 000000000..dce45a697 --- /dev/null +++ b/src/NetworkManagerWireless.h @@ -0,0 +1,28 @@ +/* NetworkManager -- Network link manager + * + * Dan Williams + * + * 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. + * + * (C) Copyright 2004 Red Hat, Inc. + */ + +#ifndef NETWORK_MANAGER_WIRELESS_H +#define NETWORK_MANAGER_WIRELESS_H + + +gboolean nm_wireless_scan_monitor (gpointer user_data); + +#endif diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 000000000..78251bd30 --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,11 @@ +INCLUDES = \ + $(NM_CFLAGS) \ + -DDBUS_API_SUBJECT_TO_CHANGE \ + -DBINDIR=\"$(bindir)\" \ + -DDATADIR=\"$(datadir)\" + +noinst_PROGRAMS = nmclienttest + +nmclienttest_SOURCES = nmclienttest.c + +nmclienttest_LDADD = $(NM_LIBS) diff --git a/test/Makefile.in b/test/Makefile.in new file mode 100644 index 000000000..c81ba96a3 --- /dev/null +++ b/test/Makefile.in @@ -0,0 +1,366 @@ +# Makefile.in generated by automake 1.7.9 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# 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@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +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 = : +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IWLIB = @IWLIB@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +NM_CFLAGS = @NM_CFLAGS@ +NM_LIBS = @NM_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build_alias = @build_alias@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +INCLUDES = \ + $(NM_CFLAGS) \ + -DDBUS_API_SUBJECT_TO_CHANGE \ + -DBINDIR=\"$(bindir)\" \ + -DDATADIR=\"$(datadir)\" + + +noinst_PROGRAMS = nmclienttest + +nmclienttest_SOURCES = nmclienttest.c + +nmclienttest_LDADD = $(NM_LIBS) +subdir = test +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = nmclienttest$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_nmclienttest_OBJECTS = nmclienttest.$(OBJEXT) +nmclienttest_OBJECTS = $(am_nmclienttest_OBJECTS) +nmclienttest_DEPENDENCIES = +nmclienttest_LDFLAGS = + +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/nmclienttest.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DIST_SOURCES = $(nmclienttest_SOURCES) +DIST_COMMON = $(srcdir)/Makefile.in Makefile.am +SOURCES = $(nmclienttest_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +nmclienttest$(EXEEXT): $(nmclienttest_OBJECTS) $(nmclienttest_DEPENDENCIES) + @rm -f nmclienttest$(EXEEXT) + $(LINK) $(nmclienttest_LDFLAGS) $(nmclienttest_OBJECTS) $(nmclienttest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nmclienttest.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` +uninstall-info-am: + +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +tags: TAGS + +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; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + 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; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + 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; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: +install: 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstPROGRAMS ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am info \ + info-am install install-am install-data install-data-am \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags uninstall uninstall-am uninstall-info-am + +# 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: diff --git a/test/nmclienttest.c b/test/nmclienttest.c new file mode 100644 index 000000000..d020e7037 --- /dev/null +++ b/test/nmclienttest.c @@ -0,0 +1,435 @@ +#include +#include +#include + + +char * get_active_device (DBusConnection *connection) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + char *device_path; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + "/org/freedesktop/NetworkManager", + "org.freedesktop.NetworkManager", + "getActiveDevice"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return; + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + char *string; + string = dbus_message_iter_get_string (&iter); + if (!string) + { + fprintf (stderr, "NetworkManager returned a NULL active device object path" ); + return; + } + + fprintf (stderr, "Active device: '%s'\n", string ); + + dbus_message_unref (reply); + dbus_message_unref (message); + + device_path = g_strdup (string); + return (device_path); +} + + +void get_device_name (DBusConnection *connection, char *path) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + path, + "org.freedesktop.NetworkManager", + "getName"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return; + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + char *string; + string = dbus_message_iter_get_string (&iter); + if (!string) + { + fprintf (stderr, "NetworkManager returned a NULL active device object path" ); + return; + } + + fprintf (stderr, "Active device name: '%s'\n", string ); + + dbus_message_unref (reply); + dbus_message_unref (message); +} + +void get_device_active_network (DBusConnection *connection, char *path) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + path, + "org.freedesktop.NetworkManager", + "getActiveNetwork"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return; + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + char *string; + string = dbus_message_iter_get_string (&iter); + if (!string) + { + fprintf (stderr, "NetworkManager returned a NULL active device object path" ); + return; + } + + fprintf (stderr, "Active device's Network: '%s' ", string ); + + dbus_message_unref (reply); + dbus_message_unref (message); + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + string, + "org.freedesktop.NetworkManager", + "getName"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return; + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + string = dbus_message_iter_get_string (&iter); + if (!string) + { + fprintf (stderr, "NetworkManager returned a NULL active device object path" ); + return; + } + + fprintf (stderr, " (%s)\n", string ); + + dbus_message_unref (reply); + dbus_message_unref (message); +} + + +int get_device_type (DBusConnection *connection, char *path) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + path, + "org.freedesktop.NetworkManager", + "getType"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return (-1); + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return (-1); + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return (-1); + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + int type; + type = dbus_message_iter_get_int32 (&iter); + + fprintf (stderr, "Active device type: '%d'\n", type ); + + dbus_message_unref (reply); + dbus_message_unref (message); + + return (type); +} + + +void get_device_networks (DBusConnection *connection, const char *path) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + path, + "org.freedesktop.NetworkManager", + "getNetworks"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return; + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + char **networks; + int num_networks; + + if (!dbus_message_iter_get_string_array (&iter, &networks, &num_networks)) + { + fprintf (stderr, "NetworkManager returned no device list" ); + return; + } + + dbus_message_unref (reply); + dbus_message_unref (message); + + int i; + fprintf( stderr, "Networks:\n" ); + for (i = 0; i < num_networks; i++) + { + DBusMessage *message2; + DBusMessage *reply2; + DBusMessageIter iter2; + DBusError error2; + + message2 = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + networks[i], + "org.freedesktop.NetworkManager", + "getName"); + if (message2 == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error2); + reply2 = dbus_connection_send_with_reply_and_block (connection, message2, -1, &error2); + if (dbus_error_is_set (&error2)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error2.name, error2.message); + dbus_message_unref (message2); + return; + } + + if (reply2 == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message2); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply2, &iter2); + const char *string2 = dbus_message_iter_get_string (&iter2); + if (!string2) + { + fprintf (stderr, "NetworkManager returned a NULL active device object path" ); + return; + } + + dbus_message_unref (reply2); + dbus_message_unref (message2); + + fprintf( stderr, " %s (%s)\n", networks[i], string2 ); + } + + dbus_free_string_array (networks); +} + + +void get_devices (DBusConnection *connection) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + "/org/freedesktop/NetworkManager", + "org.freedesktop.NetworkManager", + "getDevices"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_message_unref (message); + return; + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + dbus_message_unref (message); + return; + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + char **devices; + int num_devices; + + if (!dbus_message_iter_get_string_array (&iter, &devices, &num_devices)) + { + fprintf (stderr, "NetworkManager returned no device list" ); + return; + } + + dbus_message_unref (reply); + dbus_message_unref (message); + + int i; + fprintf( stderr, "Devices:\n" ); + for (i = 0; i < num_devices; i++) + fprintf( stderr, " %s\n", devices[i] ); + + dbus_free_string_array (devices); +} + + +int main( int argc, char *argv[] ) +{ + DBusConnection *connection; + DBusError error; + + g_type_init (); + + dbus_error_init (&error); + connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error); + if (connection == NULL) + { + fprintf (stderr, "Error connecting to system bus: %s\n", error.message); + dbus_error_free (&error); + return 1; + } + + char *path; + int type; + + path = get_active_device (connection); + get_device_name (connection, path); + type = get_device_type (connection, path); + if (type == 2) + { + get_device_active_network (connection, path); + get_device_networks (connection, path); + } + + get_devices (connection); + g_free (path); + + return 0; +}